为什么此内核模块在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 world\n");

}

module_init(hello_init);

module_exit(hello_exit);

(来自http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0,2)

该模块在2.6.39-02063904-generic(来自Ubuntu PPA)上被标记为[permanent]in

lsmod且无法卸载。但是它在默认的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 world\n");

}

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'

编辑2:

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

编辑3:

更有趣的是,在我自己编译的普通内核中不会发生这种情况-可以很好地加载和卸载模块。

编辑4:

我在VM上安装了Oneiric beta 2版本,并且3.0.0-11内核也没有任何问题。因此,它似乎仅限于Ubuntu Vanilla

PPA内核。解决起来并不会很有趣。

回答:

因此,在与Canonical协商后,我知道问题出在哪里:

Ubuntu主线构建是使用Hardy工具链构建的,而11.04和11.10工具链与构建树外内核模块不兼容。

以上是 为什么此内核模块在2.6.39上标记为永久 的全部内容, 来源链接: utcz.com/qa/404061.html

回到顶部