工場カーネル(5.10.110)で使用するARMベースのボードがあります。
カーネルモジュールを手動でビルドするには、カーネルヘッダパッケージが必要です。このパッケージをインストールするには、次を参照してください。文書:
sudo dpkg -i /opt/linux-headers-*.deb
これにより、次のような構造が作成されます。
/lib/modules/5.10.110$ ls -la
total 1584
drwxr-xr-x 1 root root 4096 Apr 29 15:13 .
drwxr-xr-x 1 root root 4096 Jul 10 21:36 ..
lrwxrwxrwx 1 root root 31 Feb 20 07:05 build -> /usr/src/linux-headers-5.10.110
drwxr-xr-x 2 root root 4096 Feb 20 13:29 extra
drwxr-xr-x 1 root root 4096 Feb 20 13:29 kernel
-rw-r--r-- 1 root root 327270 Apr 29 15:13 modules.alias
-rw-r--r-- 1 root root 346627 Apr 29 15:13 modules.alias.bin
-rw-r--r-- 1 root root 28645 Feb 20 13:29 modules.builtin
-rw-r--r-- 1 root root 0 Apr 29 15:13 modules.builtin.alias.bin
-rw-r--r-- 1 root root 30656 Apr 29 15:13 modules.builtin.bin
-rw-r--r-- 1 root root 164216 Feb 20 13:29 modules.builtin.modinfo
-rw-r--r-- 1 root root 95077 Apr 29 15:13 modules.dep
-rw-r--r-- 1 root root 153551 Apr 29 15:13 modules.dep.bin
-rw-r--r-- 1 root root 140 Apr 29 15:13 modules.devname
-rw-r--r-- 1 root root 51432 Feb 20 13:29 modules.order
-rw-r--r-- 1 root root 468 Apr 29 15:13 modules.softdep
-rw-r--r-- 1 root root 163120 Apr 29 15:13 modules.symbols
-rw-r--r-- 1 root root 206275 Apr 29 15:13 modules.symbols.bin
カーネル全体を再コンパイルして、バージョンを5.10.110から5.10.110に増やす必要があります。5.10.160。
カーネルモジュールをコンパイルしようとすると、必要なヘッダが見つかりません。
5.10.110のBuildフォルダには、次のファイルが含まれています。
/lib/modules/5.10.110/build$ ls -la
total 1364
drwxr-xr-x 5 root root 4096 Apr 29 15:03 .
drwxr-xr-x 1 root root 4096 Jul 10 22:35 ..
-rw-r--r-- 1 root root 220133 Feb 20 07:05 .config
-rw-r--r-- 1 root root 68886 Dec 1 2022 Makefile
-rw-r--r-- 1 root root 1075160 Feb 20 07:02 Module.symvers
drwxr-xr-x 3 root root 4096 Apr 29 15:03 arch
drwxr-xr-x 31 root root 4096 Apr 29 15:03 include
drwxr-xr-x 17 root root 12288 Apr 29 15:03 scripts
バージョン5.10.160の新しいカーネル用のカスタムカーネルモジュールを構築するために、これらのヘッダーをどのように再生成できますか?
いろいろ試してみました。カーネルがクロスコンパイルされたシステムからこれらのフォルダをコピーすることは機能しません。これは、 "scripts"フォルダにaarch64(x86_64)で実行されていないシステムコードが含まれているためです。
それから私は5.10.110の "scripts"フォルダをコピーしましたが、これがうまくいくか、害があるのか、望ましくない結果になるのかわかりません。
それでは、カスタムカーネルモジュールを構築するために環境をクロスコンパイルする方法は?
答え1
工場カーネル(5.10.110)で使用するARMベースのボードがあります。
カーネルモジュールを手動でビルドするには、カーネルヘッダパッケージが必要です。
ARMベースのボードがありますが、おそらくIntelベースのPCホストを使用してクロスコンパイラ/ツールチェーンを介してこのモジュールを構築しています。コマンドdpkg
は、PCホストにインストールされているLinuxディストリビューション用のヘッダーを取得してインストールします。ただし、ARMベースのマザーボードで使用されるカーネルバージョンのヘッダーが必要です。
まず、特定のカーネルバージョン5.10.110のtarballをダウンロードする必要があります。これがLinuxカーネルのメインラインバージョンなのか、それともチップやボードメーカーが修正したバージョンなのかを無視しているのです。
Linuxカーネルのメインラインバージョンのソースコードは、以下から入手できます。Linuxカーネルのアーカイブ。メインラインバージョン5.10.110のタールボールは次のとおりです。ここ(gzip圧縮)。
とにかく適切なソースコードを入手またはダウンロードしてください。
PC展開のインストールとはまったく別に、このソースツリーを解凍してインストールします。次の開発ディレクトリを使用することをお勧めします/家クロスコンパイル操作のため。
サブディレクトリに必要なバージョンのカーネルソースコードがある場合は、make headers_install
シェルのコマンドを使用してカーネルのヘッダファイルをエクスポートできます。
引用するこのガイド:
Exporting kernel headers for use by userspace
=============================================
The "make headers_install" command exports the kernel's header files in a
form suitable for use by userspace programs.
...
The "make headers_install" command can be run in the top level directory of the
kernel source code (or using a standard out-of-tree build). It takes two
optional arguments:
make headers_install ARCH=i386 INSTALL_HDR_PATH=/usr
もう一度お話しますが、クロスコンパイルのためにホストシステムとは別に、これらのヘッダーを以下の開発ディレクトリのように、よりローカルな場所にインストールすることをお勧めします。/家(つまり、上記の例を盲目的に使用しないでください)。