mmap_device_io() 和 mmap_device_memory()

有朋友来信问起,mmap_device_io()和
mmap_device_memory()有什么区别?

这个问题其实很有趣。IO空间和Memory空间,
只有x86是分开的。x86有专门的IO指令(in/out),
但因为它的IO空间是同主存分开的,所以不用
mmap也可以直接用IO指令读写IO地址。

但在别的platform上,IO空间是借用主存地址的,
只要直接对这些地址进行读写就可以了。对这些
地址,倒过来没有IO指令一说了。

mmap_device_io()和mmap_device_memory()
(还有in8/out8等Macro)其实是用来完全隐藏上述
的cross platform的不同的。

这样,比如一个devc-ser8250程序,可以通用于
x86 或是 PPC 上面。在x86上,用 devc-ser8250
ioport=0x3f8 …,在 PPC 上,用devc-ser8250
ioport=0x83002000 …

程序里,mmap_device_io(ioport),然后 in8()/out8()
返回的地址。在 x86 上,mmap_device_io(ioport) == ioport,
而in8()/out8() macro则被译到相应的io指令。

而在PPC上,mmap_device_io(ioport)则会真的将
ioport指向的物理地址映射到程序的虚地址里来。但
in8() /out8()则只是通常的赋值语句罢了
(*(uint8_t *)port = value)

受教.做软件到一定时候.发现硬件知识的缺少,对操作系统的理解还是肤浅.很多东西似是而非.像空中楼阁...

那是不是有mmap_device_memory()就可以操作内存空间了吗?譬如从某个位置读出其值呢?谢谢