linux – 为什么这个内核模块在2.6.39上被标记为永久
|
加载此模块时: #include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk("<1> Hello world!n");
return 0;
}
static void hello_exit(void) {
printk("<1> Bye,cruel worldn");
}
module_init(hello_init);
module_exit(hello_exit);
(从http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0,2) 该模块在lsmod中被标记为[永久],不能卸载,在2.6.39-02063904-generic(从Ubuntu PPA).但它在默认的2.6.38内核上工作正常. (在Ubuntu 11.04 x86上). 2.6.39发生了什么变化?我的代码需要改变什么? 当我遇到这个问题时,我试图分离一个更复杂的问题. 编辑: 根据答案的建议,我编辑了添加__init和__exit(hello3.c)的代码: #include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void) {
printk("<1> Hello world!n");
return 0;
}
static void __exit hello_exit(void) {
printk("<1> Bye,cruel worldn");
}
module_init(hello_init);
module_exit(hello_exit);
构建输出: make -C /lib/modules/2.6.39-02063904-generic/build M=/home/douglas/kernelmod modules make[1]: Entering directory `/usr/src/linux-headers-2.6.39-02063904-generic' Building with KERNELRELEASE = 2.6.39-02063904-generic CC [M] /home/douglas/kernelmod/hello3.o Building modules,stage 2. Building with KERNELRELEASE = 2.6.39-02063904-generic MODPOST 8 modules CC /home/douglas/kernelmod/hello3.mod.o LD [M] /home/douglas/kernelmod/hello3.ko make[1]: Leaving directory `/usr/src/linux-headers-2.6.39-02063904-generic' EDIT2: hello3.mod.c: #include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic,VERMAGIC_STRING);
struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,.init = init_module,#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,#endif
.arch = MODULE_ARCH_INIT,};
static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
{ 0xbe4b3e92,"module_layout" },{ 0xb4390f9a,"mcount" },{ 0x5e3b3ab4,"printk" },};
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
MODULE_INFO(srcversion,"D2A869459874C22AB265981");
也 # grep CONFIG_MODULE_UNLOAD /boot/config-2.6.39-02063904-generic CONFIG_MODULE_UNLOAD=y EDIT3: 更有趣的是,我自己编译的香草内核不会发生这种情况 EDIT4: 我在虚拟机上安装了Oneiric beta 2内核,而3.0.0-11内核也没有任何问题.所以它似乎局限于Ubuntu香草PPA内核.这不是很有趣的解决. 解决方法所以在咨询Canonical之后,我知道问题是什么:Ubuntu mainline builds是用Hardy工具链构建的,11.04和11.10工具链与构建树外核心模块是不兼容的. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
