Linux en un 286?


15

No tengo un 286 ni tengo la intención de ejecutar Linux en uno. Sin embargo, dado que el 286 tiene modo protegido, ¿por qué se dice con frecuencia que Linux requiere una CPU 386 o superior?

Desde http://tuxmobil.org/286_mobile.html parece que la versión ELKS de Linux puede ejecutarse en un 286, ¿es esto correcto? ¿Qué modificaciones (si alguna) se han realizado para permitir que el núcleo se ejecute en la CPU 286?

Ahora, obviamente, entiendo que un núcleo compilado para un 386 no puede ejecutarse en una CPU 286, que es de 16 bits. Entonces mi pregunta es, ¿por qué no se puede compilar el kernel estándar de Linux para un 286 y luego ejecutarlo en un 286? ¿Linux requiere soporte de hardware VM86?


66
16 bits es exagerado. 8 bits son suficientes para ejecutar Linux. Ver el proyecto de Dmitry Grinberg.
Marco


Minix se ejecutó en 8086 (8 bits, 128KiB RAM IIRC). El Xenix de Microsoft se ejecutó en 80286. Algunas almas dementes también trataron de calzar Linux en 8086 (con cierto éxito). Pero no, la "experiencia completa de Linux" no será posible en una máquina tan limitada.
vonbrand

Puede calzar Linux para que se ejecute en dispositivos muy limitados. Pero esto no va a ser muy útil como, por ejemplo, una máquina de escritorio. A menos que establezca sus objetivos, es difícil saber si 'Linux on 286' es viable para usted.
9000

Respuestas:


4

El modo protegido (PM) 286 es fundamentalmente diferente de lo que ofrece el 386. Piense en el 286 PM como un prototipo, que tenía tantas deficiencias que casi nadie lo usó, y todo fue completamente rediseñado desde cero para el 386.

No usaba un modelo de memoria plana, usaba un modelo segmentado como el modo real, lo que significaba que tenía que saltar a través de aros para acceder a la memoria en bloques de más de 64kB a la vez.

Era completamente incompatible con todos los programas (MS-DOS) disponibles en ese momento, por lo que una vez que estaba en PM no podía usar ninguno de los programas a los que estaba acostumbrado.

Tampoco podría volver a salir del modo protegido a menos que reiniciara la PC, por lo que los fabricantes idearon soluciones creativas como colocar una bandera en la RAM y luego escribir un valor mágico en el controlador del teclado, que movería el pin de reinicio en la CPU para reiniciar el máquina. Lo primero que haría el BIOS sería detectar el conjunto de indicadores anterior, donde luego volvería al programa original en lugar de ejecutar la rutina POST, permitiendo que el programa original continúe ejecutándose después de "salir" de la MP.

Esto significaba que usar el 286 PM le impedía ejecutar programas normales de DOS sin una gran cantidad de trucos. En un momento en que solo había programas DOS, no valía la pena usar PM en absoluto.

Por lo tanto, resultó más complicado trabajar con el 286 PM que simplemente vivir sin él, y confiar en EMS y XMS para acceder a la memoria adicional. Un número de 286 placas base tenían soporte de chipset para EMS para que pudiera usar toda la memoria adicional del sistema sin la necesidad de PM.

Intel reconoció estas deficiencias y produjo un nuevo PM completamente diferente en el 386. El modelo de memoria plana simplifica el acceso a la memoria en una porción de hasta 4 GB. La CPU puede entrar y salir de PM con un par de instrucciones, por lo que no se necesitan protocolos de reinicio torpes. VM86 significa que la mayoría de las veces ni siquiera necesita salir de PM, puede ejecutar programas de DOS mientras está en PM.

Todas estas mejoras significaron que el 386 PM no solo era más funcional, sino también significativamente más compatible.

En otras palabras, lo único en común entre el modo protegido 286 y 386 es el nombre. Esta es la razón por la cual los sistemas operativos PM son típicamente 386 o más nuevos. Agregar soporte para el 286 PM sería un esfuerzo completamente independiente, con poco o ningún código que se pueda compartir con el 386 PM completamente diferente.

Por el contrario, el 386 PM funciona de la misma manera hasta la última de las CPU de 32 bits, e incluso más allá si ejecuta software de 32 bits en CPU de 64 bits.


3

Hay partes en el núcleo escritas en ensamblador y tendrían que reescribirse para admitir 286.

Con respecto a ELKS, en sus preguntas frecuentes indican que es un subconjunto del kernel de Linux, por lo que tal vez solo portaron las necesidades absolutas.


1
Había un coprocesador matemático para el 286, el 80287.
Renan

3

Creo que la verdadera respuesta a mi pregunta es esta:

Cada arquitectura de CPU principal (o revisión importante de la misma) requiere un código de soporte de ensamblaje además del código C.

Incluso si tiene GCC para compilar el kernel de Linux en el código de máquina 286 de 16 bits, todavía faltaría el código de ensamblaje compatible de 286 de 16 bits esencial.

En otras palabras, el núcleo en el mejor de los casos solo se construiría parcialmente. Cualquier código de ensamblaje específico de arquitectura no se ensamblaría, ya que simplemente no está escrito para esa arquitectura.

En base a esto, supongo que esto es exactamente lo que hacen, por ejemplo, ELKS y proyectos similares cuando implementan Linux en 286 u otras arquitecturas: implementan ese código de soporte de ensamblaje faltante.


3

El 80386 admite la paginación además de la segmentación de la memoria, mientras que el 286 solo admite la segmentación de la memoria. Linux depende en gran medida del soporte de paginación, es decir, usa un esquema de memoria plana que básicamente establece todos los registros de segmento en 0 y usa paginación para administrar aplicaciones. Para portar Linux al 286, el administrador de memoria fundamental necesita un rediseño completo para funcionar en modo segmentado sin paginación, lo que probablemente sea mucho trabajo.


2

¿Linux requiere soporte de hardware VM86?

No soy un tipo de ensamblador, pero de acuerdo con esto :

Como la implementación original de la extensión de 32 bits de la arquitectura 8086, el conjunto de instrucciones 80386, el modelo de programación y las codificaciones binarias siguen siendo el denominador común para todos los procesadores x86 de 32 bits, esto se denomina x86, IA-32 o i386 -arquitectura, dependiendo del contexto.

El 386 representa un conjunto de instrucciones ampliado del 286, así que quién sabe lo difícil que sería el puerto. Evidentemente, casi nadie se ha molestado en probarlo ... Supongo que puedes preguntarle a la gente de ELKS sobre eso.


2

La razón más importante es que el proyecto GNU original apuntaba a máquinas de 32 bits (como estaciones de trabajo Unix de mediados de la década de 1980) en lugar de molestarse en admitir algo más pequeño, por lo que toda la cadena de herramientas GNU no era adecuada para la generación de código de 16 bits. Portar el kernel de Linux temprano, pesado en el ensamblaje y con segmentos al 286 hubiera sido más fácil que cualquier otro objetivo de portabilidad, si GCC hubiera tenido la capacidad de producir el código 286 en modo protegido. Pero apuntar GCC al modo protegido 286 habría sido un gran proyecto para soportar un procesador obsoleto.


1

Recientemente, el kernel de Linux ha abandonado el 386 como una plataforma compatible y el kernel de Linux NO es compatible con los procesadores Intel 286 ... 80286 no es una CPU de 32 bits, que se requiere para arrancar.


55
Linux se escribió originalmente en un 386 en 1991. Para entonces, los 286 ya eran viejos y el árbol del núcleo principal nunca tenía ningún código con respaldo para admitir 286.
Flukas88

Eso puede ser, pero la pregunta era ¿por qué es este el caso? No es por qué se tomó la decisión de abandonar el soporte para 286/386 (lo cual es obvio), sino cuáles son las razones técnicas por las que no se puede hacer fácilmente el soporte de un procesador tan antiguo. Es decir, ¿por qué el núcleo REQUIERE una CPU de 32 bits? ¿Por qué no se puede compilar el kernel para un 286?
ioctlvoid

¿No tenía el kernel también el coprocesador aritmético como requisitos?
Bonsi Scott

No, el kernel admite la emulación matemática, al menos lo hizo antes. Por lo tanto, incluso podría ejecutar el kernel de Linux en una CPU con una FPU rota. Sin embargo, el 286 todavía admitía un coprocesador matemático, el 80287.
ioctlvoid

En una parte editada de mi respuesta, indiqué que la emulación está implementada en el kernel de Linux. Incluso se usó para portar Linux a S / 390 (también conocido como IBM Mainframe) ya que no tenía una unidad de punto flotante en el momento en que se portó.
Didi Kohen

1

Linux x86 no se puede transferir fácilmente al 80286 porque es un procesador de 16 bits y Linux x86 requiere un procesador de 32 bits.

Más específicamente, los registros en el 286 todavía tenían solo 16 bits de ancho. Ninguno de los registros EX estaba disponible. Además, los segmentos de memoria y las compensaciones solo tenían 16 bits de longitud. Los programas todavía tenían que tratar con código y datos cercanos / lejanos.

Esto significa que Linux / 286 necesitaría un kernel y una API de usuario radicalmente diferentes que Linux / 386. Cada archivo fuente de ensamblaje y muchos archivos fuente C tendrían que reescribirse. Sería como la diferencia entre programar para Win16 versus Win32.

En resumen, no puede simplemente decirle a GCC que compile para una CPU diferente. Cada bit de código debería reescribirse para un entorno de 16 bits.


1
Considere el uso de rebajas para aumentar la legibilidad.
lord.garbage

0

Por lo que he leído, la forma canónica de hacer que Linux se ejecute en el 80286 sería ejecutarlo dentro de una máquina virtual. Esto es lo que hizo Fabrice Bellard aquí . Tendría que implementar la máquina virtual usted mismo o el puerto uno.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.