现在的位置: 首页 > 综合 > 正文

也曾遇到 设备号冲突的问题

2017年05月19日 ⁄ 综合 ⁄ 共 827字 ⁄ 字号 评论关闭

编写了一个简单的字符设备驱动程序,编译通过,在insmod时出现了如下错误:

  这个问题我之前没有遇到过,于是上网搜了一下,发现是设备号冲突的原因。
我的代码中设置的主设备号为254(GLOBALMEM_MAJOR):
 
   
  

  我们通过命令cat /proc/devices,可以查看当前系统已经分配的设备号如下:

  我的代码中的设备号254在系统中已经分配过了,所以就出现了设备号冲突的问题,于是就有了device or resource busy。 

 
  解决办法:将自己代码中的设备号改为一个系统还未分配的设备号即可(可以通过/proc/devices查看已分配的设备号):
如:
#define GLOBALMEM_MAJOR 256

注意,我们使用的都是静态设备号,我们也可以使用动态设备号来解决这个问题。
在初始化函数globalmem_init()中,有如下代码:

点击(此处)折叠或打开

  1. //若设备分配的设备号>=1,则使用的是静态设备号分配方法,否则使用动态方法分配设备号
  2. if( globalmem_major
    )
  3.     result
    =
    register_chrdev_region(devno, 1,
    "globalmem");
  4. else

  5.      result
    = alloc_chrdev_region(&devno, 0, 1,
    "globalmem");
  6.      globalmem_major = MAJOR(devno);

  其中,register_chrdev_region()就是分配静态设备号的函数,而alloc_chrdev_region()则是系统自动分配一个没有被占用的动态设备号。
  所以,如果你需要分配一个动态设备号的话,可以将
#define GLOBALMEM_MAJOR 255 改为
#define GLOBALMEM_MAJOR 0
  这样,就可以得到一个系统动态分配的设备号了。但是,你要注意,后面的测试需要使用cat /proc/devices来查看你得到的设备号是什么。

抱歉!评论已关闭.