.ko ファイルを作成するための make ファイルを理解する

.ko ファイルを作成するための make ファイルを理解する

この make ファイルの目的はわかっています。これはドライバーの Makefile であり、カーネル ソースからカーネルのビルド システムを呼び出すものです。しかし、正確に何が起こっているのか理解できません。

# Makefile – makefile of our first driver

# if KERNELRELEASE is not defined, we've been called directly from the command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean

# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
    obj-m := ofd.o
endif

たとえば、ここで何が起こっているか:

 `${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

そしてここ:

obj-m := ofd.o` 

誰か、もう少しコメントを書いて、これを理解するのを手伝ってくれませんか?

私はこれをここから取ったリンク

この make ファイルには関連する .c ファイル (ドライバー) があります。

/* ofd.c – Our First Driver code */

#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");

    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <[email protected]>");
MODULE_DESCRIPTION("Our First Driver");

答え1

Makefile のコメントで説明されているように、この Makefile には 2 つの部分があります。これは、この Makefile が 2 回読み込まれるためです。最初はコマンド ラインで make を呼び出すとき、次に kbuild によって読み込まれます。

# if KERNELRELEASE is not defined, we've been called directly from the     command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean

が定義されていない場合はKERNELRELEASE、ファイルが make によって読み取られるためです。-Cカーネル ソースがあるディレクトリに変更するオプションを使用して make を呼び出す Makefile があります。

次に、Make はそこ (カーネル ソース ディレクトリ内) の Makefile を読み取ります。 はモジュールSUBDIRSソース コードがある場所です (SUBDIRSは非推奨で、M代わりに が使用されるようになったと思います)。

カーネル ビルド システムは、モジュールのディレクトリ内の Makefile を検索して、何をビルドするかを判断します。KERNELRELEASEが設定されるので、その部分が使用されます。

# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
    obj-m := ofd.o
endif

詳細は以下をご覧くださいカーネルドキュメント

関連情報