目录
前言
关于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/uioX的read()操作上。当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用 select()来等待中断的发生。select()有一个超时参数可以用来实现有限时间内等待中断。 对设备的控制还可以通过/sys/class/uio下的各个文件的读写来完成。你注册的uio设备将会出现在该目录下。假如你的uio设备是uio0那么映射的设备内存文件出现在 /sys/class/uio/uio0/maps/mapX,对该文件的读写就是对设备内存的读写。
如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)