当前位置: 首页 > 面试题库 >

为什么此内核模块在2.6.39上标记为永久

虞裕
2023-03-14
问题内容

当我加载该模块时:

#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工具链与构建树外内核模块不兼容。



 类似资料:
  • 下面的代码拆分数据,应用正则表达式,然后再次连接字符串(有一部分删除了单词之间的新行,因为我希望在单个块/行中输出段落): 输入: Lorem ipsum dolor坐在一起 Ipsum dolor sit amet,consetetur eirmod tempor invidunt ut laboure 代码: 我认为输入将是: 但不是,而是: 原因可能是什么?

  • 内核模块 对于模块而言,引导选项只能用于直接编译到核心中的模块,格式是"模块名.选项=值",比如"usbcore.blinkenlights=1"。 动态加载的模块则可以在 modprobe 命令行上指定相应的选项值,比如"modprobe usbcore blinkenlights=1"。 可以使用"modinfo -p ${modulename}"命令显示可加载模块的所有可用选项。已经加载到内

  • 问题内容: 我在x86 CentOS 6.3(内核v2.6.32)系统上运行。 我将以下功能编译为准字符驱动程序模块,以进行实验,以了解Linux内核如何对浮点运算作出反应。 代码已编译(没想到),因此我插入了模块,并使用来检查日志。日志显示:。 这似乎很奇怪;我以为您不能在Linux内核中执行浮点运算-保存一些异常,例如。模块如何执行浮点运算? 这是因为我在x86处理器上吗? 问题答案: 我以为

  • 问题内容: 我正在研究THREE.js,并注意到其中定义函数的模式如下: 这种方法的 正常 变化如下所示: 将第一个版本与 正常 版本进行比较,第一个版本似乎有所不同: 它分配一个自动执行功能的结果。 它在此函数内定义了局部变量。 它返回包含使用局部变量的逻辑的 实际 函数。 因此,主要的区别在于,在第一个变体中,初始化时,bar仅分配一次,而第二个变体在每次调用时都会创建此临时变量。 关于为什么

  • 我试图在Python3.8中使用更多可用的内核,通过并行化(通过joblib)来加快计算速度,但观察到它的扩展性很差。 我编写了一个小脚本来测试和演示稍后可以找到的行为。脚本(请参阅后面的内容)设计成有一个完全独立的任务,使用NumPy和Pandas对虚拟操作进行一些迭代。没有任务的输入和输出,没有磁盘或其他I/O,也没有任何通信或共享内存,只是简单的CPU和RAM使用。除了对当前时间的偶尔请求之

  • 问题内容: 当我打开JMeter仪表板时,我可以在列中看到成功,而在列中看到失败。根据城市词典 KO等于OK “ KO”等价于表示“ OK”的字母的含义和缩写 还是法国的非正式缩写? 我注意到,法语和意大利语非正式交流中的首字母缩写词KO意味着“不好” 我看到了有关将KO标签更改为失败的不同问题。 为什么JMeter将错误称为,在性能测试中还有其他含义吗?还是在积极思考失败也可以的地方? 问题答案