社区
嵌入开发(WinCE)
帖子详情
物理地址到虚拟地址的转换问题?
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 ?是怎么得到的?
...全文
268
13
打赏
收藏
物理地址到虚拟地址的转换问题?
2440中UART0寄存器对应的物理地址为 0x50000000,对应的虚拟地址在g_oalAddressTable表中为0x91000000 g_oalAddressTable DCD 0x91000000, 0x50000000, 1 ; UART control register 而在WINCE下驱动程序中利用 MmMapIoSpace()映射的虚拟地址确实 0x140000. 请问这个地址为什么不等于0x91000000 ?是怎么得到的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
你的问题我怎么看的有点模糊呢?
虚拟地址
转换
物理地址
的相关
问题
PAE: 如何开启/关闭PAE CMD 命令:开启:bcdedit /set pae forceenable bcdedit/set{current}nxOptIn 关闭:bcdedit /set pae forcedisable bcdedit/set{current}nxAlwaysOff查看:bcdedit 可以看见修改后的状态 一、未开启PAE Win32通过一个两层表结构来实现地址映射,因为4 GB
虚拟地址
空间为每个进程私有,相应地,每个进程都维护一套自己的层次...
【解答】关于内核中没开MMU之前的
虚拟地址
物理地址
转换
问题
1. 内核没开MMU之前有
虚拟地址
吗?没有MMU哪来的
虚拟地址
? 答:有,因为加载时地址和运行时地址不同导致的没打开MMU之前也会有虚实地址
问题
。 2. 加载时地址和运行时地址什么区别,为什么有这种区别? 答:加载时地址:把可执行文件放到物理内存的内存地址,例如把镜像放到0x80000000地址处,则加载时地址=0x80000000 运行时地址:镜像生成后的
虚拟地址
,由编译器和连接脚本决定
ARM Linux
虚拟地址
转换
为内存
物理地址
项目中经常需要把内存数据dump出来看看是否与自己设想的一样,dump之前我们需要把内核的
虚拟地址
先
转换
为
物理地址
才能借助工具dump出来。废话不多说,直接说正题。1. 内核里的地址是从3G开始算的,即起始地址为:0xc00000002. ARM小机端的内存起始地址并不是0,而是0x40000000也就是说
虚拟地址
与物理内存起始地址两者的差为:0x80000000那如果要将内核的
虚拟地址
转换
为物理
关mmu运行linux内核,【解答】关于内核中没开MMU之前的
虚拟地址
物理地址
转换
问题
...
1. 内核没开MMU之前有
虚拟地址
吗?没有MMU哪来的
虚拟地址
?答:有,因为加载时地址和运行时地址不同导致的没打开MMU之前也会有虚实地址
问题
。2. 加载时地址和运行时地址什么区别,为什么有这种区别?答:加载时地址:把可执行文件放到物理内存的内存地址,例如把镜像放到0x80000000地址处,则加载时地址=0x80000000运行时地址:镜像生成后的
虚拟地址
,由编译器和连接脚本决定。内核镜像放到内...
虚拟地址
-
物理地址
如果在没有虚拟内存和分⻚机制的情况下,每⼀个⽤⼾程序在物理内存上所对应的空间必须是连续的,如下图:因为每⼀个程序的代码、数据⻓度都是不⼀样的,按照这样的映射⽅式,物理内存将会被分割成各种离散的、⼤⼩不同的块。经过⼀段运⾏时间之后,有些程序会退出,那么它们占据的物理内存空间不可以被回收,导致这些物理内存都是以很多碎⽚的形式存在。怎么办呢?我们希望操作系统提供给用户的空间必须是连续的,但是物理内存最好不要连续。
嵌入开发(WinCE)
19,523
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章