Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1335818
  • 博文数量: 177
  • 博客积分: 3640
  • 博客等级: 中校
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-27 16:51
文章分类

全部博文(177)

文章存档

2014年(1)

2013年(10)

2012年(3)

2011年(163)

分类: LINUX

2011-10-07 11:36:58

主设备号和次设备号

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。

1.主设备号和次设备号的表示

在Linux内核中,dev_t类型用来表示设备号。在Linux 2.6.29.4中,dev_t定义为一个无符号长整型变量,如下:

  1. typedef u_long dev_t; 

u_long在32位机中是4个字节,在64位机中是8字节。以32位机为例,其中高12表示主设备号,低20为表示次设备号,如图6.1所示。

 
图6.1  dev_t结构

2.主设备号和次设备号的获取

为了写出可移植的驱动程序,不能假定主设备号和次设备号的位数。不同的机型中,主设备号和次设备号的位数可能是不同的。应该使用MAJOR宏得到主设备号,使用MINOR宏来得到次设备号。下面是两个宏的定义:

  1. #define MINORBITS   20                                  /*次设备号位数*/  
  2. #define MINORMASK   ((1U << MINORBITS) - 1)             /*次设备号掩码*/  
  3. #define MAJOR(dev)  ((unsigned int) ((dev) >> MINORBITS))  
  4.                                             /*dev右移20位得到主设备号*/  
  5. #define MINOR(dev)  ((unsigned int) ((dev) & MINORMASK))  
  6.                                             /*与次设备掩码与,得到次设备号*/ 

MAJOR宏将dev_t向右移动20位,得到主设备号;MINOR宏将dev_t的高12位清零,得到次设备号。相反,可以将主设备号和次设备号转换为设备号类型(dev_t),使用宏MKDEV可以完成这个功能。

  1. #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))  

MKDEV宏将主设备号(ma)左移20位,然后与次设备号(mi)相与,得到设备号。

3.静态分配设备号

静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,内核开发者已经为其分配了设备号。这些设备号可以在内核源码documentation/ devices.txt文件中找到。如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。在不添加新硬件的时候,这种方式不会产生设备号冲突。但是当添加新硬件时,则很可能造成设备号冲突,影响设备的使用。

4.动态分配设备号

由于静态分配设备号存在冲突的问题,所以内核社区建议开发者使用动态分配设备号的方法。动态分配设备号的函数是alloc_chrdev_region(),该函数将在"申请和释放设备号"一节讲述。

5.查看设备号

当静态分配设备号时,需要查看系统中已经存在的设备号,从而决定使用哪个新设备号。可以读取/proc/devices文件获得设备的设备号。/proc/devices文件包含字符设备和块设备的设备号,如下所示。

  1. [root@tom /]# cat /proc/devices /*cat命令查看/proc/devices文件的内容*/  
  2. Character devices:                  /*字符设备*/  
  3.   1 mem  
  4.   4 /dev/vc/0  
  5.   7 vcs  
  6.   13 input  
  7.   14 sound  
  8.   21 sg  
  9. Block devices:                      /*块设备*/  
  10.   1 ramdisk  
  11.   2 fd  
  12.   8 sd  
  13.   253 device-mapper  
  14.   254 mdp 
阅读(5586) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~