Linux 总是将用户空间和内核空间分开吗?

Linux 总是将用户空间和内核空间分开吗?

我回想起最近的编程入门,记得编写了一个 C++ 程序,该程序故意随机读取和写入内存地址。我这样做是为了看看会发生什么。

令我惊讶的是,在我的 Windows 98 PC 上,我的程序会产生一些非常奇怪的副作用。有时它会切换操作系统设置,或产生图形故障。通常它不会执行任何操作或只是使整个系统崩溃。

我后来才知道这是因为 Windows 98 没有限制用户进程可以访问的内容。我可以读取和写入其他进程甚至操作系统使用的 RAM。

据我了解,随着 Windows NT 的出现,这种情况发生了变化(尽管我认为花了一段时间才得到纠正)。现在,Windows 会阻止您查看不属于您的进程的 RAM。

我依稀记得后来在 Linux 系统上运行我的程序并没有得到那么多有趣的结果。如果我理解正确的话,这至少部分是由于用户空间和内核空间的分离造成的。

所以,我的问题是:

Linux 是否曾一度没有将用户空间和内核空间分开?换句话说,我的流氓程序是否曾经对 Linux 系统造成过类似的破坏?

答案1

Linux 一直通过阻止用户空间直接访问其使用的内存来保护内核;它还始终保护进程不直接访问彼此的内存。程序只能通过虚拟地址空间访问内存,虚拟地址空间可以访问内核为其映射的内存;访问分配的内存之外会导致分段错误。 (程序可以通过系统调用和驱动程序访问内核,包括臭名昭著的/dev/mem/dev/kmem;它们还可以相互共享内存。)

MMU 是在 Unix/Linux 内核内部吗?或者只是在有自己的内存的硬件设备中?解释了当今 Linux 中如何处理内核/用户分离(Linux 的早期版本以不同方式处理此问题;请参阅Linux 内存管理概述80386内存管理了解详情)。

一些与 Linux 相关的项目取消了这种分离;例如可嵌入式 Linux 内核子集是与 8086 CPU 兼容的 Linux 子集,因此它不提供硬件强制保护。µClinux为没有内存管理单元的嵌入式系统提供支持,其核心“成分”现在是主线内核的一部分,但这种配置在“PC”架构上是不可能的。

答案2

Linux 是否曾一度没有将用户空间和内核空间分开?

这取决于您如何定义术语“Linux”、“用户空间”和“内核空间”。

还记得 Linus Torvalds 最初是如何创建 Linux 的吗? Linus 攒了一些钱给自己买了一台(当时最先进的)配备 Intel 80386 CPU 的 PC。他想了解 80386 的工作原理,他认为最好的方法是在 80386 汇编中编写一些低级硬件代码。同时,他对自己用来登录大学的Minix下运行的终端仿真器的性能也不满意。

于是,他决定用80386程序集编写一个可以直接启动的终端仿真器。为此,他需要编写一个引导加载程序、一个键盘驱动程序、一个(字符)显示驱动程序、一个串行驱动程序以及用于连接到大学的任何协议的驱动程序。

很快,他发现他也想从大学下载文件,所以他必须实现一些文件传输协议(可能是 ZMODEM,但也许为了简单他选择了 XMODEM)以及硬盘驱动器、分区表解析器和文件系统Minix 文件系统的驱动程序。因为他还想在终端仿真器执行一些长时间运行的操作(例如文件下载)时继续工作,所以他实现了多线程。

此时,他意识到自己已经实现了操作系统的一些重要部分,因此他认为将终端模拟器变成操作系统将是另一个有趣的项目。

此后的某个时刻,他不小心输错了命令,并用备份覆盖了他的 Minix 分区。现在他面临一个选择:重新安装 Minix 或完成他的操作系统并使用它。

当他的操作系统能够运行简单的程序时,他决定将其上传到大学的FTP服务器上,并将其命名为Freax(他认为以自己的名字命名是自命不凡和傲慢的)。不过,FTP 服务器的系统管理员不喜欢这个名称,并决定将文件重命名为 Linux,他认为这听起来更好。

又过了一段时间,Linus 在他的著名演讲中首次公开提及 Linux,他表示 Linux 与 80386 的联系如此紧密,以至于它永远无法移植到其他任何东西,并且他预测 Linux 永远不会变得庞大和专业。

现在的问题是:在这个旅程的哪个点上,“Linux”变成了“Linux”,在这个旅程的哪个点上,Linux 变成了“内核”,因此谈论用户和内核空间的分离甚至有意义?

正如我在一开始所说的:这实际上取决于您如何定义这些术语。

换句话说,我的流氓程序是否曾经对 Linux 系统造成过类似的破坏?

在其发展过程中肯定有一段时间,后来成为操作系统并被称为“Linux”的软件没有任何保护,拥有足够复杂的服务,以至于你可以将其称为“内核”,并且具有足够的独立性。您可以将这些子系统称为“程序”。例如,在“真正的”Unix 系统中,终端仿真器和文件传输通常是两个独立的程序,并且协调这两个程序并包含用于访问串行端口、硬盘、屏幕、键盘,文件系统就是内核。

但这个软件是“Linux”吗?我将把它留给你来决定。

答案3

是的,Linux一直需要MMU来进行内存保护。许多人将其移植到没有 MMU 的小型嵌入式系统,但不再有完整的内存保护,因此进程可以读/写几乎所有内容

相关内容