こんにちは世界生成ファイル

こんにちは世界生成ファイル

カーネルモジュールのプログラミングを始めたいのですが理解できないので、以下に提供されている簡単な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つの目標(allclean)があります。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、およびより読みやすさがはるかに低下します。allcleaninstall

hello−1.o最初の行はavailableに文字列を追加しますobj−m。この変数は以前に空であったため(外部環境変数で設定しなかった場合)、その値に設定するだけです。ただし、値はexport編集されないため、ローカルでのみ表示できます。したがって、子プロセスには影響しません(参照:このリンク)。


1つの追加:私は間違っていました。obj-m効果はありません。Makefileカーネルからもう一度読んでください。Makefileで始まる変数を検索しますobj-。その後、必要なオブジェクトファイルをコンパイルするために使用されます。源泉:https://stackoverflow.com/a/21140538/882756

関連情報