我有一个简单的内核模块:
void GPIO_LED(void) {
printk(" GPIO: set PC8: '0');
at91_set_gpio_value(AT91_PIN_PC8, 1);
}
//
int init_module(void) {
GPIO_LED();
return 0;
}
MODULE_LICENSE("GPL");
将它与mdev设备管理一起使用时。一切正常。但是将它与udev设备管理一起使用,同时执行insmod
insmod /usr/modules/measurement_gpio.ko
出现以下消息:
insmod: can't insert '/usr/modules/measurement_gpio.ko': invalid module format
另一项测试表明,当使用设备表而不是 mdev/udev 时会导致相同的错误。每个设置都保持不变(尤其是内核版本),但在此测试期间设备管理发生了变化,所以实际上模块应该没问题。
这怎么可能以及如何解决?
[编辑: ]在使内核能够加载多个版本的模块后,我收到以下消息,这让我更加困惑:
measurement_gpio: version magic '2.6.39 mod_unload modversions ARMv5 ' should be '2.6.39 mod_unload ARMv5
[ Edit2: ] 我构建模块的方式是:
- 使用 Buildroot 我正在生成一个图像,在安装 Linux 2.6.39 的过程中。
- 之后,我使用 buildroot 下载的 Linux 2.6.39 的路径编译内核模块。
- 创建模块后,我将其放入 fs-overlay 目录中,因此它将在下一次构建时包含在映像中。
- 我在 buildroot 上打了另一个“make”,我把所有东西放在一起,还有一个可启动的图像。
我什么都没改变,这就是为什么它让我更加困惑