这是一个详细说明这个问题的问题:Why is kernel said to be in process address space?
这可能是一个愚蠢的问题,但它刚刚浮现在我的脑海中。所有 有关进程地址空间和虚拟内存布局的文本 提到进程地址空间有为内核保留的空间。 对于例如在32位系统上,进程地址空间为4GB,其中1 GB是为Linux中的内核保留的(可能在其他操作系统上有所不同)。
我只是想知道为什么内核被称为进程地址 当进程无法直接处理内核时的空间。我们为什么不 说内核有一个单独的地址空间而不是进程和 为什么我们不能为内核本身提供不同的页表 是否与流程的页面表分开?
我可以获得有关linux(debian或ubuntu)特定操作系统的解释。
答案 0 :(得分:23)
为了回答问题的另一部分 - 内核被部分地映射到每个进程地址空间,以达到效率/性能的原因(还有其他一些,我敢肯定)。在大多数现代硬件上,更改安全级别(因此允许访问受其他方式保护的页面,如Alexey的答案中所述)以执行系统调用和其他内核提供的功能比更改安全级别更快以及整个虚拟内存映射,以及所有关联的TLB缓存刷新以及完整上下文切换中涉及的所有其他内容。由于系统调用可能是相当频繁的事件,因此在Linux和许多其他地方发展的设计是尽量减少利用内核服务的开销,并将内核代码和(至少一些)数据映射到每个进程中其中一部分。
答案 1 :(得分:11)
进程“拥有”这里的整个虚拟地址空间,内核及其用户部分。
它无法查看和查找内核代码和数据不是由于不同的地址空间,而是由于页表中设置的访问权限/权限不同。内核页面的设置方式使常规应用程序无法访问它们。
然而,习惯上将整个事物的两个部分称为内核空间和用户空间,这可能会造成混淆。
答案 2 :(得分:6)
我们说内核在进程地址空间中的另一个重要原因是内核可以访问CURRENT进程的用户代码/数据,即虚拟地址空间0~3G。
抱歉我的英语不好。我不是母语为英语的人。
答案 3 :(得分:4)
想象一下如果内核没有映射到每个进程地址空间会发生什么。它会 三重故障,因为说定时器中断发生,然后处理器调用ISR例程 使用IDT(中断描述符表)。如果内核未映射,则IDT地址变为 无效,因此会导致三重错误。