了解用於製作 .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 有兩個部分。那是因為它會被讀兩次。首先在命令列上呼叫 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讀取的。您有一個 Makefile,它呼叫 make,並可以-C選擇將目錄變更為核心原始碼所在的位置。

然後 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

您可以在以下位置找到更多信息內核文件

相關內容