内核版本:linux-2.6.34.1
字符设备号
一、简介
Linux下的应用程序在访问字符设备时,一般都是通过设备节点访问的。设备节点一般都在/dev目录下。字符设备文件的第一个标志是c,如下所示:
[machi@localhost dev]$ ll | grep tty
……..
crw--w----. 1 root root 4, 0 Sep 26 18:05 tty0
crw--w----. 1 root root 4, 1 Sep 25 19:04 tty1
crw--w----. 1 root tty 4, 10 Sep 26 18:05 tty10
crw--w----. 1 root tty 4, 11 Sep 26 18:05 tty11
crw--w----. 1 root tty 4, 12 Sep 26 18:05 tty12
……..
在上面的输出中,每一个文件代表一个设备,在时间前面有两个用逗号隔开的数字,第一个数字是主设备号,第二个数字是次设备号。一般认为一个主设备号对应一个驱动程序,可以看到,这里列出的TTY设备都由驱动程序4管理。不过,也可以一个主设备号对应多个驱动程序。一个次设备号对应一个设备, 所以上面输出中表示的0,1,10等数字代表不同的设备。一个驱动程序,可以管理多个此类型的设备,设备数可以有2^20个,原因是次设备号有20位,不过不可能有这么多设备的。
二、设备号的内部表示
设备号的类型定义在内核代码树的文件/include/linux/Types.h中:
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
__u32代表一个无符号的32位整形数。
在32位的设备号中,主设备号占高12位,次设备号占低20位。在操作设备号时,可以使用内核提供的宏:
#define MINORBITS 20
#define MINORMASK ((1U << MINORBITS) - 1)
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi)