一、注册uio设备
1、分配和填充uio_info结构体
2、通过uio_register_device(uio_info..)注册uio设备
->__uio_register_device(uio_info)//分配填充uio_info结构体 ->uio_get_minor//获取次设备号 ->device_create(&uio_class,.,MKDEV(uio_major,idev->minor)); //创建设备节点,uio_class,uio_major(主设备号)全局变量在uio_init中初始化。
二、在一前系统必须先加载uio_init模块,cdev_add向系统加入主设备为uio_major设备,这样才能通过device_create创建对应设备节点
1、系统中添加字符设备(添加一个设备代表)
->uio_init//uio模块入口函数 ->init_uio_class ->uio_major_init ->alloc_chrdev_region(&uio_dev, 0, UIO_MAX_DEVICES, "uio")//动态分配主设备号,从设备号从0开始,最多UIO_MAX_DEVICES个设备范围 ->cdev = cdev_alloc()//分配cdev结构体 ->cdev->ops = &uio_fops;//初始化操作函数 ->cdev_add(cdev, uio_dev, UIO_MAX_DEVICES)//系统中加字符设备代表,允许系统创建UIO_MAX_DEVICES个对应类型设备 ->uio_major = MAJOR(uio_dev);//初始化全局主设备号变量,给uio_register_device函数创建设备节点使用
给系统添加一个字符设备代表,可以添加次设备号从0开始UIO_MAX_DEVICES多个对应设备,目的是公用cdev结构体,主设备号一样驱动程序一样,也就是公用uio_fops;
2、sys系统下创建class
->uio_init ->init_uio_class ->class_register(&uio_class);//初始化全局主设备号变量,给uio_register_device函数创建设备节点使用
1和2中分别得到uio_major和uio_class接口变量,给添加uio设备使用。
三、uio_fops操作函数和uio_info的对应关系
当操作对应设备节点就是调用对应uio_xx函数
1、uio_open函数
->idev->info->open //在对应注册uio设备时要封装uio_info对应的成员open函数
2、uio_wirte函数
->idev->info->irqcontrol//在对应注册uio设备时要封装uio_info对应的成员irqcontrol函数
3、uio_read函数
->add_wait_queue//添加等待队列,设置进程状态,等待数据
4、uio_mmap函数
->idev->info->mmap//在对应注册uio设备时要封装uio_info对应的成员mmap函数
5、uio_poll函数
->poll_wait//轮训等待队列
只了解对应函数对应函数。
通过上述内核代码分析,明白了内核怎么创建uio设备。
接下来就是学习dpdk怎么使用uio设备操作数据报文的,还有就是uio_info结构体中的操作函数学习。