目前,我正在查看“第三方”驱动程序的代码,试图了解/学习它是如何工作的。我看过像这一个这样的站点,所以我有点理解基本前提是如何工作的,但是我不理解#ifdef MODULE的目的。Google并没有多大帮助,但我认为这个定义指的是内核模块?(我对此也完全陌生。)
module_init(os_driver_init);
#ifdef MODULE
module_exit(os_driver_cleanup);
#endif我的问题是,如果删除#ifdef语句会发生什么?此外,为什么/何时需要包括#ifdef语句?
发布于 2014-10-01 07:26:58
在Linux内核中,大多数驱动程序可以静态地链接(内置)到内核映像本身,也可以作为动态加载模块(.ko文件)构建。
当C文件被编译为模块的一部分时,MODULE宏是为它定义的,而当它被直接构建到内核时,它是未定义的。
您显示的代码仅在将os_driver_cleanup编译为模块时将其定义为模块退出函数。但是,在现代内核代码中,这个构造是不必要的;include/linux/init.h将module_exit()定义为宏,其实现依赖于#ifdef MODULE。
基本上,您应该始终提供一个退出函数,并关闭围绕#ifdef的module_exit()。您还应该使用__exit标记您的退出函数,这将正确地控制您的代码包含在模块化/非模块化的情况下。
下面是一个正确的init/退出代码示例。
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);https://stackoverflow.com/questions/26135737
复制相似问题