内核模块与设备驱动开发详解
1. 设备号与驱动注册
在设备驱动开发中,设备号的处理是关键的第一步。我们可以使用MKDEV(int, int)宏,将主设备号和次设备号组合成一个dev_t类型的设备号。同时,还有MAJOR(dev_t)和MINOR(dev_t)这两个宏,用于从dev_t中提取主设备号和次设备号。建议使用这些宏,而不是直接操作位域,因为内核后续版本可能会改变主设备号和次设备号的位分配,并且使用宏会让代码更具可读性。
分配主设备号后,需要将驱动注册到内核,这包含两个步骤:
1. 使用cdev_alloc()或cdev_init()分配或初始化cdev数据结构。
2. 使用cdev_add()告知内核。
cdev_alloc()会动态分配并初始化cdev结构。在调用cdev_add()之前,必须初始化owner和ops字段。cdev_add()的参数如下:
- 指向cdev结构的指针。
- 从alloc_chrdev_region()获取的基础设备号。
-