UIO

又是学DPDK的时候接触到的知识,DPDK里有特别多的用户态的驱动,实现用户态驱动需要会用到的技术之一就是UIO

什么是UIO

UIO全称为UserSpace I/O,是Linux内核提供的一个用户态驱动框架;它由两部分组成,一个非常小巧的内核模块和一个用户态驱动;

为什么需要用UIO

对于许多类型的设备,创建Linux内核驱动程序是多余的。真正需要的是能处理硬件的中断和访问设备的内存空间。控制设备的逻辑不一定必须在内核内,因为设备不需要利用内核提供的任何其他资源。一种常见的设备类型是工业I/O卡。为了解决这种情况,UIO诞生了。对于典型的工业I/O卡,只需要一个非常小的内核模块。驱动程序的主要部分将在用户空间中运行。这简化了开发并降低了内核模块中出现严重错误的风险。

什么硬件适合用UIO

UIO不是一个通用的驱动程序接口。已经被其他内核子系统处理得很好的设备(如网络、串行或USB)不适合UIO驱动程序。非常适合UIO驱动程序的硬件可以满足以下所有要求:

  • 设备具有可映射的内存。通过写入该存储器,可以完全控制该设备。
  • 设备通常会产生中断。
  • 该设备不适合标准内核子系统之一。

使用UIO的好处

  • 只需编写和维护一个小的内核模块。
  • 在用户空间中开发驱动程序的主要部分,使用您习惯的所有工具和库。
  • 驱动程序中的错误不会使内核崩溃。
  • 你的驱动程序的更新可以在不重新编译内核的情况下进行。

UIO的困局

UIO的设计初衷是为了提供一种简单、轻量级的用户空间I/O框架,使得用户空间程序能够直接访问设备I/O内存和中断,而不需要内核空间的参与。因此,

  • 不支持 DMA(不受 IOMMU 的保护),也就意味着没有DMA为它做虚拟地址到物理地址的转化,只能直接访问物理地址,危险性极高
  • 由于不支持DMA,所以UIO只能在用户空间操作硬件设备的寄存器空间,而无法支持通过DMA把内核空间的数据传送到用户空间。对于需要通过DMA进行大量数据传输的I/O设备,如网卡、显卡等,UIO就无法满足需求,需要使用其他机制,如VFIO(Virtual Function I/O)等。
  • UIO需要root权限。