1.出现编译的模块不符合当前模块的问题:
原因:基本都是因为在用gcc编译的时候加入了-I参数指定源码树,但是所指定的版本和当前的内核版本冲突的问题。比如我碰到的是2.4.20-8custom(RH9.0自带的内核代码)的问题,和我们后来编译的2.4.20-8的冲突。
解决:修正../include/linux/version.h 中的UTS_RELEASE宏的值为需要的值就可以了。当然这种方法只限于内核相差不大的情况。
2.模块的编译问题:
情况描述:没有仔细看清楚LDD的代码直接使用module_init()函数,结果造成函数使用不正确。
解决方法:
应该说是描述模块的初始化。
模块必须的两个头文件,<linux/kernel.h> <linux/module.h> "kernel.h"主要是用到printk()等函数才包含。
模块的初始化函数定义必须是 int init_module(void){};
对应的退出函数是:void cleanup_module(void){};
如果还有需要再加上 MODULE_LICENSE("GPL");
还有作者信息: MODULE_AUTHOR(n);
3.System.map文件的作用:
保存内核函数符号地址,Everytime you complie a new kernel, the addresses of various symbol names are bound to change.
ps:总结可能有误,待后指出。