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

本文详细解析了Linux驱动开发中遇到的设备号冲突问题,通过修改全局变量和利用系统动态分配设备号的方法解决加载虚拟驱动时出现的错误。同时,文章还讨论了在Ubuntu环境下卸载内核时遇到的问题及其可能的原因。
摘要由CSDN通过智能技术生成

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值