目的:
カーネルにおける役割のMakefileの分析
Makefileの役割の概要:
1)コンパイルするファイルを決定?
2)どのようにこれらの文書をコンパイルするには?
3)どのようにこれらの文書を接続するために、最も重要なことは、彼らが注文する方法ですか?
1、LinuxカーネルのMakefileシステム
トップのMakefile |
メイクファイルのコアので、プラットフォームに応じて、すべてのターゲットの分類の種類とは、ターゲットを生成するために、適切なMakefileのルールを呼び出します |
.config |
カーネルを設定する設定ファイルは、生成されます。すべての.configを使用するファイルを決定するのMakefileに基づいています |
アーチ/ $(ARCH)/ Makefileの |
Makefileの、生成コアに関与しているアーキテクチャに関連するプラットフォーム固有のドキュメントの関連する決定 |
スクリプト/ Makefileの。* |
すべてKbuildのMakefileのための一般的なルールファイル |
各サブディレクトリのMakefileファイル |
Makefileはその親ディレクトリを呼び出して、上から下に渡され、その命令を実行します |
Makefileの三の大行動に基づいて文書のこれら5種類の分析。
(1)コンパイルしたファイルを決めます
Linuxのカーネルは、トップレベルからのMakefileが起動し、再帰的に3つのステップに分け、それぞれのMakefileを呼び出して、サブディレクトリのすべてのレベルを入力してコンパイルされています。
A、トップレベルのMakefileはサブディレクトリカーネルディレクトリがカーネルにコンパイルされるかを決定します
B、アーチ/ $(ARCH)/ Makefileのディレクトリ内のファイルを決定、カーネルへのディレクトリ
C、Makefileのディレクトリの下に決定サブディレクトリのすべてのレベルでその中のサブディレクトリのMakefileにそれらを呼び出すために続けてコンパイルされたモジュール(すなわちドライバ)ファイル、カーネル、ファイルに。
ルックステップAは、トップのMakefileで見ることができます。
#私たちはのvmlinuxにリンクされますオブジェクト/ サブディレクトリには、私たちが訪問する必要が INIT -y = INIT / ドライバは -y =ドライバ/音声/ ネット -y =ネット/ LIBS -y = LIB / コア -y = USR /
......
コア- Y + =カーネル/ MM / FS / IPC /セキュリティ/暗号/ブロック/
理解し、トップのMakefileカーネルディレクトリには、5つのカテゴリーに分け
INIT-Y:ドライバー-Y:ネット-Y:LIBS-Y:コア-Y
(アーチディレクトリがアーチでカーネルに含まれます/ $(ARCH)/ Makefileの中)
次のようにあなたは、MakefileのARCH最上位ディレクトリに変数を変更することができます
// 変更前 ARCH?= $(Subarch) ARCH ?=? // 変更 ARCH?= ARM CROSS_COMPILE ?=アーム-linux-
ステップBのため、アーチ/ $(ARCH)/ Makefileの例としてARMシステムは、アーチ/アーム内/ Makefileは見ることができます。
...... コア -y + =アーチ/アーム/カーネル/アーチ/アーム/ MM /アーチ/アーム/共通/ コア -y + = $(MACHINE) ... コア - $(CONFIG_ARCH_S3C2410)+ =アーチ/アーム/マッハS3C2440 / コア - $(CONFIG_ARCH_S3C2410)+ =アーチ/アーム/マッハs3c2442 / ... コア - $(CONFIG_FPE_NWFPE)+アーチ/アーム/ NWFP / コア - $(CONFIG_FPE_FASTFPE)+ = $(FASTFPE_OBJ) コア - $(CONFIG_VFP)+ =アーチ/ / VFP /アーム ......
表示されるヘッド-Yが、それは、直接ファイル名に基づいています。メイクファイルはコア-Yの内容がさらにMakefileで展開された見ることができ、そこに別のクラスとなっています。
#DEFAULT値
ヘッド -y:=アーチ/腕/カーネル/ヘッド$(MMUEXT).oのアーチ/腕/カーネル/ init_task.o
ドライバ-Y::ネット-Y:LIBS-Y:カーネルをコンパイルすると、それがINIT-Yに変わりますそれぞれのMakefileのパフォーマンスに記載されているディレクトリコア-Y、各サブディレクトリには、最終的には、ビルドin.oを生成します。ファイル先頭-yがこれらのビルドin.oと接続された印象のカーネルファイルのvmlinuxを表します。
最後に、ステップCに行ってどのように見てみましょう:
「:ステップ3の役割サブディレクトリのMakefileにそれらを呼び出すために続けてコンパイルされたモジュール(すなわちドライバ)、ファイル、カーネル、ファイルへのディレクトリの下に決定サブディレクトリのすべてのレベルでのMakefile "」。
カーネルの設定の.configが発生した場合、次のステートメントは、トップレベルのMakefileを間接的に後に.configをコンパイル(で定義された変数に応じてファイルが実際の.configの等価物を含んでいるの.configファイルを含むであろうオート、CONF)
#読むにおける設定 -include含める/設定/ auto.conf
次のようにauto.confを読み取ります。
#自動的に生成されたメイクの設定:ドン" トンの編集 #Linuxカーネルバージョン:2.6。22.6 #水年02月19 07:48:42 2020 CONFIG_CPU_S3C244X = Y CONFIG_CPU_COPY_V4WB = Y CONFIG_DEBUG_USER = Y CONFIG_FLATMEM = Y ...
これらの変数の値は、2つの主要なタイプ、「Y」、「M」です。サブディレクトリのすべてのレベルは、サブディレクトリをコンパイルすることを決定した入力を続けてモジュールを、コンパイルされたファイルのカーネル、ファイルにコンパイルするかを決定するために、これらの変数を使用してメイクファイル。具体的には以下の方法で測定:
1)OBJ-Yはカーネルにどのファイルを決定するために使用されます
モジュール定義ファイルがロード可能なコンパイルされた2)OBJ-M
3)LIB-yがコンパイルされたライブラリをどのファイルに定義するために使用されます
4)OBJ-Y、OBJ-mは下に入力するディレクトリを指定するためにも使用することができます
どのようにこれらのファイルを構築する(2)。
コンパイラオプション、どのような接続オプションをはいています。これらのオプションは、次の3つのカテゴリに分類されます;局所(Makefileの一つだけのファイル);(南シナ海ツリー全体のための)グローバル(ファイルのみ)個々
グローバルオプション/トップレベルのMakefileで定義され、アーチ/ $各サブディレクトリ内(ARCH)のMakefile、ローカルオプションのMakefile。
これらの文書を接続する方法(3)、そしてどのように彼らのために
以前のファイルは、そのトップレベルのMakefileを知って、カーネルにコンパイルされ、分析およびアーチ/ $(ARCH)で/ Makefileは6つのclassesディレクトリ(またはファイル)を定義しています。
ヘッド-Y、INIT-Y、ドライバ-Y、ネットY、LIBS-Y、コア-Y。次のようにARMアーキテクチャでは、例えば、彼らの初期値は次のとおりです。
アーチ/腕/ Makefileの:
ヘッドY:=アーチ/アーム/カーネル/ヘッド$(MMUEXT)の.oアーチ/アーム/カーネル/ init_task.o コア -y + =アーチ/アーム/カーネル/アーチ/アーム/ MM /アーチ/アーム/共通/ コア -y + = $(MACHINE) ... コア - $(CONFIG_ARCH_S3C2410)+ =アーチ/アーム/マッハS3C2440 / コア - $(CONFIG_ARCH_S3C2410)+ =アーチ/アーム/マッハs3c2442 / ... LIBS -y:=アーチ/腕/ libに/ $(LIBS-Y)
トップレベルのMakefileには:
443から556行
INIT-Y:= INIT / ドライバは -y =ドライバ/音声/ ネット -y =ネット/ LIBS -y = LIB / コア -y = USR / ...... コア -y + =カーネル/ MM / FS / IPC /セキュリティ/暗号化/ブロック/
見ると、頭-Yのほかに、INIT-Y、ドライバ-Yの残りの部分は、すべてのディレクトリ名です。トップのMakefileには、直接これらのディレクトリ名プラスまたはビルドin.oのlib.aの後ろに、次のようにカーネルファイルにリンクされるように言いました:
567 - 573ライン矢印式に相当する 初期化(patsubstの%/、%/内蔵= $:-Y での.o、$(INIT- 、Y))---> INIT /ビルドin.o コア -y:= $(patsubst%/、%/内蔵での.o、$(コア- Y))--->コア/ビルドin.o ドライバは -y:= $(patsubst%で/、%/内蔵での.o、$(drivers- Y)) - > drievrs /ビルドin.o ネット -y:(patsubst%/、%/内蔵= $ での.o、$(NET- Y)) LIBS -y1:= $(patsubst%/、%/ lib.a、$(libs- Y)) LIBS -Y2:= $(patsubst%/、%/内蔵での.o、$(libs- Y)) LIBS -y:= $(LIBS-Y1)$(LIBS-Y2)
トップレベルのMakefileで、その後、見下ろします:
602から605行
のvmlinux-INIT:= $(ヘッドY)$(INIT- Y) vmlinux -main:= $(コア-Y)$(LIBS-Y)$(ドライバ-Y)$(NET- Y) vmlinux -all:= $(のvmlinux-INIT)$(vmlinux- メイン) vmlinux -lds:=アーチ/ $(ARCH)/カーネル/ vmlinux.lds 輸出KBUILD_VMLINUX_OBJS: = $(のvmlinux-すべて)
vmlinux-すべての手段その次のようポスト同等に、印象のカーネルファイルのvmlinuxを構成するすべてのオブジェクト:
vmlinux-すべて:= $(ヘッド-Y)$(INIT-Y)$(コア-Y)$(LIBS-Y)$(ドライバ-Y)$(ネット-Y)
INIT-Yおよび対応のinit /ビルドin.oファイルが生成されます、他のドキュメント上でこれらの公知文献には、カーネルにコンパイルされます。
vmlinux-LDS接続スクリプトを示します。トップMakefileは、カーネルイメージファイルを構築するために、このリンカスクリプトに応じて、特定の順序でファイルを整理します。
vmlinux # ^ # | # + - <$(vmlinux- INIT) # | + -の<init / version.o + より # | # + - <$(vmlinux- メイン) # | + - <ドライバ/内蔵での.o MM /内蔵での.o + より # | # + - <kallsyms.o(説明を参照に CONFIG_KALLSYMS部)
参考:
「Linuxアプリケーションの開発、完全マニュアル」 - 魏東山
https://www.cnblogs.com/lifexy/p/7348534.html