堆栈指针如何从虚拟内存转换为物理内存

时间:2019-07-10 22:44:11

标签: assembly paging virtual-memory

我一直在处理大量程序集,并且在审查虚拟内存时遇到了一些新的困惑。

简而言之,我不明白如何将汇编中的地址(直接与处理器连接的代码)从虚拟地址转换为物理地址。

经常有人告诉我,操作系统处理了从虚拟内存到物理内存的映射,但是程序集直接引用一个地址,而没有任何系统调用,如果不直接调用OS,操作系统将如何进行干预?

使用OS中的页表将地址(移动eax [0xDEADBEEF])从虚拟地址空间转换为物理地址空间在哪里,而无需专门调用OS?

2 个答案:

答案 0 :(得分:1)

仅是因为CPU使用page tables直接支持这种翻译。操作系统会预先设置这些页表,以告诉CPU在引用内存地址时在哪里查看。这就是透明地进行翻译的方式。

答案 1 :(得分:0)

在汇编语言中,您使用逻辑地址。操作系统使用页表将逻辑地址映射到物理地址。 CPU自动将本地地址转换为物理地址。

逻辑地址可能没有映射的物理地址。当CPU遇到这种情况时,它将调用操作系统的页面错误处理程序。

操作系统必须在辅助存储上维护该进程的地址空间的副本。这就是“虚拟”记忆。发生页面错误时,操作系统将确定虚拟内存中是否存在被引用的页面。如果是,则页面错误处理程序会将页面读入物理内存,将页面表更改为,以便逻辑地址映射到正确的物理地址,然后重新启动指令。

如果虚拟页面不存在,则操作系统会引发访问冲突异常。