Linux设备驱动开发详解:基于最新的Linux 4.0内核

主设备号是与驱动对应的概念,同一类设备一般使用相同的主设备号,不同类的设备一般使用不同的主设备号(但是也不排除在同一主设备号下包含有一定差异的设备)。因为同一驱动可支持多个同类设备,因此用次设备号来描述使用该驱动的设备的序号,序号一般从0开始。

1 struct inode {
2 ...
3 umode_t i_mode; /* inode的权限 */
4 uid_t i_uid; /* inode拥有者的id */
5 gid_t i_gid; /* inode所属的群组id */
6 dev_t i_rdev; /* 若是设备文件,此字段将记录设备的设备号 */
7 loff_t i_size; /* inode所代表的文件大小 */
8
9 struct timespec i_atime; /* inode最近一次的存取时间 */
10 struct timespec i_mtime; /* inode最近一次的修改时间 */
11 struct timespec i_ctime; /* inode的产生时间 */
12
13 unsigned int i_blkbits;
14 blkcnt_t i_blocks; /* inode所使用的block数,一个block为512 字节 */
15 union {
16 struct pipe_inode_info *i_pipe;
17 struct block_device *i_bdev;
18 /* 若是块设备,为其对应的block_device结构体指针 */
19 struct cdev *i_cdev; /* 若是字符设备,为其对应的cdev结构体指针 */
20 }
21 ...
22 };

对于表示设备文件的inode结构,i_rdev字段包含设备编号。Linux内核设备编号分为主设备编号和次设备编号,前者为dev_t的高12位,后者为dev_t的低20位。下列操作用于从一个inode中获得主设备号和次设备号: