【问题标题】:Why is kernel mapped to the same address space as processes?为什么内核映射到与进程相同的地址空间?
【发布时间】:2012-10-12 09:13:32
【问题描述】:

这个问题要细说一下:Why is kernel said to be in process address space?

这可能是一个愚蠢的问题,但它突然出现在我的脑海中。全部 关于进程地址空间和虚拟内存布局的文本 提到进程地址空间有为内核保留的空间。 例如在 32 位系统上,进程地址空间为 4GB,其中 1 GB 是为 Linux 中的内核保留的(在其他操作系统上可能会有所不同)。

我只是想知道为什么说内核在进程地址中 进程无法直接寻址内核时的空间。我们为什么不 说内核有一个与进程不同的地址空间,并且 为什么我们不能为内核本身提供不同的页表 与进程的页表分开?

我能得到关于 Linux(Debian 或 Ubuntu)特定操作系统的解释吗?

【问题讨论】:

    标签: linux memory-management operating-system kernel


    【解决方案1】:

    回答问题的另一部分 - 出于效率/性能原因,内核部分映射到每个进程地址空间(我敢肯定,还有其他原因)。

    在大多数现代硬件上,更改安全级别(从而允许访问受保护的页面,如 Alexey 的回答中所述)以执行系统调用和其他内核提供的功能比更改安全级别更快安全级别和整个虚拟内存映射,以及所有相关的 TLB 缓存刷新以及完整上下文切换中涉及的所有其他内容。

    由于系统调用可能是相当频繁的事件,因此在 Linux 和许多其他地方发展的设计试图最大限度地减少利用内核服务的开销,并将内核代码和(至少部分)数据映射到每个过程是其中的一部分。

    【讨论】:

    • 所以我将其可视化为,有一个主要的 1GB 内核地址空间,在每个进程的虚拟内存区域中都有一个视图/反射。即如果我有 3 个用户进程正在运行,每个进程都有 4GB 虚拟区域。在 4GB 中,每个进程的区域中有 1GB 指向相同的内核地址空间?
    • 是的,本质上这就是内存的映射方式。但是,需要注意的是,由于页表和 TLB 条目中设置的保护位,用户进程无法访问该 1GB 内核区域。
    【解决方案2】:

    一个进程“拥有”这里的整个虚拟地址空间、内核和它的用户部分。

    它无法窥探内核代码和数据不是由于地址空间不同,而是由于页表中设置的访问权限/权限不同。内核页面的设置方式使常规应用程序无法访问它们。

    然而,习惯上将一个整体的两个部分称为内核空间和用户空间,这可能会造成混淆。

    【讨论】:

      【解决方案3】:

      我们说内核在进程地址空间的另一个重要原因是内核可以访问当前进程的用户代码/数据,即虚拟地址空间0~3G。

      对不起,我的英语很差。我不是以英语为母语的人。

      【讨论】:

        【解决方案4】:

        想象一下如果内核没有映射到每个进程地址空间会发生什么。它会 三重故障,因为说定时器中断发生,然后处理器调用 ISR 例程 使用 IDT(中断描述符表)。如果内核未映射,则 IDT 地址变为 无效,因此会导致三重错误。

        【讨论】:

        • 自我上次检查文档以来已经过去了一段时间,但当时 x86 调用/中断门可以跨段传递执行。将 IDT 的选择器设置为 GDT-like 就可以了。内核映射到用户空间的原因主要与性能有关。内核还可以随时设置自己的不同页表来访问它想要的物理内存,但这也会破坏所有缓存并显着降低性能。
        猜你喜欢
        • 2017-05-18
        • 1970-01-01
        • 2017-11-18
        • 2011-11-08
        • 2016-05-05
        • 2019-01-13
        • 2014-06-28
        • 2019-02-19
        • 1970-01-01
        相关资源
        最近更新 更多