用户程序的内核模式

Kernel mode for user program

我知道内核模式是一种特权,因此在内核模式下所有硬件功能和指令集中的所有指令都可用。我还知道,当我们进行过程调用(比如 read())时,它又会进行系统调用。但在此之前它陷入内核模式。我想知道如果每个用户程序都可以 运行 在内核模式下使用内核模式会有什么用,因为所有过程调用和系统调用都可供用户程序使用。

OS 的硬件、文件和其他安全关键部分的问题在于,它们只能以正确的方式进行操作,否则OS 会损坏(或者会发生其他不好的事情)。

如果没有内核用户分离,应用程序本身会提供与 OS 关键部分一起工作的代码。这个 code 可以是 any。因此,格式错误的应用程序可能会损坏 OS.

在内核-用户分离的情况下,应用程序接触硬件的唯一方法是系统调用。这允许 运行 只有 有限的代码 与 OS 的安全关键部分一起工作。应用程序无法修改该代码

因此,在正确编写处理系统调用的代码后,OS 可以保护其关键部分免受格式错误的应用程序的影响。

分隔地址 spaces 有几个原因。

第一个是安全。每个程序都可以调用内核,但内核不必强制执行。例如,您可以尝试以非特权用户的身份要求内核 open("/dev/sda", O_RDWR),看看会发生什么。内核将防止您搞砸其他用户正在使用的系统。

第二个是方便。在很多嵌入式系统上,确实没有userspace。所以让我们假设我们正在内核中编写我们的程序。现在我们的程序有一个小错误,它崩溃了,或者覆盖了重要的内存。在大多数情况下,这会搞砸地址 space,您需要一个新地址 space。但是如果你只有一个地址 space,到达那里的唯一方法就是重启。

第三个是同步。例如,如果两个进程要使用内存,它们需要相互配合才能不使用同一个内存块。如果一个程序有错误,它可能会给许多其他程序带来问题。强制通过程序强制遵守的API来完成内存管理意味着任何程序都不会出现这样的问题。