(1)关于IO与内存空间:
(2)inb和outb:
在Linux设备驱动中,宜运用Linux内核供给的函数来拜访定坐落I/O空间的端口,这些函数包含:
·
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
·
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
·
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);
·
void insb(unsigned port, void *addr, unsigned long count);
void outsb(unsigned port, void *addr, unsigned long count);
·
·
void insw(unsigned port, void *addr, unsigned long count);
void outsw(unsigned port, void *addr, unsigned long count);
·
void insl(unsigned port, void *addr, unsigned long count);
void outsl(unsigned port, void *addr, unsigned long count);
上述各函数中I/O端口号port的类型高度依赖于详细的硬件渠道,因而,只是写出了unsigned。
(3)readb和writeb:
在设备的物理地址被映射到虚拟地址之后,虽然能够直接经过指针拜访这些地址,可是工程师宜运用Linux内核的如下一组函数来完结设备内存映射的虚拟地址的读写,这些函数包含:
·
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
与上述函数对应的较早版别的函数为(这些函数在Linux 2.6中依然被支撑):
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
·
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
与上述函数对应的较早版别的函数为(这些函数在Linux 2.6中依然被支撑):
void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);
(4)把I/O端口映射到“内存空间”:
void *ioport_map(unsigned long port, unsigned int count);
经过这个函数,能够把port开端的count个接连的I/O端口重映射为一段“内存空间”。然后就能够在其回来的地址上像拜访I/O内存相同拜访这些I/O端口。当不再需求这种映射时,需求调用下面的函数来吊销:
void ioport_unmap(void *addr);
实际上,剖析ioport_map()的源代码可发现,所谓的映射到内存空间行为实际上是给开发人员包围的一个“假象”,并没有映射到内核虚拟地址,只是是为了让工程师可运用一致的I/O内存拜访接口拜访I/O端口。