カーネルモジュールのプログラミングを始めたいのですが理解できないので、以下に提供されている簡単なmakefileを説明できる人はいますか?
obj−m += hello−1.o
all:
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
clean:
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) clean
答え1
実際には2つの目標(all
とclean
)があります。make all
コンソールまたはフォルダにあるときに呼び出すことができますmake clean
。最初のターゲットは常にデフォルトのターゲットです(make
結果はmake all
)。
インデントレシピ指摘された。これはmakeがターゲットを構築するために実行するコードです。だから呼ぶと呼ぶことmake
になる
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
もちろん、シェルはuname
コマンドとM
環境変数を拡張します。次に、make
指定されたフォルダ()/lib/modules/$(shell uname −r)/build
の宛先を使用して呼び出しますmodules
。このターゲット(子プロセス)の役割は、明らかにこのファイルに割り当てられていません。これは/lib/modules/$(shell uname −r)/build
別のMakefile
定義された目標があることを意味しますmodules
。上記のコマンドはmodules
にあります/lib/modules/$(shell uname −r)/build/Makefile
。
目標も同じですclean
。これによりclean
、ターゲットが指定されたフォルダにあるサブプロセスが作成されます。
この2つの目標の背後にあるアイデアは、2つの異なる特性を持つことです。最初の(all
)は何か(おそらくモジュール)を構築することです。別の方法は、clean
コンパイルが間違ってソース以外のファイルを削除したい場合に備えて、作業内容をクリーンアップすることです。しかし、目標に対するこれらの解釈は名目上にすぎません。実装によって異なります。必要に応じて名前をt1
、、、t2
で指定できます。しかしt3
、およびより読みやすさがはるかに低下します。all
clean
install
hello−1.o
最初の行はavailableに文字列を追加しますobj−m
。この変数は以前に空であったため(外部環境変数で設定しなかった場合)、その値に設定するだけです。ただし、値はexport
編集されないため、ローカルでのみ表示できます。したがって、子プロセスには影響しません(参照:このリンク)。
1つの追加:私は間違っていました。obj-m
効果はありません。Makefile
カーネルからもう一度読んでください。Makefile
で始まる変数を検索しますobj-
。その後、必要なオブジェクトファイルをコンパイルするために使用されます。源泉:https://stackoverflow.com/a/21140538/882756