编写你的第一个内核模块 - LKMs 第1部分
1. 内核模块初始化返回值
当内核模块初始化失败时,若返回 -ENOMEM 值,在用户空间该值会返回给 glibc 。 glibc 中有一些“粘合”代码会将此值乘以 -1 ,并将全局整数 errno 设置为该结果。此时, [f]init_module(2) 系统调用将返回 -1 ,表示失败。这是因为 insmod(8) 实际上会调用此系统调用。 errno 将被设置为 ENOMEM ,反映出内核模块插入因内存分配失败而失败。
相反,框架期望初始化函数成功时返回值为 0 。在较旧的内核版本中,成功时未返回 0 会导致内核模块从内核内存中突然卸载。如今,虽然不会卸载内核模块,但内核会发出警告消息,提示返回了可疑的非零值。
2. 清理例程
清理例程不接收参数,也不返回任何值( void )。其作用是在将内核模块从内核内存中卸载之前执行所有必要的清理操作。如果内核模块中不包含 module_exit() 宏,那么除非系统关机或重启,否则将无法卸载该模块。不过,这种阻止卸载的行为只有在将 CONFIG_MODULE_FORCE_UNLOAD 内核配置标志设置为禁用(默认设置)时
超级会员免费看
订阅专栏 解锁全文
1091

被折叠的 条评论
为什么被折叠?



