错误记录和解决办法:globalmem虚拟驱动在 insmod 时出现 busy/*嵌入式学习*/

在学习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

当时网上还有很多这样的问题,但我但是就没管,反正一重启就没有了。

但今天,也就是刚刚我卸载内核的时候却没有发现有报错。真是一个奇怪的现象

我才,既有可能是我在编译内核树的时候破环了那么组建。但最后经过多次系统的使用和启动时,内核自己检测到这个错误并进行了修改。  个人看法。呵呵!

你可能感兴趣的:(linux,ubuntu,测试,嵌入式)