linux – 为什么这个内核模块在2.6.39上被标记为永久

linux – 为什么这个内核模块在2.6.39上被标记为永久,第1张

概述加载此模块时: #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;}stati 加载此模块时:
#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)

该模块在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 world\n");}module_init(hello_init);module_exit(hello_exit);

构建输出:

make -C /lib/modules/2.6.39-02063904-generic/build M=/home/douglas/kernelmod modulesmake[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.komake[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工具链与构建树外核心模块是不兼容的.

总结

以上是内存溢出为你收集整理的linux – 为什么这个内核模块在2.6.39上被标记为永久全部内容,希望文章能够帮你解决linux – 为什么这个内核模块在2.6.39上被标记为永久所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存