Scrittura di un sistema operativo multitasking per un processore senza MMU


9

Ho pensato di scrivere un sistema operativo per hobby per alcuni processori ARM. Esistono molti computer a scheda singola popolari con ARM MPU, quindi volevo semplicemente acquistarne uno (scegliendone uno con più documentazione aperta). Sono stato sorpreso quando ho scoperto che anche le schede con memoria davvero sufficiente non hanno MPU con Memory Management Unit.

Dato che ho sempre lavorato con processori i386 + e mai niente altro (tranne alcuni PIC Microchip), ora sono confuso e non sono sicuro se si può scrivere un sistema operativo funzionante la cui funzionalità non sarebbe limitata se confrontata con i sistemi operativi scritti per MPU con MMU.

Potrei pensare a poche soluzioni per "sostituire" o "simulare" MMU e ho alcune domande:

  • Su processori Intel in modalità a 16 e 32 bit esiste un modo di utilizzare segmenti e selettori di segmento per utilizzare diversi blocchi di memoria per attività diverse. Ciò significa che potrei cambiare lo spazio di memoria modificando il contenuto dei registri di segmento quando eseguo un cambio di attività su x86. Esistono concetti generali per la segmentazione della memoria che potrebbero essere utilizzati sull'architettura ARM?
  • Caricando un file oggetto collegato anziché eseguibile, potrei usare rilocazioni (correzioni) o posizionare un codice indipendente per indirizzare le attività su pezzi di memoria allo stesso modo come se mappassi la memoria usando strutture di paginazione. Sarebbe abbastanza efficace?
  • Ho anche letto qualcosa sulle Memory Protection Unit sui processori ARM. Questi potrebbero essere utili?

Esistono modi "usuali" per gestire le attività sui sistemi senza MMU?

Risposte:


16

In realtà non è così difficile progettare un sistema operativo che non richiede una MMU. Ci sono alcune comodità di cui dovrai fare a meno, ma nulla di insormontabile.

  • Poiché attività diverse dovranno essere caricate su indirizzi diversi, tutto il codice (tranne il kernel, la libreria standard e qualsiasi altro codice che fa parte dell'ambiente di runtime di base) deve essere compilato come indipendente dalla posizione. Ciò significa salti relativi e un indirizzo di base per l'accesso all'heap memorizzato in un registro. Spendere un registro come indirizzo di base potrebbe sembrare costoso se sei abituato ai quattro registri generali di x86-32, ma la maggior parte delle architetture moderne ne ha di più, e persino l'8088 ha i registri di segmento proprio per quello.
  • Un'architettura simile a Unix deve essere rivista, perché non è possibile implementarla fork. Va bene, la maggior parte dei sistemi operativi non ha fork. (Puoi avere vfork.)
  • Non è possibile preallocare grosse gocce di spazio senza allocare anche la memoria corrispondente. Ciò significa che non è possibile aumentare al volo lo stack o l'heap allocando un'altra pagina alla volta.

Se hai una MPU, le tue attività possono comunque essere separate l'una dall'altra come al solito nei sistemi operativi multitasking. Senza una MPU, la separazione della memoria può essere cooperativa solo se si consente alle attività di eseguire codice arbitrario. Un modo per ottenere la separazione della memoria senza una MPU è limitare le attività per utilizzare solo il codice verificato su una macchina virtuale e implementare la protezione della memoria nel software come parte del motore VM.

uClinux è un progetto basato sul kernel Linux che gira su processori (incluso ARM Cortex-M) senza MMU. Le sue restrizioni al multitasking sono essenzialmente ciò che ho descritto sopra.

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.