1、aloc_cdev分配、init_cdev初始化、add_cdev设备注册
2、三个结构体node、file_operation、file,前两个在驱动中自已定义,最后一个在打开时内核帮你定义的(我觉得是)。
3、open打开时需要提取次设备号并将次设备对应的描述结构体的指针赋给file->private,然后下面的读写就知道是针对哪个具体的设备来操作了
4、先分析初始化函数、然后file_operation结构
内核中所有已分配的字符设备编号都记录在一个名为chrdevs散列表里,该散列表的每一个元素都是一个char_dev_struce结构,它的定义如下:
static struct char_device_struct{
struct char_device_stuct *next; //指向散列链表中的下一个元素的指针
unsigned int major; //主设备号
unsigned int baseminor; //起始设备号
init minorct; //次设备号的范围大小
char name[64]; //处理该设备编号范围内的设备驱动的名称
struct file_operation *fops //没有使用
struct cdev *cdev //指向字符设备驱动程序描述符的指针
}*chrdevs[CHRDEV_MAJOR_HASH_SIZE];
内核提供了三个函数来注册一组字符设备编号,分别是register_chrdev_region()、alloc_chrdev_region、
register_chrdev()。这三个函数会调用一个共同的_register_chrdev_region()函数来注册一组设备编号范围
(即一个char_device_struct结构)
静态分配
register_chrdev_region(dev_t first, unsigned int count, char *name)
first: 设备编号范围的初始值(次设备号常为0);
count: 连续编号范围;
name: 编号相关联的设备名称(/proc/devices);
动态分配
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)
register_chrdev()是一个老式分配设备编号范围的函数,它分配一个单独主设备号和0~255的次设备号范围。如果申请的主设备号为0,则动态分配一个。
共同调用的函数
static struct char_device_struct * __register_chrdev_region(unsigned int major, unsigned int baseminor, int minorct, const char *name)