为啥说内核在进程地址空间中?
Posted
技术标签:
【中文标题】为啥说内核在进程地址空间中?【英文标题】:Why is kernel said to be in process address space?为什么说内核在进程地址空间中? 【发布时间】:2011-11-08 16:40:22 【问题描述】:这可能是一个愚蠢的问题,但它突然出现在我的脑海中。所有关于进程地址空间和虚拟内存布局的文本都提到进程地址空间有 为内核保留的空间。例如在 32 位系统上,进程地址空间为 4GB,其中 1GB 为 Linux 中的内核保留(在其他操作系统上可能不同)。
我只是想知道当一个进程不能直接寻址内核时,为什么说内核在进程地址空间中。为什么我们不说内核有一个与进程不同的地址空间,为什么我们不能为内核本身提供一个与进程的页表分开的不同页表?
【问题讨论】:
你能识别一个或多个特定的 URL,这些 URL 描述了进程地址空间如何为内核保留空间?它当然不是通用的。我可以肯定的是,有 32 位系统(不一定基于 Linux)在单个进程中使用超过 3 GiB 的共享内存,这不会为内核留下 1 GiB。 我只是举了一个例子,一些空间是为内核保留的。细节对问题没有那么重要。 【参考方案1】:当进程进行系统调用时,我们不需要切换页表(从进程地址空间页表到内核地址空间页表)来为系统调用提供服务(这应该只在内核模式下进行) .这就是说内核是在进程上下文中运行的。
一些不会在进程上下文中运行的内核事件将只为内核加载页表。
知道了吗?
【讨论】:
好的。但是切换页面的严重程度会影响性能。同样根据flylib.com/books/en/3.126.1.91/1 OSX 正是这样做的。 “Mac OS X 不会将内核映射到每个用户地址空间,因此每个用户/内核转换(在任一方向上)都需要一个地址空间切换”,而且对我来说似乎并不慢。 TLB(Transition Lookaside Buffer)会在每次页表切换时重置,这会浪费很多时间。 对此进行了一次更新,因为自从发布此问题以来情况发生了一些变化,我只是偶然发现了它,所以其他人也可能如此。 :) 这个答案中描述的内容不再完全如此。发现了一个名为 MELTDOWN 的漏洞,该漏洞导致能够访问页表中的内核页面。这导致内核切换到为每个进程使用两个页表,一个带有内核映射(用于系统调用),另一个没有(常规进程空间)。根据 CPU,TLB 现在可能会自动刷新,或者只是与该进程相关的条目。以上是关于为啥说内核在进程地址空间中?的主要内容,如果未能解决你的问题,请参考以下文章