堆栈指针如何从虚拟内存转换为物理内存
How are stack pointers converted from virtual to physical memory
我一直在处理大量的程序集,并且在检查虚拟内存时我 运行 陷入了一些新的困惑。
简而言之,我不明白汇编中的地址(直接与处理器接口的代码)如何从虚拟地址转换为物理地址。
我总是被告知操作系统处理从虚拟内存到物理内存的映射,但是程序集直接引用一个地址而没有任何系统调用,如果不直接调用,OS 怎么会干预?
地址 (mov eax, [0xDEADBEEF]) 在何处使用 table 中的页 table 从虚拟地址 space 转换为物理地址 space =18=] 而不是专门调用 OS?
只是因为 CPU 直接支持那种翻译,使用 page tables。 OS 预先设置这些页表以告诉 CPU 在引用内存地址时去哪里查找。这就是翻译透明发生的方式。
在汇编语言中,您使用逻辑地址。操作系统使用页表将逻辑地址映射到物理地址。 CPU 自动将本地地址转换为物理地址。
逻辑地址可能没有映射到它的物理地址。当 CPU 遇到这种情况时,它会调用操作系统的页面错误处理程序。
操作系统必须在辅助存储上维护进程地址的副本 space。这是 "virtual" 记忆。当发生页面错误时,操作系统会确定被引用的页面是否存在于虚拟内存中。如果是,页面错误处理程序将该页面读入物理内存,更改页表以使逻辑地址映射到正确的物理地址,然后重新启动指令。
如果虚拟页不存在,操作系统会抛出访问冲突异常。
我一直在处理大量的程序集,并且在检查虚拟内存时我 运行 陷入了一些新的困惑。
简而言之,我不明白汇编中的地址(直接与处理器接口的代码)如何从虚拟地址转换为物理地址。
我总是被告知操作系统处理从虚拟内存到物理内存的映射,但是程序集直接引用一个地址而没有任何系统调用,如果不直接调用,OS 怎么会干预?
地址 (mov eax, [0xDEADBEEF]) 在何处使用 table 中的页 table 从虚拟地址 space 转换为物理地址 space =18=] 而不是专门调用 OS?
只是因为 CPU 直接支持那种翻译,使用 page tables。 OS 预先设置这些页表以告诉 CPU 在引用内存地址时去哪里查找。这就是翻译透明发生的方式。
在汇编语言中,您使用逻辑地址。操作系统使用页表将逻辑地址映射到物理地址。 CPU 自动将本地地址转换为物理地址。
逻辑地址可能没有映射到它的物理地址。当 CPU 遇到这种情况时,它会调用操作系统的页面错误处理程序。
操作系统必须在辅助存储上维护进程地址的副本 space。这是 "virtual" 记忆。当发生页面错误时,操作系统会确定被引用的页面是否存在于虚拟内存中。如果是,页面错误处理程序将该页面读入物理内存,更改页表以使逻辑地址映射到正确的物理地址,然后重新启动指令。
如果虚拟页不存在,操作系统会抛出访问冲突异常。