?>?新闻?>?国内新闻 > 正文

包头谔傺傺传媒_聊聊Linux用户态驱动设计

序言

设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论。不管用户态驱动还是内核态驱动,他们都有各自的缺点。内核态驱动的问题是:系统调用开销大;学习曲线陡峭;接口稳定性差;调试困难;bug致命;编程语言选择受限;而用户态驱动面临的挑战是:如何中断处理;如何DMA;如何管理设备的依赖关系;无法使用内核服务等。对此,《User-Space Device Drivers in Linux: A First Look》?一文有较CC国际客服QQ_cc国际 m.cc177.com_cc国际网投平台是违法的吗描述。

可能是为了性能优化,或者为了故障隔离,或者为了逃避开源许可证的约束,不管是基于何种目的,linux已有多种用户态驱动的实现,如UIO,VFIO、USB用户态驱动等。它们在处理中断、DMA、设备依赖管理等方面的设计方案和实现细节上各有千秋,这是《User-Space Device Drivers in Linux: A First Look》 没有提到的,也是本文的重点。

UIO

?

UIO 框架导出sysfs和/dev/uioX 2套用户态接口,用户对设备节点/dev/uioX进行设备控制,mmap()接口用于映射设备寄存器空间,write()接口用于控制中断关闭/打开,read()接口用于等待一个设备中断。

因为对于设备中断的应答必须在内核空间进行,所以在内核空间有一小部分代码用来应答中断和禁止中断,其余的工作全部留给用户空间处理。如果用户空间要等待一个设备中断,它只需要简单的阻塞在对 /dev/uioX的read()操作上。 当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用 select()来等待中断的发生。select()有一个超时参数可以用来实现有限时间内等待中断。

UIO的几个特点:

  • 一个UIO设备最多支持5个mem和portio空间mmap映射。?
  • UIO设备的中断用户态通信机制基于wait_queue实现。
  • 一个UIO设备只支持一个中断号注册,支持中断共享。

总的来说,UIO框架适用于简单设备的驱动,因为它不支持DMA,不能支持多个中断线,缺乏逻辑设备抽象能力。

VFIO

?

?上文提到,UIO不支持DMA,所以通过DMA传输大流量数据的IO设备,如网卡、显卡等设备,无法使用UIO框架,VFIO做为UIO的升级版,主要就是解决了这个问题。通过用户态配置IOMMU接口,可以将DMA地址空间映射限制在进程虚拟空间中。这对高性能驱动和虚拟化场景device passthrough尤其重要。

在VFIO框架中,有几个核心概念或对象:IOMMU、/dev/vfio、container、iommu_group。

  • IOMMU是一个硬件单元,它可以把设备的IO地址映射成虚拟地址,为设备提供页表映射,设备通过IOMMU将数据直接DMA写到用户空间。之所以不共用MMU单元,是为了保证和进程的页表相互独立,防止设备访问进程的任意地址空间。所以VFIO的IOMMU功能保障了安全的非特权级别的用户态设备驱动机制。
  • ?/dev/vfio是一个设备文件,作为一个IOMMU设备的用户态呈现。
  • container是内核对象,表示一个IOMMU设备,是一个IOMMU设备的内核态呈现。所以在VFIO中,container是IOMMU操作的最小对象。
  • 在虚拟化场景下,一个物理网卡可能要虚拟成几个虚拟网卡,或者说虚拟功能设备(VF),这几个VF共用一个IOMMU,所以VFIO模型增加一个iommu_group的概念,用来表示共享同一个IOMMU的一组device。

VFIO的几个特点:

  • VFIO设备支持多中断号注册。
  • 设备的中断用户态通信机制基于eventfd/irqfd实现。用户通过/dev/vfio设备select/poll/epoll,从而实现中断从内核态到用户态的异步事件通知。
  • 支持对物理设备进行逻辑抽象。
  • 仅支持pci intx中断共享,其他类型中断不支持共享。
  • VFIO仅支持特定IOMMU设备,如x86与PowerPC平台的PCI设备和ARM平台的platform设备。

USB用户态驱动

usbfs(USB file system)提供了一些在用户空间下操作USB设备的函数接口和数据结构, 在开发用户态驱动时, 可以直接利用这些函数接口来实现对 USB 设备的控制和数据传输。
libusb对usb file system提供的函数接口和数据结构进行了封装, 可以有效减少程序中函数和数据结构使用不当造成的错误。Libusb 对 USB 设备的访问提供了两种机制, 同步访问和异步访问。
khubd是内核后台线程,用来管理监视USB HUB的状态, 一旦发生热插拔就会唤醒这个线程, 进而添加或者移除设备,并发送netlink消息传递给用户态空间。

USB 用户态驱动框架的几个特点:

  • 设备的中断用户态通信机制基于netlink实现。
  • USB设备以usbdevfs (后改名为usbfs)文件系统的形式(如/proc/bus/usb/BBB/DDD)对用户态呈现。
  • 对usb的所有访问通过usbfs?ioctl实现,如control transfer, bulk transfer, reset等。
  • 仅支持USB设备

参考资料

Linux Kernel v4.4

she bei de zhong duan yong hu tai tong xin ji zhi ji yu netlink shi xian. USB she bei yi usbdevfs hou gai ming wei usbfs wen jian xi tong de xing shi ru proc bus usb BBB DDD dui yong hu tai cheng xian. dui usb de suo you fang wen tong guo usbfs? ioctl shi xian, ru control transfer, bulk transfer, reset deng. jin zhi chi USB she bei can kao zi liao Linux Kernel v4. 4

User-Space Device Drivers in Linux: A First Look

User-Mode Driver Framework

VFIO Introduction

Linux iommu和vfio概念空间解构

当前文章:http://www.i-m-o-k.com/xd0qz6v/16154-1053889-98796.html

发布时间:05:32:09

香港最快开奖320999??118kj开奖现场开奖记录??财宝神算坛860438??平特一肖几倍??六玄开奖网??挂牌??内部三肖中特期期准??香港管家婆六合网??正版香港马报免费资料??www.456999.com??