【问题标题】:How does kernel restrict processes to their own memory pool?内核如何将进程限制在自己的内存池中?
【发布时间】:2015-04-24 19:23:45
【问题描述】:

这纯粹是学术问题,与任何操作系统无关

我们有 x86 CPU 和运行内存,这个内存类似于一些内存池,它由可以读取或写入的可寻址内存单元组成,通过 CPU 的MOV 指令使用它们的地址(我们可以将内存从 / 移动到这个内存池)。

鉴于我们的程序是内核,我们可以完全访问整个内存池。但是,如果我们的程序不是直接在硬件上运行,内核会创建一些位于物理内存池内的“虚拟”内存池,我们的进程将其视为物理内存池,可以对其进行写入、读取或通常通过调用 sbrkbrk (在 Linux 上)来更改其大小。

我的问题是,这个虚拟池是如何实现的?我知道我可以阅读整个 linux 源代码,也许一年就能找到,但我也可以在这里提问:)

我认为正在使用以下 3 种潜在解决方案之一:

  • 解释程序的指令(非常无效且不太可能):内核只会读取程序的字节码并单独解释每条指令,例如。如果它看到访问内存的请求,则不允许该进程访问它。
  • 创建一些操作系统级别的 API,需要使用这些 API 来读取/写入内存并禁止访问原始内存,这可能同样无效。
  • 硬件特性(可能是最好的,但不知道它是如何工作的):内核会说“亲爱的 CPU,现在我将向你发送来自某个非特权进程的指令,请将你的指令限制在内存区域 0x00ABC023 - 0xDEADBEEF”CPU不会让用户进程对内存做任何错误,除了内核批准的范围。

我问的原因是要了解在内核后面运行非特权程序是否有任何开销(让我们不考虑内核本身实现的多线程造成的开销)或在 CPU 上本地运行程序时(没有操作系统) ,以及可能使用类似技术的计算机虚拟化导致的内存访问开销。

【问题讨论】:

标签: c memory assembly kernel


【解决方案1】:

在正常系统上,内存保护是在 MMU 或内存管理单元上实施的,这是一个可配置地将虚拟地址映射到物理地址的硬件块。只允许内核直接配置它,非法操作或进入未映射页面的操作会向内核引发异常,然后内核可以对违规进程进行纪律处分或酌情从磁盘中获取丢失的页面。

虚拟机通常使用 CPU 硬件功能来捕获和模拟特权操作或那些过于字面上与硬件状态交互的操作,同时允许普通操作直接运行,因此总体速度损失适中。如果这些都不可用,则必须模拟整个事物,这确实很慢。

【讨论】:

  • 或者可能不是太宽泛 :) 你知道任何没有硬件支持的具有内存保护的操作系统吗?
【解决方案2】:

当您提到硬件功能时,您就走在了正确的轨道上。这是一项称为 protected mode 的功能,由 Intel 在 80286 模型上引入 x86。这随着时间的推移而发展和变化,目前 x86 有 4 种模式。

处理器开始在实模式下运行,之后特权软件(ring0,例如您的内核)可以在这些模式之间切换。

使用处理器支持的paging mechanism (How does x86 paging work?) 实现和强制执行虚拟寻址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2021-09-08
    • 1970-01-01
    • 2015-07-27
    • 2011-06-06
    • 2014-08-05
    相关资源
    最近更新 更多