为什么内核映射到与进程相同的地址空间?

问题描述 投票:14回答:4

这是对此问题的详细阐述:Why is kernel said to be in process address space?

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

我只是想知道为什么据说内核在进程地址中进程无法直接访问内核时的空间。我们为什么不说内核有一个不同于进程的独立地址空间,为什么我们不能为内核本身使用不同的页表与进程的页表分开吗?

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

linux memory-management operating-system kernel
4个回答
13
投票

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

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

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


25
投票

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

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

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


6
投票

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

对不起,我英语不好。我不是英语母语人士。


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.