Linuxカーネルモジュール用に構築

Linuxカーネルモジュール用に構築

最近、「Linux Kernel Module プログラミングガイド」という本を使ってカーネルモジュールのプログラミングを学び始めましたが、これがどのように機能するのか理解していません。

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

私はmakefileの基本を理解していますが、これは複雑に見えます。少なくとも make clean be rm hello-1.ko?

答え1

以下は、このmakefileで何が起こっているのかを詳しく説明します。
どこかにオブジェクトのリストがあり、「hello-1.o」がリストに追加されます。

obj-m += hello-1.o

要件なしでallというターゲットを作成します。これを行うには、システムが実行されている現在のカーネルバージョンの名前を付けたディレクトリのビルドディレクトリ(/libの下のモジュールディレクトリにあります)に変更することです。変数を保存すると、変数には make という現在の作業ディレクトリが含まれます。ここで、変更したばかりのディレクトリで make ファイルを見つけて、ターゲットモジュールをビルドします。

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回以上ある理由rmは、カーネルにすべて一緒に動作する別の部分がたくさんあるからです。モノリシックなメイクファイルを書くのはせいぜい痛いですが、実際には維持するのは難しいです。したがって、ビルドディレクトリの各論理部分には、調整makefileから呼び出すことができる独自のmakefileがあります。 Makefileは非常に面倒なので、集中してメンテナンスできるようにするのが最善です。

関連情報