首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >`#ifdef MODULE`的目的是围绕module_exit()?

`#ifdef MODULE`的目的是围绕module_exit()?
EN

Stack Overflow用户
提问于 2014-10-01 06:57:20
回答 1查看 1.7K关注 0票数 6

目前,我正在查看“第三方”驱动程序的代码,试图了解/学习它是如何工作的。我看过像这一个这样的站点,所以我有点理解基本前提是如何工作的,但是我不理解#ifdef MODULE的目的。Google并没有多大帮助,但我认为这个定义指的是内核模块?(我对此也完全陌生。)

代码语言:javascript
运行
复制
module_init(os_driver_init);
#ifdef MODULE
module_exit(os_driver_cleanup);
#endif

我的问题是,如果删除#ifdef语句会发生什么?此外,为什么/何时需要包括#ifdef语句?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 07:26:58

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

当C文件被编译为模块的一部分时,MODULE宏是为它定义的,而当它被直接构建到内核时,它是未定义的。

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

基本上,您应该始终提供一个退出函数,并关闭围绕#ifdefmodule_exit()。您还应该使用__exit标记您的退出函数,这将正确地控制您的代码包含在模块化/非模块化的情况下。

下面是一个正确的init/退出代码示例。

代码语言:javascript
运行
复制
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);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26135737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档