assembly - x86 程序集中的地址是虚拟地址还是物理地址?

标签 assembly operating-system

假设我们有一些 x86 指令,例如

mov eax, [ebx]

并且[ebx]的值是某个地址0x123456789

这个地址0x123456789是指虚拟地址还是物理地址?

如果是虚拟的,它是在执行进程的进程虚拟地址空间中,还是在内核虚拟地址空间中?

读取 What Every Programmer Should Know About Memory ,它指出“虚拟地址空间是由内存实现的 CPU 的管理单元(MMU)”。

那么是否存在独立于操作系统的CPU虚拟地址空间呢?除了内核虚拟地址空间之外,为什么还需要这个?如果没有操作系统,CPU 如何执行虚拟到物理的转换?

最佳答案

在 x86 架构中,您无法仅通过查看地址值来区分物理地址和虚拟地址。

在您的示例中10x123456789只是一个地址。
如果启用 paging,则程序执行的每次内存访问都使用虚拟地址。
如果未启用分页,则使用的地址是物理2

但是,由于所有主要操作系统都使用分页,因此每个程序都使用虚拟地址。

<小时/>

So is there a CPU virtual address space independent of the operating system?

CPU是通用芯片,它只为运行软件提供功能。
操作系统可以使用或不使用它们,CPU 不会赋予任何使用任何特殊含义。

这就像询问邮政系统是否独立于发件人/收件人。
是的,它是独立的,因为它并不特别关心谁向谁发送邮件,但正是发件人/收件人使系统变得有用/活跃。
因此,操作系统无论如何都可以使用 CPU 提供的翻译功能。

Why would this be needed in addition to the kernel virtual address space?

我不知道在这种情况下什么是“内核虚拟地址空间”,但通常操作系统无法跟踪程序执行的所有内存访问。
因此它需要硬件支持(读取:特定的CPU功能。读取:分页)来转换它们的访问。

How would the CPU even perform a virtual to physical translation without an operating system?

与执行加法、IO 或任何其他操作的方式相同:它获取指令、执行指令并根据结果/行为更改其状态(包括从虚拟到物理的转换映射)。

这些指令是操作系统内核、JTAG 调试器或宇宙射线大雨编译的结果,这并不重要。

<小时/>

1 在您的示例中,EBX 必须为 0x123456789

2 请注意,虚拟地址可以是逻辑地址(选择器:偏移量)或线性地址(转换后)。如果没有分页,则实际上不会使用术语“物理地址”,而是简单地使用逻辑地址(段:偏移)或线性地址。在上面的上下文中,“物理”意味着“不会进行 MMU 转换”。

关于assembly - x86 程序集中的地址是虚拟地址还是物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41429622/

相关文章:

assembly - DCD指令和IRQ堆栈

c++:有没有办法确保编译器调用两次相同的 const 方法得到相同的结果?

编译 C 代码以在没有操作系统的系统上运行?

c - 信号处理 - 异步函数和多线程应用程序,信号堆栈

operating-system - 除了 malloc/free 之外,程序是否需要操作系统提供其他任何东西?

c++ - 将 ADC(带进位相加)到 C++

assembly - 在MIPS中,何时使用有符号扩展,何时使用零扩展?

c - 在 C 中实现互斥锁

c++ - C/C++ 系统可移植方式更改最大打开文件数

python - 如何创建一个 python 脚本,以便在目录中的 csv 文件在过去 24 小时内未更新时发送电子邮件?