UIO 是怎么工作的?
一个设备驱动的主要任务有两个:
1. 存取设备的内存
2. 处理设备产生的中断
对于第一个任务,UIO 核心实现了mmap()可以处理物理内存(physical memory),逻辑内存(logical memory), 虚拟内存(virtual memory)。UIO驱动的编写是就不需要再考虑这些繁琐的细节。
第二个任务,对于设备中断的应答必须在内核空间进行。所以在内核空间有一小部分代码用来应答中断和禁止中断,但是其余的工作全部留给用户空间处理。
如果用户空间要等待一个设备中断,它只需要简单的阻塞在对 /dev/uioX的read()操作上。 当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用 select()来等待中断的发生。select()有一个超时参数可以用来实现有限时间内等待中断。
read()操作还必须是读取一个32-bit长度的整数,返回值是发生中断的计数器。
所以read()操作的调用为
read(uio_fd, &irq_count, 4);
通过irq count 返回发生的中断次数。
参考:
http://ww2.cs.fsu.edu/~rosentha/linux/2.6.26.5/docs/DocBook/uio-howto/index.html