In che modo i vecchi sistemi operativi hanno creato o ampliato un segmento in memoria senza problemi?

0

Su una CPU 8086 prima che fosse adottato il modello di memoria piatta, quando l'OS voleva creare un nuovo segmento per un processo, come faceva a sapere quali intervalli di memoria virtuale erano già coperti dai segmenti esistenti; come ha trovato un indirizzo di base adatto da utilizzare per il nuovo descrittore di segmento che aveva una stanza adatta?

Inoltre, immagina che un processo richieda improvvisamente che il suo segmento si espanda tremendamente e quindi il suo segmento limitato deve espandersi, come è assicurato che il limite non invaderi la base di un segmento adiacente e se ci sia un segmento adiacente , come non impedisce la crescita del segmento, come viene gestita questa situazione?

    
posta Lewis Kelsey 06.10.2018 - 08:44
fonte

2 risposte

5

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.

    
risposta data 06.10.2018 - 10:28
fonte
0

Fino all'impaginazione della memoria virtuale, i sistemi operativi utilizzavano un unico spazio di indirizzamento condiviso per se stesso e per i programmi. Usando questo schema e con una memoria disponibile limitata, non ci sono molti approcci possibili alla gestione della memoria: riservare una dimensione fissa per il programma inizialmente caricato e quindi, in aggiunta, consentire al programma di allocare memoria non contigua (al carico iniziale o altre estensioni) per soddisfare le richieste di estensione.

Ad esempio, il formato exe MS-DOS consente al programma di specificare min & valori massimi per la sua dimensione iniziale. Quindi supporta l'allocazione della memoria tramite codice int 21h 0x48. Vedi qui e qui . Funziona in modo simile a malloc / free / realloc solo sulla memoria di programma condivisa globale piuttosto che nell'heap iniziale.

Vedi anche questo risposta SE retrocomputing .

DOS consentirebbe anche la specifica, in alcuni casi, se si desiderava un programma (o blocco) collocato in alto o in basso nella memoria per consentire al programmatore di partecipare un po 'alla riduzione della frammentazione dello spazio di indirizzamento condiviso.

    
risposta data 07.10.2018 - 17:20
fonte

Leggi altre domande sui tag