このモジュールをロードすると:
#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]
から) としてマークされ、lsmod
アンロードできません。しかし、デフォルトの 2.6.38 カーネルでは問題なく動作します。(どちらも Ubuntu 11.04 x86 で)。
2.6.39 で何が変更されましたか? コードで何を変更する必要がありますか?
この問題に遭遇したとき、私はより複雑な問題を切り分けようとしていました。
編集:
回答からの提案に従って、コードを編集して(hello3.c)を追加__init
しました。__exit
#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'
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 ベータ 2 ビルドを VM にインストールしましたが、その 3.0.0-11 カーネルにも問題はありません。そのため、Ubuntu Vanilla PPA カーネルに限定されているようです。それを解決するのはあまり楽しいことではありません。