这是一个需要详细说明的问题:Why is kernel said to be in process address space?
这也许是个愚蠢的问题,但它突然出现在我的脑海中。所有关于进程地址空间和虚拟内存布局的文本都提到进程地址空间为内核保留了空间。例如,在32位系统上,进程地址空间为4GB,其中1GB保留给Linux中的内核(在其他操作系统上可能有所不同)。 我只是想知道为什么说内核在进程地址空间中,而进程不能直接寻址内核。为什么我们不说内核有一个独立的地址空间而不是一个进程,为什么我们不能为内核本身提供一个不同的页面表,它与进程的页表是分开的?
我能得到关于Linux (Debian或Ubuntu)特定操作系统的解释吗?
发布于 2012-10-22 14:32:14
一个进程“拥有”这里的整个虚拟地址空间、内核和它的用户部分。
它不能查看和戳内核代码和数据不是由于不同的地址空间,而是由于在页面表中设置了不同的访问权限/权限。内核页的设置方式使常规应用程序无法访问它们。
然而,习惯上将整个事物的两个部分称为内核空间和用户空间,这可能会让人感到困惑。
发布于 2012-10-22 14:55:44
为了回答问题的另一部分,内核被映射到每个进程的地址空间中,这部分是出于效率/性能的原因(我肯定还有其他的)。
在大多数现代硬件上,为了执行系统调用和其他内核提供的功能,可以更快地更改安全级别(从而允许访问其他受保护的页面,如Alexey的答案所述),而不是更改安全级别和整个虚拟内存映射,以及所有相关的TLB缓存刷新和与全上下文开关有关的所有其他内容。
由于系统调用可能是相当频繁的事件,Linux和许多其他地方为尽量减少利用内核服务和将内核代码和(至少部分)数据映射到每个进程的开销而发展起来的设计就是其中的一部分。
发布于 2012-10-27 14:48:16
内核位于进程地址空间的另一个重要原因是内核可以访问当前进程的用户代码/数据,即虚拟地址空间0~3G。
对我糟糕的英语很抱歉。我不是以英语为母语的。
https://stackoverflow.com/questions/13013491
复制相似问题