了解用于制作 .ko 文件的 make 文件

gpu*_*guy 3 drivers 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
Run Code Online (Sandbox Code Playgroud)

例如这里发生的事情:

 `${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
Run Code Online (Sandbox Code Playgroud)

和这里:

obj-m := ofd.o` 
Run Code Online (Sandbox Code Playgroud)

有人可以通过发表更多评论来帮助我理解这一点吗?

我从这个链接中获取了这个。

这个 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@sarika-pugs.com>");
MODULE_DESCRIPTION("Our First Driver");
Run Code Online (Sandbox Code Playgroud)

Lei*_*iaz 7

正如 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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

您可以在内核文档中找到更多信息。