Operating system 内核模式与内存保护

Operating system 内核模式与内存保护,operating-system,kernel,osdev,Operating System,Kernel,Osdev,在操作系统用户模式下,应用程序的虚拟地址空间是私有的,一个应用程序不能更改属于另一个应用程序的数据。每个应用程序都独立运行,如果某个应用程序崩溃,则崩溃仅限于该应用程序。其他应用程序和操作系统不受崩溃的影响 为什么在内核模式下,操作系统不保护内存和BOSD会发生???首先,在某种程度上,您将始终拥有一个不会失败的组件™. 如果此组件崩溃,则无法恢复。例如,如果您将正在运行的进程表丢弃,则除了重新启动之外,无法重建该表。因此,即使内存保护将此组件的崩溃限制为仅影响其自身,也可能会发生BSODs(或

在操作系统用户模式下,应用程序的虚拟地址空间是私有的,一个应用程序不能更改属于另一个应用程序的数据。每个应用程序都独立运行,如果某个应用程序崩溃,则崩溃仅限于该应用程序。其他应用程序和操作系统不受崩溃的影响


为什么在内核模式下,操作系统不保护内存和BOSD会发生???

首先,在某种程度上,您将始终拥有一个不会失败的组件™. 如果此组件崩溃,则无法恢复。例如,如果您将正在运行的进程表丢弃,则除了重新启动之外,无法重建该表。因此,即使内存保护将此组件的崩溃限制为仅影响其自身,也可能会发生BSODs(或等效程序)

但你的观点是正确的——有许多组件通常可以在没有灾难性故障的情况下重置。例如,驱动程序或网络堆栈。事实上,有些操作系统在这个级别上提供保护—它们被称为

然而,微内核的问题是性能。在x86 CPU上,通过两件事实现内存保护(CPL或“”)、0(最大访问)和3(用户模式)之间的数字以及。页表将虚拟地址映射到物理地址,并在每个页上设置访问限制(4096字节内存块)。每个进程都有自己的页表,页表中的每个页都可以通过设置最大CPL、只读标志、无执行标志或无访问标志来限制

更改CPL是一个相对快速的操作(尽管在允许您这样做的方式和时间上存在安全限制)。但是,更改页表的成本相当高,因为它需要清除CPU上名为(TLB)的缓存

通常在普通操作系统中,操作系统将为用户进程保留最低的xGB内存(3GB通常是为32位体系结构选择的数字)。上限(4-X)GB直接映射到第一个(4-X)GB的物理内存,并且仅限于CPL 0(“环0”)。因此,内核可以将其私有数据结构放在1GB以上的位置,并始终在相同的虚拟地址访问它们,而不管运行的是什么进程。如果一个进程进行一个系统调用,需要六个子系统来完成一些事情,没问题——您可以在它们之间调用函数

然而,在微内核系统中,每个内核子系统都有自己的页表和地址映射。要为用户调用提供服务,CPU可能需要对页表进行多次更改,这会对性能造成影响。此外,每个子系统都需要准备好处理其依赖项的故障,这增加了系统的复杂性。由于这些问题,微核大体上只被用作研究和玩具操作系统(例如)


也就是说,近年来,宏内核和微内核之间的界限有些模糊。例如,在Windows7中,图形驱动程序实际上与内核的其余部分隔离;如果它崩溃,系统可以恢复。在Linux和OS X中,可以在用户空间中加载文件系统驱动程序;事实上,这些系统上的NTFS驱动程序使用了这种机制。

谢谢你bdonlan。但我的问题很简单。我想知道“为什么操作系统不隔离内存(每个组件和KMD)在内核模式下???@AS,我解释过。微内核实际上隔离了内存。正因为如此,它们的速度很慢。对我来说,这听起来像是一个关于osdev的问题。。。