查看主次设备号
当静态分配设备号时,需要查看系统中已经存在的设备号,从而决定使用哪个新设备号。可以读取/proc/devices文件获得设备的设备号。/proc/devices文件包含字符设备和块设备的设备号,如下所示:
[root@tom /]# cat /proc/devices /*cat命令查看/proc/devices文件的内容*/
Character devices: /*字符设备*/
1 mem
4 /dev/vc/0
7 vcs
13 input
14 sound
21 sg
Block devices: /*块设备*/
1 ramdisk
2 fd
8 sd
253 device-mapper
254 mdp
申请和释放设备号
内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该给设备申请一个设备号,使系统可以明确设备对应的设备号。设备驱动程序中的很多功能,是通过设备号来操作设备的。下面,首先对申请设备号进行简述。
1.申请设备号
在构建字符设备之前,首先要向系统申请一个或者多个设备号。完成该工作的函数是register_chrdev_region(),该函数在<linux/fs.h>中定义:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其中,from是要分配的设备号范围的起始值。一般只提供from的主设备号,from的次设备号通常被设置成0。count是需要申请的连续设备号的个数。最后name是和该范围编号关联的设备名称,该名称不能超过64字节。
和大多数内核函数一样,register_chrdev_region()函数成功时返回0。错误时,返回一个负的错误码,并且不能为字符设备分配设备号。
在Linux中有非常多的字符设备,在人为的为字符设备分配设备号时,很可能发生冲突。Linux内核开发者一直在努力将设备号变为动态的。可以使用alloc_chrdev_region()函数达到这个目的。(linux/fs.h)
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
在上面的函数中,dev作为输出参数,在函数成功返回后将保存已经分配的设备号。函数有可能申请一段连续的设备号,这是dev返回第一个设备号。baseminor表示要申请的第一个次设备号,其通常设为0。count和name与register_chrdev_region()函数的对应参数一样。count表示要申请的连续设备号个数,name表示设备的名字。
2.释放设备号
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:
void unregister_chrdev_region(dev_t from, unsigned count);
在上面这个函数中,from表示要释放的设备号,count表示从from开始要释放的设备号个数。通常,在模块的卸载函数中调用unregister_chrdev_region()函数。
次设备号的主要用途
1、区分设备驱动程序控制的实际设备;
2、区分不同用途的设备 (misc 系列设备)
3、区分块设备的分区 (partition)
通常,为了使应用程序区分所控制设备的类型,内核使用主设备号。而存在多台同类设备时,为了选择其中的一种,设备驱动程序就使用次设备号。
区分块设备的分区
块设备具有被称为分区的分配领域。例如,硬盘在物理上是一个设备,从内核的角度,硬盘被分为多个分区,而以这些分区为对象则形成了文件系统,此时,次设备号既表示设备,也表示分区。
brw-rw---- 1 root disk 8, 16 2009-09-24 sdb
brw-rw---- 1 root disk 8, 17 2009-09-24 sdb1
brw-rw---- 1 root disk 8, 18 2009-09-24 sdb2
brw-rw---- 1 root disk 8, 21 2009-09-24 sdb5
brw-rw---- 1 root disk 8, 22 2009-09-24 sdb6
brw-rw---- 1 root disk 8, 23 2009-09-24 sdb7
brw-rw---- 1 root disk 8, 24 2009-09-24 sdb8
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-03/33863p2.htm