http://blog.csdn.net/zg_hover/article/details/4097411
2009
2.4下编译内核模块,并加载的文章网上一大堆,2.6下却很少。
现在把如何编译内核模块和使用内核模块作一个说明:
编译内核模块需要: 内核源代码
方法1: 放在内核代码外部编译
在你要编译模块源代码的文件夹里建立一个Makefile文件,如下:
obj-m := test_modules.o
如果有多个文件,Makefile文件的内容如下:
obj-m := test_modules.o
test_modules-objs := test_main.o test_line.o
用下面的命令即可编译:
make -C {源码的位置,如:/usr/src/linux} SUBDIRS=$PWD modules
也把这个命令放到一个文件中: domake,每次编译,只需要输入./domake即可。
方法2: 放在内核源代码内一起编译
(用到的时候再记)
遇到的问题及其解决方法:
问题一:
insmod: error inserting './hello.ko': -1 Invalid module format
开始安装的时候遇到这个问题,请教了一个人,才知道是我现在运行的系统的版本和源码的版本不一样。
我的是fc8-2.6-23-42的,而下载的源码是2.6-23的,不是fc的版本。
解决:
我用命令yum install kernel-devel 安装了内核源码,它位于/usr/src/kernel目录下。
然后修改make 命令,把 -C选项后面的路径改为和运行版本相符的源码目录,我的是/usr/src/kernel
./domake 编译顺利通过,然后 sudo /sbin/insmod hello.ko 这次成功了
问题二:
insmod: error inserting 'globalmem.ko': -1 Device or resource busy
网上查了一下,原因可能有几种:中断线被占用,设备号被占用,于是我:
cat /proc/device
在看看我的源码,果然有个设备号,和我的主设备好相同,明显是我的设备号和系统现有设备号冲突了,马上该
22 #define GLOBALMEM_MAJOR 52
把主设备好改成一个没有用的设备号后,就可以insmod了。 但这里最好是采用动态分配设备好的方法,让系统自动的
分配没有使用的设备号。以免和系统产生冲突。
联系客服