Linux su un 286?


15

Non possiedo un 286 né intendo eseguire Linux su uno. Tuttavia, poiché il 286 ha la modalità protetta, perché viene spesso affermato che Linux richiede una CPU 386 o superiore?

Da http://tuxmobil.org/286_mobile.html sembra che la versione ELKS di Linux possa essere eseguita su un 286, è corretto? Quali (se presenti) modifiche sono state fatte per consentire al kernel di funzionare sulla CPU 286?

Ora ovviamente capisco che un kernel compilato per un 386 non può essere eseguito su una CPU 286, che è a 16 bit. Quindi la mia domanda è: perché il kernel Linux standard non può essere compilato per un 286 e quindi eseguito su un 286? Linux richiede il supporto hardware VM86?


6
16 bit è eccessivo. 8 bit sono sufficienti per eseguire Linux. Guarda il progetto di Dmitry Grinberg.
Marco


Minix funzionava su 8086 (8 bit, 128 KiB RAM IIRC). La Xenix di Microsoft funzionava su 80286. Qualche anima demenziale cercò di portare Linux anche nell'8086 (con un certo successo). Ma no, "l'esperienza Linux completa" non sarà possibile su una macchina così limitata.
vonbrand,

Puoi calzare Linux su dispositivi molto limitati. Ma questo non sarà molto utile come ad esempio una macchina desktop. A meno che non dichiari i tuoi obiettivi, è difficile dire se 'Linux on 286' è fattibile per te.
9000,

Risposte:


4

La modalità protetta 286 (PM) è sostanzialmente diversa da quella offerta dalla 386. Pensa al 286 PM come a un prototipo, che aveva così tanti difetti che quasi nessuno lo usò mai, e il tutto fu completamente ridisegnato da zero per il 386.

Non utilizzava un modello di memoria piatta, utilizzava un modello segmentato come la modalità reale, il che significava che dovevi saltare attraverso i cerchi per accedere alla memoria in blocchi più grandi di 64 KB alla volta.

Era completamente incompatibile con tutti i programmi (MS-DOS) disponibili al momento, quindi una volta entrati in PM non potevi usare nessuno dei programmi a cui eri abituato.

Inoltre, non è possibile uscire nuovamente dalla modalità protetta se non si riavvia il PC, quindi i produttori hanno escogitato soluzioni creative come mettere un flag nella RAM, quindi scrivere un valore magico sul controller della tastiera, che farebbe scorrere il pin di ripristino sulla CPU per riavviare il macchina. La prima cosa che il BIOS farebbe sarebbe rilevare il flag impostato in precedenza, dove sarebbe quindi tornare al programma originale invece di eseguire la routine POST, consentendo al programma originale di continuare a funzionare dopo aver "chiuso" PM.

Ciò significa che l'uso del 286 PM ti ha impedito di eseguire i normali programmi DOS senza un gran numero di trucchi. In un momento in cui c'erano solo programmi DOS, non valeva affatto la pena di usare PM.

Quindi è diventato più complicato lavorare con il 286 PM piuttosto che vivere senza di esso e fare affidamento su EMS e XMS per accedere alla memoria aggiuntiva. Numerose 286 schede madri avevano il supporto del chipset per EMS in modo da poter utilizzare tutta la memoria di sistema aggiuntiva senza la necessità di PM.

Intel ha riconosciuto queste carenze e ha prodotto un nuovissimo PM completamente diverso nel 386. Il modello di memoria piatta semplifica l'accesso alla memoria in un blocco fino a 4 GB. La CPU può entrare e uscire da PM con un paio di istruzioni, quindi non sono necessari protocolli di riavvio goffi. VM86 significa che la maggior parte delle volte non è nemmeno necessario uscire da PM, è possibile eseguire programmi DOS mentre si è ancora in PM.

Tutti questi miglioramenti hanno fatto sì che il 386 PM non fosse solo più funzionale, ma anche significativamente più compatibile.

In altre parole, l'unica cosa in comune tra la modalità protetta 286 e 386 è il nome. Questo è il motivo per cui i sistemi operativi PM sono in genere 386 o più recenti. L'aggiunta del supporto per il 286 PM sarebbe uno sforzo completamente indipendente, con poco o nessun codice in grado di essere condiviso con il 386 PM completamente diverso.

Al contrario, il 386 PM funziona più o meno allo stesso modo fino all'ultima delle CPU a 32 bit, e anche oltre se si esegue software a 32 bit su CPU a 64 bit.


3

Ci sono parti nel kernel scritte in assembly e dovrebbero essere riscritte per supportare 286.

Per quanto riguarda ELKS, nelle loro FAQ indicano che è un sottoinsieme del kernel Linux, quindi forse hanno portato solo le necessità assolute.


1
C'era un coprocessore matematico per il 286, l'80287.
Renan

3

Penso che la vera risposta alla mia domanda sia questa:

Ogni grande architettura della CPU (o revisione principale delle stesse) richiede un codice di supporto assembly oltre al codice C.

Anche se hai ottenuto GCC per compilare il kernel Linux in codice macchina 286 a 16 bit, mancherebbe comunque il codice assembly compatibile compatibile con 286 a 16 bit.

In altre parole, il kernel sarebbe nella migliore delle ipotesi solo parzialmente compilato. Qualsiasi codice assembly specifico dell'architettura non riuscirebbe a essere assemblato poiché semplicemente non è stato scritto per quell'architettura.

Sulla base di questo, suppongo che sia esattamente ciò che fanno ad esempio ELKS e progetti simili quando implementano Linux su 286 o altre architetture: implementano quel codice di supporto dell'assembly mancante.


3

L'80386 supporta il paging oltre alla segmentazione della memoria mentre il 286 supporta solo la segmentazione della memoria. Linux dipende fortemente dal supporto del paging, cioè utilizza uno schema di memoria piatta che sostanzialmente imposta tutti i registri di segmento su 0 e usa il paging per gestire le applicazioni. Per portare Linux sul 286, il gestore della memoria fondamentale ha bisogno di una riprogettazione completa per funzionare in modalità segmentata senza paginazione, che probabilmente è un sacco di lavoro.


2

Linux richiede il supporto hardware VM86?

Non sono un tipo di assemblaggio, ma secondo questo :

Poiché l'implementazione originale dell'estensione a 32 bit dell'architettura 8086, il set di istruzioni 80386, il modello di programmazione e le codifiche binarie sono ancora il comune denominatore per tutti i processori x86 a 32 bit, questo è chiamato x86, IA-32 o i386 -architettura, a seconda del contesto.

Il 386 rappresenta un set di istruzioni ampliato dal 286, quindi chissà quanto sarebbe difficile la porta. Abbastanza evidentemente che quasi nessuno si è preso la briga di provarlo ... Immagino che tu possa chiedere alle persone ELKS di questo.


2

Il motivo principale è che il progetto GNU originale si è concentrato su macchine a 32 bit (come le workstation Unix della metà degli anni '80) piuttosto che preoccuparsi di supportare qualcosa di più piccolo, quindi l'intera toolchain GNU non era adatta per la generazione di codice a 16 bit. Portare il kernel Linux iniziale, pesantemente assemblato, utilizzando segmenti su 286 sarebbe stato più facile di qualsiasi altro target di porting - se GCC avesse avuto la capacità di produrre 286 codice in modalità protetta. Ma mirare a GCC in modalità protetta 286 sarebbe stato un grande progetto per supportare un processore obsoleto.


1

Recentemente il kernel Linux ha abbandonato il 386 come piattaforma supportata e il kernel Linux NON supporta processori Intel 286..80286 non è una CPU a 32 bit, che è richiesta per l'avvio.


5
Linux fu originariamente scritto su un 386 nel 1991. A quel tempo i 286 erano già vecchi, e l'albero del kernel principale non aveva mai avuto alcun codice di backport per supportare il 286.
Flukas88

Potrebbe essere, ma la domanda era ancora: perché è così? Non perché sia ​​stata presa la decisione di eliminare il supporto per 286/386 (il che è ovvio), ma quali sono le ragioni tecniche per cui il supporto di un processore così vecchio non può essere fatto facilmente. Cioè, perché il kernel RICHIEDE una CPU a 32 bit? Perché il kernel non può essere compilato per un 286?
ioctlvoid,

Il kernel non aveva anche il coprocessore aritmetico in quanto requisiti?
Bonsi Scott,

No, il kernel supporta l'emulazione matematica, almeno prima. Quindi potresti persino eseguire il kernel Linux su una CPU con una FPU rotta. Tuttavia, il 286 supportava ancora un coprocessore matematico, l'80287.
ioctlvoid

In una parte modificata della mia risposta ho indicato che l'emulazione è implementata nel kernel di Linux. È stato persino utilizzato per il porting di Linux su S / 390 (aka IBM Mainframe) in quanto non aveva un'unità a virgola mobile al momento del porting.
Didi Kohen,

1

Linux x86 non può essere facilmente trasferito all'80286 perché è un processore a 16 bit e Linux x86 richiede un processore a 32 bit.

Più specificamente, i registri sul 286 erano ancora larghi solo 16 bit. Nessuno dei registri EX era disponibile. Inoltre, i segmenti di memoria e gli offset erano ancora lunghi solo 16 bit. I programmi dovevano ancora gestire codice e dati vicini / lontani.

Ciò significa che Linux / 286 avrebbe bisogno di un kernel radicalmente diverso e API utente rispetto a Linux / 386. Ogni file sorgente dell'assembly e molti file sorgente C dovrebbero essere riscritti. Sarebbe come la differenza tra la programmazione per Win16 rispetto a Win32.

In breve, non puoi semplicemente dire a GCC di compilare per una CPU diversa. Ogni bit di codice dovrebbe essere riscritto per un ambiente a 16 bit.


1
Si prega di considerare l'uso del markdown per una maggiore leggibilità.
lord.garbage,

0

Da quello che ho letto il modo canonico per far funzionare Linux sull'80286 sarebbe eseguirlo all'interno di una macchina virtuale. Questo è quello che ha fatto Fabrice Bellard qui . Dovresti implementare tu stesso la macchina virtuale o portarne una.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.