我没有 286,也不打算在其中运行 Linux。但是既然286有保护模式,为什么经常说Linux需要386或更高的CPU呢?
从http://tuxmobil.org/286_mobile.html看来ELKS版本的Linux可以在286上运行,这是正确的吗?为了允许内核在 286 CPU 上运行,进行了哪些(如果有)修改?
现在显然我明白为 386 编译的内核无法在 16 位的 286 CPU 上执行。所以我的问题是,为什么不能为286编译标准Linux内核,然后在286上执行? Linux需要硬件VM86支持吗?
答案1
286 保护模式 (PM) 与 386 提供的功能有根本不同。将 286 PM 视为原型,它有很多缺点,几乎没有人使用过它,而整个系统是针对 386 完全重新设计的。
它没有使用平面内存模型,而是使用像实模式这样的分段模型,这意味着您必须一次跨越 64kB 的块来访问内存。
它与当时所有可用的(MS-DOS)程序完全不兼容,因此一旦进入 PM,您就无法使用任何您习惯的程序。
除非重新启动 PC,否则您也无法再次离开保护模式,因此制造商提出了创造性的解决方案,例如在 RAM 中放置一个标志,然后向键盘控制器写入一个神奇值,这将轻弹 CPU 上的重置引脚以重新启动计算机。机器。 BIOS 要做的第一件事是检测之前设置的标志,然后跳回原始程序而不是运行 POST 例程,从而允许原始程序在“退出”PM 后继续运行。
这意味着使用 286 PM 会阻止您在没有大量技巧的情况下运行正常的 DOS 程序。在只有 DOS 程序的时代,使用 PM 根本不值得。
因此,使用 286 PM 比没有它并依赖 EMS 和 XMS 访问额外内存更加复杂。许多 286 主板都具有对 EMS 的芯片组支持,因此您可以使用所有额外的系统内存,而无需 PM。
Intel 认识到了这些缺点,并在 386 中生产了一种全新的完全不同的 PM。扁平内存模型使得访问高达 4GB 的内存块变得简单。 CPU 可以通过几条指令进入和退出 PM,因此不需要笨拙的重启协议。 VM86意味着大多数时候你甚至不需要退出PM,你就可以在PM中运行DOS程序。
所有这些改进意味着 386 PM 不仅功能更强大,而且兼容性也显着增强。
换句话说,286 和 386 保护模式唯一的共同点就是名称。这就是 PM 操作系统通常为 386 或更新版本的原因。添加对 286 PM 的支持将是一项完全独立的工作,几乎或根本没有代码能够与完全不同的 386 PM 共享。
相比之下,386 PM 的工作方式几乎相同,直到最后一个 32 位 CPU,如果您在 64 位 CPU 上运行 32 位软件,甚至更久。
答案2
内核中的某些部分是用汇编语言编写的,必须重写它们才能支持 286。
关于 ELKS,在他们的 FAQ 中他们指出它是 Linux 内核的一个子集,所以也许他们只移植了绝对必要的部分。
答案3
我认为我的问题的真正答案是这样的:
除了 C 代码之外,每个主要的 CPU 架构(或其主要修订版)都需要一些汇编支持代码。
即使你让 GCC 将 Linux 内核编译成 16 位 286 机器代码,仍然会缺少必要的 16 位 286 兼容汇编代码。
换句话说,内核最多只能构建部分。任何特定于体系结构的汇编代码都将无法汇编,因为它根本不是为该体系结构编写的。
基于此,我假设这正是 ELKS 和类似项目在 286 或其他架构上实现 Linux 时所做的事情——它们实现了缺少的汇编支持代码。