
UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间建著血混用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免识钢阶万历水角旧设备的驱动程序需要随着内核的更新而更首老好交七挥丝容权新的问题!
- 中文名称 UIO
- 含义 运行在用户空间的I/O技术
- 可使用语言 C++,Java等
- 关键操作 响应硬件中断等
定义
为什么我们要把I/顾吧西觉令却首粮诗O放在用户空间呢? 原因有二:
第一,硬件设备可以根据功能分为网络设来自备,块设备,字符设备,或者根据与CPU相连的方式分为PCI设备,USB设备等。它们被不同的内核子系统支持。这些标准的设备的频愿互底方驱动编写较为容易买而且容易维护。很容易加入主内核源码树。但是,又有很多设备难以划分到360百科这些子系统中,比如I/O卡,现场总线接口或者定制的FPGA。通常这介变称耐肉些非标准设备的驱动才吗四到细散率鲜财直被实现为字符驱动。这些金住比乡世清生死以空驱动使用了很多内核内部函数和宏。而这些内部函数和宏普息川半许造列超是变化的。这样驱动的编写者必须编写一个完全的内核搞决换缩差新驱动,而且一直维护这些代码。像这种设备如果把驱动放入Linux内核,不但增大了内核的负担而且还很少使用,更没有人愿意免费的花费大量精力去维护这样的驱动,攻最论使用UIO使驱动的开发可以利用所有的用户空间的应用程序开发工具和库,而且当系罗统内核发生变化时,只要更改UIO框架与其他内核程序交互的接口即可,不需要更改UIO框架下面的driver。
第二,内核驱动的开发必须使用C语言加上少量事图著注己育只决极一围汇编代码。uio可以使用C意叫++,Java ...等高级语言极大的方便了开发。我们可以发现,有很多矿的卡的驱动在内核空间已经有实现,这样,我们可以参考已经存在的代码,极大的提高的开发的速度,和降低了开发成本。而且内核驱动的调试会比用论余讲范他步煤件四户空间程序调试复杂很多。我们经常遇到死机,涉及到多个子系刑检原耐措夫个再统,棘手。放在用户空间的话如果驱动程序死了,并不影响系统的正常运行并且方便了我们的开发。
工作原理
通过吧鱼降就则UIO的运行原理图可以看出,用户空间下的驱动程序比运行在内核空间的驱极鲜光罪议加边动要多得多,UIO框架下运行在内核空间的驱动程序所做的工作很简单,常做的只有两个:分配和记录设备需要的资源和注册uio设备和必须在内核空间实现的小部分中断应答函数,经过封径跳委务实践表明后面的工作也是可以省略的!我们认为uio内核空间的程序所做的越少越好,在用户空间能完成的我们就不需要放在内核空间做(比如说响应中断),这样假如内核有变化,uio框架中的驱动维护也是比较简单的!对于用户空间的驱动程序,我们还可以集成到某款应用软件中,这样也是可行的,上面已经说过了,因为使用uio的设备一般比较少见,所以可以作出这类的驱动也可以针对某款或者一类设备作出应用程序集成了驱动即可!
内核空间
UIO的少量运行在内核空间的驱动所做的工作有哪些呢?
(1)分配和记录设备需要的资源和注册uio设备
在设备的探测函数中:
- 使来自能PCI 设备
- 申请资源
- 读取并记录配置信息
- 注册uio设备// uio_register_device()
// uio_8139d_pci_probe & uio_8139d_handler
(2)必须*变洋州单在内核空间实现的小析胜晚表围护毫备部分中断应答函数
关键操作
相一宗成为混搞知白2.响应硬件中断
int32_t irq上必行消_count;
int fd = open("/dev/uio0", O_RDWR);
/* Map the regi晚介ster regions to proccess's virtual memspace */
voi360百科d * access = mmap(NULL, 4096,
// 寄存器的读写操作,可用过普通内存读写的方式完成
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);// [1]
while (read(fd, &irq_count, 4) == 4) {[2]
print它定需液伟额需f("Interrupt number %d\n", irq_count);
}
评论留言