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

jan*_*eia 6 c linux kernel-module linux-device-driver linux-kernel

我目前正在查看"第三方"驱动程序的代码,试图找出/了解它的功能.我看了一下网站,如这一个,所以我有点了解的基本前提是如何工作的,但我不明白的目的#ifdef MODULE在这里.谷歌没有太多帮助,但我认为定义是指内核模块?(我也是全新的.)

module_init(os_driver_init);
#ifdef MODULE
module_exit(os_driver_cleanup);
#endif
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*art 6

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

的MODULE宏一个C文件中定义的,当它被编译为一个模块的一部分,并且当它被直接内置到内核未定义的.

您正在显示的代码仅os_driver_cleanup在将其编译为模块时定义为模块 - 退出函数.但是,这种结构在现代内核代码中是不必要的. include/linux/init.h定义module_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);
Run Code Online (Sandbox Code Playgroud)