私はこの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つの部分で構成されています。二度読むことになるからだ。まず、コマンドラインで 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がファイルを読み取るためです。 makeを呼び出し、オプションで-C
ディレクトリをカーネルソースがある場所に変更する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
詳細は以下で確認できます。カーネル文書。