您的位置:首页 > 运维架构 > Linux

Linux字符驱动--结构分析

2011-01-04 10:51 316 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐