17

这是一个需要详细说明的问题:为什么说内核在进程地址空间中?

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

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

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

4

4 回答 4

31

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

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

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

于 2012-10-22T14:55:44.520 回答
13

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

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

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

于 2012-10-22T14:32:14.793 回答
6

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

对不起我的英语不好。我不是以英语为母语的人。

于 2012-10-27T14:48:16.633 回答
4

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

于 2013-07-21T18:05:48.763 回答