用户态驱动程序UIO
UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可。
UIO的内核部分和用户空间的工作
内核空间
UIO的少量运行在内核空间的驱动所做的工作有哪些呢?
(1)分配和记录设备需要的资源和注册uio设备
在设备的探测函数中:
-使能PCI 设备
-申请资源
-读取并记录配置信息
-注册uio设备// uio_register_device()
// uio_8139d_pci_probe & uio_8139d_handler
(2)必须在内核空间实现的小部分中断应答函数
用户空间的关键操作
(1)关键操作
(2)响应硬件中断
有什么优势?
1. 用户空间驱动程序的优点
- 可以和整个C库链接。
- 在驱动中可以使用浮点数,在某些特殊的硬件中,可能需要使用浮点数,而linux内核并不提供浮点数的支持。如果能在用户态实现驱动,就可以轻松解决这一问题。
- 驱动问题不会导致整个系统挂起。内核态驱动的一些错误常常导致整个系统挂起。
- 用户态的驱动调试方便。
- 可以给出封闭源码的驱动程序,不必采用GPL,更为灵活。
源码简单分析
与其他内核PCI模块开发一样代码结构,UIO驱动实现部分:
关键数据结构:
//dpdk定义的uio pci设备描述结构
struct rte_uio_pci_dev {
struct uio_info info; //uio 通用结构
struct pci_dev *pdev; //pci设备描述结构
enum rte_intr_mode mode; //中断模式
};
struct uio_info {
struct uio_device *uio_dev; //uio设备属于
const char *name; //名称
const char *version; //版本号
struct uio_mem mem[MAX_UIO_MAPS];//可映射的内存区域列表,size == 0表示列表结束
struct uio_port port[MAX_UIO_PORT_REGIONS]; //网口区域列表
long irq; //UIO_IRQ_CUSTOM 中断号
unsigned long