[英]Why is kernel mapped to the same address space as processes?
这是一个要详细说明的问题: 为什么说内核在进程地址空间中?
这可能是一个愚蠢的问题,但它突然出现在我的脑海中。 所有关于进程地址空间和虚拟内存布局的文本都提到进程地址空间为内核保留了空间。 例如,在 32 位系统上,进程地址空间为 4GB,其中 1GB 为 Linux 中的内核保留(在其他操作系统上可能有所不同)。
我只是想知道当一个进程不能直接寻址内核时,为什么说内核在进程地址空间中。 为什么我们不说内核有一个与进程不同的地址空间,为什么我们不能为内核本身设置一个不同的页表,它与进程的页表是分开的?
我能否得到有关 Linux(Debian 或 Ubuntu)特定操作系统的解释?
回答问题的另一部分 - 部分出于效率/性能原因,内核被映射到每个进程地址空间(我敢肯定还有其他原因)。
在大多数现代硬件上,为了执行系统调用和其他内核提供的功能,更改安全级别(从而允许访问其他受保护的页面,如 Alexey 的回答中所述)比更改安全级别更快以及整个虚拟内存映射,以及所有关联的 TLB 缓存刷新以及完整上下文切换中涉及的所有其他内容。
由于系统调用可能是相当频繁的事件,因此在 Linux 和许多其他地方发展起来的设计旨在尽量减少利用内核服务的开销,并将内核代码和(至少部分)数据映射到每个进程中其中。
进程“拥有”这里的整个虚拟地址空间、内核和其中的用户部分。
它无法查看和查看内核代码和数据并不是由于地址空间不同,而是由于页表中设置的访问权限/权限不同。 内核页面的设置方式使得常规应用程序无法访问它们。
然而,习惯上将整个事物的两个部分称为内核空间和用户空间,这可能会造成混淆。
我们说内核在进程地址空间中的另一个重要原因是内核可以访问当前进程的用户代码/数据,即虚拟地址空间0~3G。
抱歉我的英语不好。 我的母语不是英语。
想象一下如果内核没有映射到每个进程地址空间会发生什么。它会出现三重故障,因为说定时器中断发生,然后处理器使用 IDT(中断描述符表)调用 ISR 例程。如果内核没有映射,那么IDT 地址无效,从而导致三重故障。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.