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



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

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

我只是想知道为什么内核在流程地址中 当一个过程无法直接解决内核时的空间。我们为什么不 说内核比一个过程和过程都有单独的地址空间 为什么我们不能为内核本身有不同的页面表 与过程的页面表分开?

我可以就特定操作系统(debian或ubuntu)的特定操作系统得到解释吗?

回答问题的另一部分 - 出于效率/绩效原因,内核被映射到每个过程中,部分地介绍了空间(我敢肯定)。

在大多数现代硬件上,更改安全级别(因此允许访问Alexey答案中提到的本其他受保护的页面),以执行系统呼叫和其他内核提供的功能,而不是更改的功能安全级别和整个虚拟内存映射,以及所有关联的TLB缓存冲洗以及完整上下文开关中涉及的其他所有内容。

由于系统调用可能是相当频繁的事件,因此在Linux和许多其他地方演变的设计可以最大程度地减少利用内核服务的开销,并映射内核代码,并且(至少有一些)数据中过程是其中的一部分。

一个过程"在此处拥有"整个虚拟地址空间,内核和用户部分。

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

但是,习惯将整个事物的两个部分称为内核空间和用户空间,这可能会令人困惑。

我们说内核在过程地址空间中的另一个重要原因是内核可以访问当前过程的用户代码/数据,即虚拟地址空间0〜3G。p>对不起,我的英语不好。我不是说英语的人。

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

最新更新