我目前正在查看"第三方代码"司机试图找出/了解它的运作方式。我已经查看了this one这样的网站,所以我理解基本前提是如何运作的,但我不明白#ifdef MODULE
这里的目的。谷歌并没有多大帮助,但我认为定义是指内核模块? (我对此也是全新的。)
module_init(os_driver_init);
#ifdef MODULE
module_exit(os_driver_cleanup);
#endif
我的问题是,如果删除#ifdef
声明会怎样?此外,为什么/何时需要包含#ifdef
声明?
答案 0 :(得分:6)
在Linux内核中,大多数驱动程序可以静态链接(内置)到内核映像本身,也可以构建为动态加载的模块(.ko
文件)。
{C}文件在被编译为模块的一部分时被定义为MODULE
宏,并且在将文件直接构建到内核时未定义。
您正在显示的代码仅在将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);