当前位置: 技术问答>linux和unix
虚拟地址到物理地址转换是哪部分器件做的?在什么时间?
来源: 互联网 发布时间:2017-05-20
本文导语: 问题描述 某个变量A,他的逻辑地址是0x10000001 被映射到的物理地址是0x50000001 一条store 指令(假设存在这条指令) store value address (把value的值存到address地址上) 在程序中有一条 指令1: store 125 0x10000001 问题: 1....
问题描述
某个变量A,他的逻辑地址是0x10000001
被映射到的物理地址是0x50000001
一条store 指令(假设存在这条指令) store value address (把value的值存到address地址上)
在程序中有一条 指令1: store 125 0x10000001
问题:
1.在有操作系统(启用虚拟内存)的情况下,指令在进入cpu执行之前,是使用的虚拟地址还是物理地址?
也就是指令1 在取指之后,它的内容是store 125 0x1000001还是store 0x50000001?
2.虚拟地址到物理地址的转换是在指令执行前进行的还是执行之后(实际访存)的时候转换的?
(我感觉是在程序执行完之后访存时,如果这样的话cpu实际操作的是虚拟地址)
附加一个问题:
ARM中的虚拟地址(不同的物理芯片映射到连续的虚拟地址上)他们都需要MMU支持,跟OS中的虚拟地址有什么异同?
谢谢
|
你的问题我可以全部回复~~
1)应该说所有的CPU开启MMU后,都是访问虚拟地址;CPU是不知道物理地址的;
知道这个,你就对取指前取指后,没有疑问了吧,CPU本来就是处理的虚拟地址;然后地址再经过MMU处理,最终投递到物理地址总线。
2)linux下的虚拟内存空间按1:3分;上面的1G留给内核空间;然后内核空间的NORMAL区又是直接映射到物理内存地址;然后HIGH_MEMORY区是动态临时映射大于896M的内存区。
解释的对的话,忘给分。
1)应该说所有的CPU开启MMU后,都是访问虚拟地址;CPU是不知道物理地址的;
知道这个,你就对取指前取指后,没有疑问了吧,CPU本来就是处理的虚拟地址;然后地址再经过MMU处理,最终投递到物理地址总线。
2)linux下的虚拟内存空间按1:3分;上面的1G留给内核空间;然后内核空间的NORMAL区又是直接映射到物理内存地址;然后HIGH_MEMORY区是动态临时映射大于896M的内存区。
解释的对的话,忘给分。
|
是要在执行之后才去映射的,因为你要执行store 125 0x1000001, CPU要先读取的的逻辑地址,然后转换成线性地址,最后转换为物理地址然后再把125往物理地址上存储. 在程序里操作的都是逻辑地址, 根本不需要知道物理地址是多少.
|
|
参考《深入理解linux内核》第二章 内存寻址
|
MMU Memory Management Unit
|
这个问题我说不清了
|
我感觉操作系统里一般都是使用经过MMU映射的虚拟地址,真正需要把数据写到物理磁盘时再根据那个映射关系操作物理地址,操作系统里对物理寄存器进行操作都要先映射成虚拟地址,然后写值