物理地址到虚拟地址的转换问题?

winamp123 2009-09-02 03:51:19
2440中UART0寄存器对应的物理地址为 0x50000000,对应的虚拟地址在g_oalAddressTable表中为0x91000000

g_oalAddressTable
DCD 0x91000000, 0x50000000, 1 ; UART control register

而在WINCE下驱动程序中利用 MmMapIoSpace()映射的虚拟地址确实 0x140000.

请问这个地址为什么不等于0x91000000 ?是怎么得到的?
...全文
212 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwAll_Blue 2009-09-04
  • 打赏
  • 举报
回复
g_oaladdresstable的映射是control register的,而MmMapIoSpace()是申请一段虚拟地址空间并和UART DMA地址绑定起来.
dwAll_Blue 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kuron 的回复:]
g_oalAddressTable 表的虚拟地址是供内核使用的,你在驱动里面的地址是又经过一层映射到你的驱动程序空间的虚拟地址
[/Quote]
有根据?
kuronca 2009-09-04
  • 打赏
  • 举报
回复
g_oalAddressTable 表的虚拟地址是供内核使用的,你在驱动里面的地址是又经过一层映射到你的驱动程序空间的虚拟地址
yuanqh20000065 2009-09-03
  • 打赏
  • 举报
回复
用MmMapIoSpace是将物理地址动态映射到虚拟内存,每次映射得到的值可能都不一样。而g_oalAddressTable 表里的地址是静态的、固定不变的。
smallbasket 2009-09-03
  • 打赏
  • 举报
回复
MmMapIoSpace是用于把一个系统物理地址映射到当前的执行流所在的进程虚拟地址空间中,像楼主这种情况转换的是GPIO控制器的基地址,不是UART端口的地址
jiereliyi 2009-09-02
  • 打赏
  • 举报
回复
mark
guopeixin 2009-09-02
  • 打赏
  • 举报
回复
MARK,下班后研究一下源码
gooogleman 2009-09-02
  • 打赏
  • 举报
回复
我也不懂,但是我就看微软上面有说,具体的要看操作系统源码了。
winamp123 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gooogleman 的回复:]

MmMapIoSpace申请的是堆内存,不是直接的虚拟内存,当然不是那个了。


[/Quote]

那这个堆内存地址与物理地址有个什么映射关系? 是在哪里确定的?
gooogleman 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 winamp123 的回复:]
引用 1 楼 gooogleman 的回复:
你的问题我怎么看的有点模糊呢?


也许我没说清楚。

我想问的是:为什么物理地址0x50000000通过MmMapIoSpace函数映射的虚拟地址为0x140000 ?
而不是g_oalAddressTable表中的 0x91000000?
[/Quote]

MmMapIoSpace申请的是堆内存,不是直接的虚拟内存,当然不是那个了。

jscoolman 2009-09-02
  • 打赏
  • 举报
回复
就是,感觉好奇怪,我的DM9000A的驱动上打印出来的信息就是这样
MmMapIoSpace不是到是怎么映射的,而且我在基地址上加偏移量之后还超限
winamp123 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gooogleman 的回复:]
你的问题我怎么看的有点模糊呢?
[/Quote]

也许我没说清楚。

我想问的是:为什么物理地址0x50000000通过MmMapIoSpace函数映射的虚拟地址为0x140000 ?
而不是g_oalAddressTable表中的 0x91000000?
gooogleman 2009-09-02
  • 打赏
  • 举报
回复
你的问题我怎么看的有点模糊呢?

19,518

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧