web-dev-qa-db-ja.com

Linuxカーネル外部モジュールのビルドプロセスに関するいくつかの質問

外部モジュールを構築するためのLinuxカーネルのドキュメントページ( https://www.kernel.org/doc/Documentation/kbuild/modules.txt )は次のように述べています。

=== 2。外部モジュールを構築する方法

外部モジュールをビルドするには、ビルドで使用される構成ファイルとヘッダーファイルを含むビルド済みのカーネルが利用可能である必要があります。また、カーネルはモジュールを有効にして構築されている必要があります。ディストリビューションカーネルを使用している場合は、ディストリビューションによって提供される、実行しているカーネルのパッケージがあります。

別の方法は、「make」ターゲット「modules_prepare」を使用することです。これにより、カーネルに必要な情報が含まれていることを確認できます。ターゲットは、外部モジュールを構築するためのカーネルソースツリーを準備する簡単な方法としてのみ存在します。

私の質問は次のとおりです。

  1. 外部モジュールをビルドするには、ビルド済みのカーネルが必要ビルドで使用される構成ファイルとヘッダーファイルを含むものが利用可能です

「ビルド済みカーネル」とは、コンパイルされたバイナリイメージ(一般にvmlinux/vmlinuzという名前)を意味しますか?なぜバイナリイメージが正確に必要なのですか?構成ファイル、ヘッダーファイル、コンパイラで十分ではありませんか?

  1. 外部モジュールをビルドするには、ビルド済みのカーネルを使用できる必要があります構成ファイルとヘッダーファイルを含むビルドで使用されます。

ビルド済みのカーネルでバイナリイメージを意味する場合、「構成ファイルとヘッダーファイルを含む」の意味は何ですか? 「構成ファイルとヘッダーファイルを含める」必要があるソースツリーは理解できますが、バイナリの場合、これらのファイルは命令を生成するために使用されますか?では、「含む」の意味は何ですか? 「ビルド済みカーネル」とは、カーネルがビルドされたソースツリー全体を意味しますか?

  1. また、カーネルはモジュールを有効にしてビルドである必要があります。

彼らはここで「モジュールを作る」ステップを参照していますか、それとも何か違うのですか?

  1. ディストリビューションカーネルを使用している場合、パッケージがありますディストリビューションによって提供されている実行中のカーネル用です。

ここでは、カーネル構築プロセスで使用されたヘッダーファイルと構成ファイルを提供するkernel-develパッケージを参照していると思います。あれは正しいですか?

  1. 別の方法は、「make」ターゲット「modules_prepare」を使用することです。これにより、カーネルに必要な情報が含まれていることを確認できます。

これはどういう意味ですか?これは、ソースディレクトリで「makemodules_prepare」を実行した場合に外部モジュールをビルドできるようにするために、ビルドされたカーネルバイナリを用意する必要がないことを意味しますか?

3
Lavya

ad 1.および2.カーネルイメージはvmlinuxと呼ばれます、そうですが、外部モジュールを構築するときに実際に必要なものではありません。必要なのは、このカーネルの構成ファイルとヘッダーファイルです。

ad 3.内部または外部のモジュールを構築するには、このカーネルでロード可能なモジュールのサポートが必要です。もちろん、モジュールを構築する必要があるため、カーネルは__modulesenabled_で構成する必要があります。

カーネルは、カーネルソースツリーまたは.configパスで、ツリー外ビルド用に$KBUILD_OUTPUTファイルを作成するのに役立つ構成プログラムの1つによって構成されます。

ad 4.そのようなパッケージを見つける場所や名前の付け方はディストリビューションによって異なりますが、しばしばkernel-develと呼ばれると思います。 自分のカーネルツリーを何年も使用した原因は実際にはわかりません。

ad 5.はい、外部モジュールをコンパイルするために実際にはカーネルバイナリは必要ありませんが、以下の注記を抑制しました

注:「modules_prepare」は、CONFIG_MODVERSIONSが設定されている場合でも、Module.symversをビルドしません。したがって、モジュールのバージョン管理を機能させるには、完全なカーネルビルドを実行する必要があります。

ほとんどのカーネルはCONFIG_MODVERSIONSを使用していると思います。これは、.configファイルで次のように確認できます。

$ grep MODVERSIONS .config
CONFIG_MODVERSIONS=y

つまり、ビルドしたモジュールは、ビルドしたカーネルのバージョンと構成でのみ機能します。

したがって、そのカーネルとカーネルバージョンのモジュールを作成することはできますが、そのカーネルとカーネルバージョンがないと実行できません。

そのため、完全なカーネルソースツリーがなくても、ディストリビューションカーネルの外部モジュールを構築できます。カーネル構成ファイルとヘッダーファイルをインストールすると、そのディストリビューションカーネルが構築されます。

実際、ほとんどの場合、システムを実行するカーネルの外部モジュールを構築したいだけです。カーネルソースツリーからカーネルを自分で構築した場合は、そのカーネルに一致するカーネル構成ファイルとヘッダーファイルが既に存在します。

ディストリビューションカーネルを実行する場合は、ディストリビューションからそのファイルをインストールする必要があります。

3
ikrabbe