当前位置: 技术问答>linux和unix
内核挂载错误
来源: 互联网 发布时间:2016-12-15
本文导语: 写了一个简单的helloworld驱动,编译成功,挂载时提示:could not find the kernel version the module compiled for 网上查了许久,说法不一(如版本错误、),尝试各种方法都失败。请各位大虾指教,谢谢。编译环境是redhat9...
写了一个简单的helloworld驱动,编译成功,挂载时提示:could not find the kernel version the module compiled for
网上查了许久,说法不一(如版本错误、),尝试各种方法都失败。请各位大虾指教,谢谢。编译环境是redhat9.0 2.4的内核,另外想请教一下,驱动的函数名是如何命名的?如为何要添加红色部分?
附上代码:
#include
#include
MODULE_LICENSE("GPL");
static int __init hello_init(void)
{
printk("Hello module initn");
return 0;
}
static void __exit hello_exit(void)
{
printk("Hello module exitn");
}
module_init(hello_init);
module_exit(hello_exit);
网上查了许久,说法不一(如版本错误、),尝试各种方法都失败。请各位大虾指教,谢谢。编译环境是redhat9.0 2.4的内核,另外想请教一下,驱动的函数名是如何命名的?如为何要添加红色部分?
附上代码:
#include
#include
MODULE_LICENSE("GPL");
static int __init hello_init(void)
{
printk("Hello module initn");
return 0;
}
static void __exit hello_exit(void)
{
printk("Hello module exitn");
}
module_init(hello_init);
module_exit(hello_exit);
|
在文件中加入
#include
在编译选项中加入-I/usr/src/linux.内核版本号/include
再试一试
#include
在编译选项中加入-I/usr/src/linux.内核版本号/include
再试一试
|
你怎么编译的? 机子上/usr/src/ 有kernel的源码么?
__init
标记为初始化的函数,表明该函数供在初始化期间使用。
在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。
__exit修饰词标记函数只在模块卸载时使用。如果模块被直接编进内核
则该函数就不会被调用。如果内核编译时没有包含该模块,则此标记的函数将被简单地丢弃
__init
标记为初始化的函数,表明该函数供在初始化期间使用。
在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。
__exit修饰词标记函数只在模块卸载时使用。如果模块被直接编进内核
则该函数就不会被调用。如果内核编译时没有包含该模块,则此标记的函数将被简单地丢弃
|
2.4内核应该没有要求编译内核的gcc和编译模块的gcc版本一样吧,那就不知道了
另外,别用古董的2.4了,就算用2.4,也用该去下个CentOS(RHEL)3.9啊,这个是企业级的,支持到2007年。bug要少很多
另外,别用古董的2.4了,就算用2.4,也用该去下个CentOS(RHEL)3.9啊,这个是企业级的,支持到2007年。bug要少很多
|
看看你的模块指向的内核代码有没问题
尝试下insmod -f .ko
尝试下insmod -f .ko
|
编译用的内核和挂载的内核版本不统一,insmod -f 强制挂载如果版本差异不大可以接受,否则还是会报错的