Linux UIO机制--用户空间I / O操作方法

目录

         前言

关于UIO

UIO 的工作原理:


前言

于许多类型的设备,创建Linux内核驱动程序是过分的。真正需要的只是某种方式来处理中断并提供对设备存储空间的访问。控制设备的逻辑不必一定要在内核之内,因为设备不需要利用内核提供的任何其他资源。这样的一种常见的设备类别是用于工业I / O卡的设备。

为了解决这种情况,设计了用户空间I / O系统(UIO)。对于典型的工业I / O卡,只需要一个非常小的内核模块。驱动程序的主要部分将在用户空间中运行。这简化了开发并降低了内核模块中严重错误的风险。

请注意,UIO不是通用驱动程序接口。已经被其他内核子系统(例如网络,串行或USB)良好处理的设备不适合使用UIO驱动程序。最适合UIO驱动程序的硬件满足以下所有条件:

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

关于UIO

如果您将UIO用作卡的驱动程序,则将获得以下信息:

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

UIO 的工作原理:

        UIO分成2个部分,主要是内核部分和用户空间部分, 在内核部分主要是实现硬件寄存器的内存映射(struct uio_info -> struct uio_mem)及读写操作, 在用户空间部分,将uio设备的uio_mem映射到本地(mmap), 这样就可以实现在用户空间访问硬件设备寄存器的目的, 再通过设备的控制逻辑,就可以实现硬件设备的驱动。 

一个UIO设备驱动的主要任务有两个:

        1. 存取设备的内存 UIO 核心实现了mmap()可以处理物理内存(physical memory),逻辑内存(logical memory),虚拟内存(virtual memory)UIO驱动的编写是就不需要再考虑这些繁琐的细节。 如果有些设备的总线不是PCI总线, 那么仍需要做相关的处理   
        2.
处理设备产生的中断 对于设备中断的应答必须在内核空间进行。所以在内核空间有一小部分代码 用来应答中断和禁止中断,但是其余的工作全部留给用户空间处理。  
        如果用户空间要等待一个设备中断,它只需要简单的阻塞在对 /dev/uioXread()操作上。当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用  select()来等待中断的发生。select()有一个超时参数可以用来实现有限时间内等待中断。   对设备的控制还可以通过/sys/class/uio下的各个文件的读写来完成。你注册的uio设备将会出现在该目录下。假如你的uio设备是uio0那么映射的设备内存文件出现在 /sys/class/uio/uio0/maps/mapX,对该文件的读写就是对设备内存的读写。

 

如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页