【发布时间】:2015-04-24 19:23:45
【问题描述】:
这纯粹是学术问题,与任何操作系统无关
我们有 x86 CPU 和运行内存,这个内存类似于一些内存池,它由可以读取或写入的可寻址内存单元组成,通过 CPU 的MOV 指令使用它们的地址(我们可以将内存从 / 移动到这个内存池)。
鉴于我们的程序是内核,我们可以完全访问整个内存池。但是,如果我们的程序不是直接在硬件上运行,内核会创建一些位于物理内存池内的“虚拟”内存池,我们的进程将其视为物理内存池,可以对其进行写入、读取或通常通过调用 sbrk 或 brk (在 Linux 上)来更改其大小。
我的问题是,这个虚拟池是如何实现的?我知道我可以阅读整个 linux 源代码,也许一年就能找到,但我也可以在这里提问:)
我认为正在使用以下 3 种潜在解决方案之一:
- 解释程序的指令(非常无效且不太可能):内核只会读取程序的字节码并单独解释每条指令,例如。如果它看到访问内存的请求,则不允许该进程访问它。
- 创建一些操作系统级别的 API,需要使用这些 API 来读取/写入内存并禁止访问原始内存,这可能同样无效。
- 硬件特性(可能是最好的,但不知道它是如何工作的):内核会说“亲爱的 CPU,现在我将向你发送来自某个非特权进程的指令,请将你的指令限制在内存区域
0x00ABC023 - 0xDEADBEEF”CPU不会让用户进程对内存做任何错误,除了内核批准的范围。
我问的原因是要了解在内核后面运行非特权程序是否有任何开销(让我们不考虑内核本身实现的多线程造成的开销)或在 CPU 上本地运行程序时(没有操作系统) ,以及可能使用类似技术的计算机虚拟化导致的内存访问开销。
【问题讨论】: