访问I/O的方式
当程序涉及到对I/O端口进行访问时,我们总是可以看到使用 inb/outb
两个函数(或者说in/out函数家族),但是两个函数的实现,在不同处理器上的实现却有所不同,区别主要针对冯诺依曼架构(独立编址)和哈佛架构(统一编址)。还有ioread8/iowrite8
和readb/writeb
等函数,但在不同的架构上就大同小异了。
统一编制
将存储器地址空间的一部分划分给I/O端口,使得我们能像访问存储器一样访问I/O地址空间
统一编址也称为“I/O内存”方式,外设寄存器位于“内存空间”
访问流程:
request_mem_region() -> ioremap() -> inb()/outb() ioread8()/iowrite8() readb()/writeb()-> iounmap() -> release_mem_region()
以arm处理器为例,2.6.32内核中,
arch/arm/include/asm/io.h
#define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; })
#define iowrite8(v,p) __raw_writeb(v, p)
#define readb(c) ({ __u8 __v = __raw_readb(__mem_pci(c)); __v; })
#define writeb(v,c) __raw_writeb(v,__mem_pci(c))
#define inb(p)