Linux在286上?


15

我没有286,也没有打算在一台Linux上运行。但是,由于286具有保护模式,为什么经常说Linux需要386 CPU或更高版本?

http://tuxmobil.org/286_mobile.html看来,ELKS版本的Linux可以在286上运行,这是正确的吗?进行了哪些修改(如果有的话)以允许内核在286 CPU上运行?

现在,很明显,我知道为386编译的内核无法在286 CPU(16位)上执行。所以我的问题是,为什么不能为286编译标准Linux内核,然后在286上执行呢?Linux是否需要硬件VM86支持?


6
16位是过大的。8位足以运行Linux。参见Dmitry Grinberg的项目。
Marco Marco


Minix在8086(8位,128KiB RAM IIRC)上运行。微软的Xenix确实可以在80286上运行。一些痴迷的人也试图将Linux移植到8086中(取得了一些成功)。但是,不,在如此有限的计算机上无法实现“全面的Linux体验”。
vonbrand 2013年

您可以在Linux上运行非常有限的设备。但这对于台式机来说将不是很有用。除非您陈述自己的目标,否则很难说出“ Linux on 286”对您是否可行。
9000

Answers:


4

286保护模式(PM)从根本上不同于386提供的保护模式。可以将286 PM视为原型,它有很多缺点,几乎没有人使用过它,整个东西是从386开始完全重新设计的。

它没有使用平面内存模型,而是使用了诸如实模式之类的分段模型,这意味着您必须一次跳越圈才能一次访问大于64kB的块中的内存。

它与当时所有可用的(MS-DOS)程序完全不兼容,因此一旦进入PM,您将无法使用任何以前使用过的程序。

除非您重新启动PC,否则您也无法再次退出保护模式,因此制造商想出了一些创新的解决方案,例如在RAM中放置一个标志,然后将一个神奇的值写入键盘控制器,这将使CPU上的复位引脚弹起,从而重新启动PC。机。BIOS要做的第一件事是检测到较早设置的标志,然后它将跳回到原始程序,而不是运行POST例程,从而允许原始程序在“退出” PM后继续运行。

这意味着使用286 PM会使您无法运行正常的DOS程序而没有很多技巧。在只有DOS程序的时候,完全不值得使用PM。

因此,使用286 PM最终要比不使用286 PM和依靠EMS和XMS访问额外的内存更加复杂。许多286主板都支持EMS的芯片组,因此您可以使用所有额外的系统内存而无需PM。

英特尔意识到了这些缺点,并在386中生产了全新的完全不同的PM。平面内存模型使访问内存(最多4GB)变得简单。CPU可以通过两条指令进出PM,因此不需要笨拙的重启协议。VM86意味着在大多数时间甚至不需要退出PM时,您仍可以在PM中运行DOS程序。

所有这些改进意味着386 PM不仅功能更强大,而且兼容性也大大提高。

换句话说,286和386保护模式之间唯一的共同点就是名称。这就是为什么PM操作系统通常为386或更高版本的原因。增加对286 PM的支持将是完全独立的工作,几乎没有代码可以与完全不同的386 PM共享。

相比之下,直到最后一个32位CPU为止,386 PM的工作方式几乎相同,甚至在64位CPU上运行32位软件时也是如此。


3

内核中有部分是用汇编语言编写的,因此必须重写它们才能支持286。

关于ELKS,他们在FAQ中指出这是Linux内核的子集,因此也许他们只移植了绝对必要的东西。


1
286、80287有一个数学协处理器。–
Renan

3

我认为我的问题的真正答案是:

每个主要的CPU体系结构(或其主要版本)除C代码外还需要一些汇编支持代码。

即使您有GCC来将Linux内核编译为16位286机器代码,仍然会缺少与16位286兼容的基本汇编代码。

换句话说,内核最多只能部分构建。任何特定于体系结构的汇编代码都将无法汇编,因为它根本不是针对该体系结构编写的。

基于此,我假设这正是ELKS和类似项目在286或其他体系结构上实现Linux时所做的工作—它们实现了缺少的程序集支持代码。


3

80386除支持内存分段外,还支持分页,而286仅支持内存分段。Linux严重依赖分页支持,即使用平面内存方案,该方案基本上将所有段寄存器设置为0,并使用分页来管理应用程序。为了将Linux移植到286,基本内存管理器需要重新设计才能在分段模式下工作而无需分页,这可能是很多工作。


2

Linux是否需要硬件VM86支持?

我不是一个组装的家伙,但根据

作为8086体系结构的32位扩展的原始实现,80386指令集,编程模型和二进制编码仍然是所有32位x86处理器(称为x86,IA-32或i386)的共同点。 -体系结构,取决于上下文。

386代表了286 的扩展指令集,因此谁知道端口将有多难。显然,几乎没有人愿意去尝试它……我想您可以向ELKS员工问一下。


2

最大的原因是,原始的GNU项目针对32位机器(例如1980年代中期的Unix工作状态)而不是费心去支持任何较小的东西,因此整个GNU工具链不适合16位代码生成。如果GCC能够生成286保护模式代码,那么将比以前任何其他移植目标都更容易使用Linux内核将早期的,需要大量汇编代码的段移植到286上的过程。但是,将GCC定位为286保护模式将是一个庞大的项目,以支持过时的处理器。


1

最近Linux内核已经放弃了386的支撑平台和Linux内核并支持Intel 286 processors..80286不是32位的CPU,这是需要引导。


5
Linux的最初写于1991年在386到286点随后的已经老了,主要的内核树从来没有任何导出的代码来支持286
Flukas88

可能是这样,但问题仍然是为什么会这样?不是为什么要做出决定放弃对286/386的支持(这是显而易见的),而是由于技术原因导致不容易实现支持这种旧处理器的原因是什么?即为什么内核需要32位CPU?为什么不能为286编译内核?
ioctlvoid 2013年

内核不是还需要算术协处理器吗?
Bonsi Scott

不,内核支持数学仿真,至少它以前做过。因此,您甚至可以在FPU损坏的CPU上运行Linux内核。然而,286仍然支持数学协处理器,在80287.
ioctlvoid

在我的答案的编辑部分中,我确实指出仿真是在Linux内核中实现的。它甚至被用于将Linux移植到S / 390(又名IBM Mainframe),因为它在移植时没有浮点单元。
Didi Kohen 2014年

1

Linux x86不能轻易地反向移植到80286,因为它是16位处理器,而Linux x86需要32位处理器。

更具体地说,286上的寄存器仍然只有16位宽。没有EX寄存器可用。而且,内存段和偏移量仍然只有16位长。程序仍然必须处理近/远代码和数据。

这意味着Linux / 286将需要与Linux / 386完全不同的内核和用户API。每个程序集源文件和许多C源文件都需要重写。就像Win16编程与Win32编程之间的区别一样。

简而言之,您不能仅仅告诉GCC为其他CPU进行编译。对于16位环境,每一位代码都需要重写。


1
请考虑使用降价促销以提高可读性。
lord.garbage 2014年

0

从我读过的书中,使Linux在80286上运行的规范方法是在虚拟机中运行它。这就是Fabrice Bellard在这里所做的。您必须自己实施虚拟机,或者移植一个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.