L'8086 non ha una modalità protetta: ogni processo ha pieno accesso a tutto, che è un incubo per un progettista di sistemi operativi.
Il processore ha un set di registri appositamente progettato per gestire i segmenti: CS (codice), DS ( dati), SS (stack) ed ES (extra spare uno). Questi potrebbero quindi essere utilizzati in combinazione con un set di registro puntatore per indirizzare 64 KB per ciascun segmento. Tuttavia, il codice doveva gestirli sotto la propria responsabilità. Quindi i compilatori hanno adottato i tipici modelli di memoria per generare il codice, a seconda che il limite di 64 KB non sia o meno sufficiente per alcuni segmenti.
Il sistema operativo principale in quel momento era MS-DOS. Nessun multitasking: non preoccuparti dei processi concorrenti. Il programma eseguibile ha definito la gestione della memoria iniziale:
- è stato inizialmente utilizzato il formato eseguibile COM . Il sistema operativo semplicemente caricava tutto il codice su un indirizzo, inizializzava tutti i segmenti sullo stesso blocco da 64K e avviava il programma con un offset fisso. Hai quindi avuto accesso alla macchina.
- il formato EXE divenne in seguito più popolare. Permetteva di inizializzare e caricare più segmenti in posti diversi. Nell'intestazione una dimensione massima consente al sistema operativo di riservare inizialmente abbastanza spazio. Il processo di caricamento è spiegato qui .
MS-DOS 2 è anche dotato di gestione della memoria migliore . Fondamentalmente, è possibile allocare, aumentare l'allocazione e liberare blocchi di memoria dal sistema operativo. I blocchi erano pensati per adattarsi ai segmenti. Ma ancora una volta, il programma ha dovuto gestire il caricamento del segmento e del registro dei puntatori da solo. E nulla ha protetto altre parti della memoria dalla corruzione della memoria.
Non ricordo se il realloc a livello di MSDOS ha spostato il blocco o semplicemente restituito un errore se non c'era spazio sufficiente per estendere la dimensione del blocco. Ma la libreria C standard ha fortunatamente fornito il simpatico realloc () che proviene dal mondo UNIX, e assicurato di spostare la memoria in una posizione più ampia, se necessario. Fino a te per assicurarti che nessun puntatore canaglia continuasse a usare la vecchia posizione.