一、注册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结构体中的操作函数学习。