在学习Linux驱动开发详解。加载 globalmem 虚拟驱动的时候出错。
当执行命令 #insmod globalmem.ko
时,出现:insmod: error inserting 'globalmem.ko': -1 Device or resource busy
这里存在的问题是:
globalmem的源码分配的 设备号和驱动原有的设备号有冲突。
解决办法为:将源码的
#define GLOBALMEM_MAJOR 250 改为:
#define GLOBALMEM_MAJOR 255
这里你可以试一下 251、252、253、等。 这是笨办法,目前我就用这招。等我找到更好的办法时我一定告诉大家。
当然你也可以通过使用命令 cat /proc/devices
来查看已经被占用的设备号,从而另外给你分配设备号。
这里使用的都是静态的设备号,当然你也可以使用动态设备号,但要修改的代码比较多,所以有点麻烦。
呵呵,刚刚才发现,如果你需要分配动态的设备号的时候其实更简单
在globalmem_init()函数初始化设备函数的时候不知道你注意到这几个语句没:
if(globalmem_major) /*如果设备分配的设备号>=1,就表明你会使用静态的设备号分配方法*/
result =register_chrdev_region(devno,1,"globalmem");
else{ result = alloc_chrdev_region(&devno, 0,1, "globalmem"); /*否则使用系统动态分配设备号*/
globalmem_major = MAJOR(devno);
}
而这里面的register_chrdev_region() 就是分配静态设备号的函数,
而 alloc_chrdev_region() 则是系统自动分配一个没有被占用的动态设备号。
所以如果你需要分配一个动态的设备号的话,你需要将globalmem.c函数里的
#define GLOBALMEM_MAJOR 250 改为:
#define GLOBALMEM_MAJOR 0
不过在后面测试的时候你就需要使用 cat /proc/devices 来查看你的动态设备号的分配号了。
还有一个问题在上一次我刚搭建好的Ubuntu驱动开发环境时:
我加载驱动用insmod 没有问题:
但在我卸载内核的时候,也就是用rmmod 时候显示 Device or resource busy
当时网上还有很多这样的问题,但我但是就没管,反正一重启就没有了。
但今天,也就是刚刚我卸载内核的时候却没有发现有报错。真是一个奇怪的现象。
我才,既有可能是我在编译内核树的时候破环了那么组建。但最后经过多次系统的使用和启动时,内核自己检测到这个错误并进行了修改。 个人看法。呵呵!