Linux Device Driver

来自Org
跳转至: 导航搜索

设备号

主设备号与次设备号

(base on linux kernel 2.6.39) Linux 内核中通过 dev_t 类型来表示设备号。dev_t 类型定义在 linux/types.h 中

 21 typedef __u32 __kernel_dev_t;                                                                                                           
 22 
 23 typedef __kernel_fd_set         fd_set;
 24 typedef __kernel_dev_t          dev_t;

在32位机器上低20位位次设备号,高12位为主设备号。在头文件 linux/types.h 中可以看到次设备号位数的宏定义:

 4 #define MINORBITS       20

获取主设备号与次设备号

为了有更好的移植性,我们应该实用kernel中提供的2个宏来实现,MAJOR(dev)获得主设备号、MINOR(dev)获得次设备号。定义如下:

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

将主设备号和次设备号转换成 dev_t 类型设备号则可以用 MKDEV(ma,mi) 宏:

 9 #define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))

分配设备号

静态分配

静态分配时可以参考内核源码documentation/ devices.txt中定义的设备号,挑选尚未使用的设备号。 静态分配在添加新硬件时容易引起冲突,所以最好使用动态分配。(静态分配用在已知设备号的情况下) 字符设备中可以通过 register_chrdev_region 来申请设备号,其申明在 linux/fs.h 头文件中。

int register_chrdev_region(dev_t from, unsigned count, const char *name)

动态分配

动态分配为未知设备号时向系统申请未被使用的设备号,使用 alloc_chrdev_region 函数,其申明在 linux/fs.h 头文件中。

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
                         const char *name)

释放设备号

释放设备号使用函数 unregister_chrdev_region,其申明也在 linux/fs.h 中

void unregister_chrdev_region(dev_t from, unsigned count)