有些文章说模块/驱动程序属于内核空间,因为它参与形成内核; (参考:http://www.freesoftwaremagazine.com/articles/drivers_linux)
而其他人则说只有 Ring0(直接与硬件交互)可以称为内核空间(排除模块/驱动程序,因为它们位于 Ring2)。 (参考:http://jaseywang.me/2011/01/04/vfs-kernel-space-user-space-2/)
谁能告诉我哪种观点是正确的?
答案1
在 AMD64 及其克隆版本以及 ix86 上,Linux 仅使用环 0 和 3。无论如何,其他常见架构都没有“环”,因此完全使用它们将是完全不可移植的。此外,Linux 是单一的。整个环的想法是能够在环 0 上运行微内核,并让服务进程在更高的环上运行,这样它们就不会弄乱微内核,最后让用户空间在最高环上运行,这是它无法做到的损害很大。
答案2
能提供一下参考吗?我假设您谈论的是 Linux,(据我所知)它仅使用 Rings 0(内核)和 3(用户)。
编辑:
我认为这取决于操作系统的设计。您可以在微内核架构中使用内环。您是否询问特定系统(例如Linux)?我相信只有针对特定操作系统才能回答这个问题。然而,在大多数情况下,基于 x86 的操作系统仅使用“内核”(0) 和“用户”(3)。
答案3
对于传统操作系统(不在虚拟化下运行),内核空间和ring0在权限方面是同义词。然而,我必须分别解释它们,以突出它们存在的差异和共同点。
Kernel space
- 操作系统通常有两种执行模式:内核空间和用户空间。内核空间是操作系统的特权代码(如调度程序、设备驱动程序等)所在的地方。它的任务是管理整个系统,并确保其稳定运行。用户空间包含诸如Web浏览器等的进程,它们使用内核空间提供的功能。
Rings
- 英特尔处理器具有 4 个操作权限级别。这些称为环。环 0 的特权最高,而环 3 的特权最低。计算机内存的任何区域都可以用这些级别来标记。如果一个内存区域被ring0标记为访问,那么只有驻留在ring0中的代码可以访问它,而被ring3标记为访问的内存区域可以被所有环访问。这提供了一种机制,确保如果您在较低权限级别(较高环)中运行不太受信任的代码,而在较高权限级别(较低环)中运行更受信任的代码,则前者无法影响后者。可以通过编程方式设置哪些代码在哪个环(权限级别)中运行。
为了简化设计,并使代码可移植(ARM 等非英特尔 CPU 没有 4 环架构),大多数操作系统仅使用 4 环中的两个。这些通常是ring0 和ring3。内核运行在ring0,构成内核空间(注意,如果明天操作系统开发者让内核运行在ring1,而不是ring0,那么ring1将构成内核空间)。应用程序运行在ring3中,构成用户空间。
这是大多数操作系统遵循的约定。然而,如果我是操作系统开发人员,我可以以任何我想要的方式自由使用环形架构。考虑以下场景
:(堪萨斯州=内核空间,我们=用户空间,DD=设备驱动程序或内核模块,rX= 环 X)
- 堪萨斯州在 r0 中,我们在 r3 中 - 最常用。例如。 Linux、Windows 等
- 堪萨斯州在 r1 中,我们在 r3 - 虚拟化设置中,虚拟机管理程序在 Ring0 中运行。
- 堪萨斯州在 r0 中,DD在 r1 中,我们在 r3 中 - 一些研究项目使用此配置来保护内核免受有缺陷的设备驱动程序的影响。
- 堪萨斯州在 r0 中,DD在 r3 中,我们在 r3 中 - 微内核使用此配置。
- 堪萨斯州在 r0 中,我们在 r0 中 - 一切都在同一个环中。一些研究操作系统(例如 Microsoft 的奇点)使用此配置。使用其他机制保护 KS 免受 US 影响。 (MS DOS、Windows 98 等较旧的操作系统使用了此功能。KS 不受 US 保护,因此操作系统崩溃很频繁。)
- 堪萨斯州在 r3 中,我们在 r0 - 荒谬。给予美国更多特权,将允许美国腐败KS。从来没有见过这样的配置,但是如果我想编写这样的操作系统,没有什么可以阻止我这样做。
注:我在编写时做了一些简化,例如将 x86 架构称为 Intel CPU。现在不要为复杂的事情而烦恼。