mmap_device_io() 和 mmap_device_memory()

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

mmap_device_io() 和 mmap_device_memory()

帖子 xtang » 周五 9月 12, 2003 4:56 am

有朋友来信问起,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)

nakeyfish
Senior Member
帖子: 375
注册时间: 周五 8月 06, 2004 4:12 pm
来自: BJ

帖子 nakeyfish » 周六 9月 30, 2006 11:44 am

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

ruizh
Senior Member
帖子: 30
注册时间: 周一 8月 22, 2005 8:23 am

帖子 ruizh » 周三 11月 08, 2006 1:49 pm

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

回复