- 论坛徽章:
- 0
|
关于IO ports和IO memory
在IA32 Manuals-Basic Architecture中, 对于IO有二种寻址方式:1, IO Port(IO Address Space); 2,
Memory-Mapped IO.
1) IO Port方式.
使用体系结构相关的in/out指令来访问IO端口,并且能够保证每一条指令都在下一条之前完成,也就是in/out
指令是自然有序的。 一共有2^16(64K)个单独的8-bit端口,编号从0到FFFFH(其中从0F8H到0FFH被保留),任意两个连续
的8bit端口可以被看做是一个16bit端口,同样,任意4个连续的8bit端口可以被看做是一个32bit端口。
2) IO Address Space方式.
可以使用任意的mov、and、or等指令来访问,就象访问主存一样。
对于Linux内核来说,若想访问io ports,需要request_region来分配io ports, 返回之后的struct resource
就包含了start和end,在此之间的区域可以用in/out指令来访问。 /proc/ioports记录了目前已分配的所有IO端口。
对memory-mapped io来说,需要request_mem_region来分配IO内存(也就是外设的寄存器或者存储体),它也是
返回一个struct resource结构,其中有start和end字段,可以用来作为ioremap函数的参数。 对request_mem_region分配
的IO内存进行了ioremap之后,就可以在程序中象访问普通内存区那样来访问它们了。
IO Ports和IO Momory之间的转换,可以用ioport_map/ioport_unmap来实现。
这些内容可以参考LDD3第9章来理解。 |
|