在module_exit()周围的#ifdef MODULE`的目的是什么?

时间:2014-10-01 06:57:21

标签: c linux linux-kernel linux-device-driver kernel-module

我目前正在查看"第三方代码"司机试图找出/了解它的运作方式。我已经查看了this one这样的网站,所以我理解基本前提是如何运作的,但我不明白#ifdef MODULE这里的目的。谷歌并没有多大帮助,但我认为定义是指内核模块? (我对此也是全新的。)

module_init(os_driver_init);
#ifdef MODULE
module_exit(os_driver_cleanup);
#endif

我的问题是,如果删除#ifdef声明会怎样?此外,为什么/何时需要包含#ifdef声明?

1 个答案:

答案 0 :(得分:6)

在Linux内核中,大多数驱动程序可以静态链接(内置)到内核映像本身,也可以构建为动态加载的模块(.ko文件)。

{C}文件在被编译为模块的一部分时被定义为MODULE宏,并且在将文件直接构建到内核时未定义。

您正在显示的代码仅在将os_driver_cleanup编译为模块时将其定义为模块 - 退出函数。但是,这种结构在现代内核代码中是不必要的。 include/linux/init.hmodule_exit()定义为宏,其实现取决于#ifdef MODULE

基本上,您应始终提供退出功能,并在#ifdef左右module_exit()。您还应该使用__exit标记退出功能,这将正确控制您在模块化/非模块化案例中包含的代码。

以下是正确的初始/退出代码示例。

static int  __init foo_init(void)
{
    /* Register driver, etc. */
}

static void __exit foo_cleanup(void)
{
    /* Unregister driver, etc. */
}

module_init(foo_init);
module_exit(foo_cleanup);