Perché le CPU x86 usano solo 2 anelli su 4?


13

Quindi, i sistemi x86 basati su Linux o Windows usano solo l'anello 0 per la modalità kernel e l'anello 3 per la modalità utente. Perché i processori distinguono anche quattro diversi anelli se finiscono per usarne comunque solo due? E questo è cambiato sull'architettura AMD64?


a proposito, suggerirei che il titolo della domanda fosse cambiato in "Perché i sistemi operativi x86 usano solo 2 squilli su 4?" o forse "Perché i SO solo su CPU x86 ...". La CPU fa solo ciò che il sistema operativo gli dice di fare.
Jamie Hanrahan,

Risposte:


15

Ci sono due ragioni principali.

Il primo motivo è che, sebbene le CPU x86 offrano quattro anelli di protezione della memoria, la granularità della protezione offerta è quindi solo a livello di segmento. Cioè, ogni segmento può essere impostato su un anello specifico ("livello di privilegio") da 0 a 3, insieme ad altre protezioni come disabilitato alla scrittura. Ma non ci sono molti descrittori di segmenti disponibili. La maggior parte dei sistemi operativi vorrebbe avere una granularità molto più fine della protezione della memoria. Come ... per le singole pagine.

Quindi, inserisci la protezione in base alle voci della tabella delle pagine (PTE). La maggior parte, se non tutti, i moderni sistemi operativi x86 ignorano più o meno il meccanismo di segmentazione (il più possibile, comunque) e fanno affidamento sulla protezione basata su PTE. Ciò è specificato dai bit flag che sono i 12 bit inferiori in ogni PTE, più il bit 63 su CPU che supportano il no-execute. C'è un PTE per ogni pagina, che normalmente è 4K.

Uno di quei bit flag è chiamato bit "privilegiato". Questo bit controlla se il processore deve trovarsi in uno dei livelli "privilegiati" per accedere alla pagina. I livelli "privilegiati" sono PL 0, 1 e 2. Ma è solo un bit, quindi a livello di protezione pagina per pagina il numero di "modalità" disponibili per quanto riguarda la protezione della memoria è solo due: Una pagina può essere accessibile dalla modalità non privilegiata oppure no. Quindi solo due squilli.

Per avere quattro possibili squilli per ogni pagina, dovrebbero avere due bit di protezione in ciascuna voce della tabella delle pagine, per codificare uno dei quattro possibili squilli (proprio come i descrittori di segmento). Non lo fanno.

Il secondo motivo è l'obiettivo della portabilità del sistema operativo. Non si tratta solo di x86; Unix ci ha insegnato che un sistema operativo potrebbe essere relativamente portabile su più architetture di processori e che era una buona cosa. E alcuni processori supportano solo due anelli. Non dipendendo da più anelli nell'architettura, gli implementatori del sistema operativo hanno reso i sistemi operativi più portatili.

C'è un terzo motivo che è specifico per lo sviluppo di Windows NT. I designer di NT (David Cutler e il suo team, che Microsoft ha assunto da DEC Western Region Labs) avevano avuto una vasta esperienza precedente in VMS; infatti, Cutler e alcuni degli altri erano tra i designer originali di VMS. E il processore VAX per cui è stato progettato VMS (e viceversa) ha quattro squilli. VMS utilizza quattro squilli. (In effetti il ​​VAX ha quattro bit di protezione nel PTE, consentendo combinazioni come "sola lettura dalla modalità utente, ma scrivibili dall'anello 2 e dall'interno". Ma sto divagando.)

Ma i componenti che giravano negli anelli 1 e 2 di VMS (Record Management Services e CLI, resp.) Erano esclusi dal progetto NT. Ring 2 in VMS non riguardava davvero la sicurezza del sistema operativo, ma piuttosto di preservare l'ambiente della CLI dell'utente da un programma all'altro e Windows NT non aveva proprio questo concetto; la CLI viene eseguita come un normale processo. Per quanto riguarda l'anello 1 di VMS, il codice RMS nell'anello 1 ha dovuto chiamare abbastanza spesso nell'anello 0 e le transizioni dell'anello sono costose. Si è rivelato molto più efficiente passare semplicemente all'anello 0 e farlo con esso piuttosto che avere molte transizioni dell'anello 0 all'interno del codice dell'anello 1. (Ancora una volta - non che NT abbia comunque qualcosa come RMS.)

Ma allora perché sono lì? Per quanto riguarda il motivo per cui x86 ha implementato quattro anelli mentre i sistemi operativi non li hanno utilizzati - stai parlando di sistemi operativi di progettazione molto più recente di x86. Molte delle funzionalità di "programmazione del sistema" di x86 sono state progettate molto prima che NT o i veri kernel Unix fossero implementati su di esso, e non sapevano davvero cosa avrebbero usato i sistemi operativi. (Non è stato fino a quando non abbiamo ricevuto il paging su x86 - che non è apparso fino all'80386 - che abbiamo potuto implementare veri kernel Unix o VMS senza ripensare la gestione della memoria da zero.)

Non solo i moderni sistemi operativi x86 ignorano ampiamente la segmentazione (hanno semplicemente impostato i segmenti C, D e S con indirizzo di base 0 e dimensioni di 4 GB; i segmenti F e G vengono talvolta utilizzati per indicare le strutture di dati chiave del sistema operativo), ma ignorare in gran parte cose come "segmenti di stato delle attività". Il meccanismo TSS è stato chiaramente progettato per cambiare il contesto del thread, ma risulta avere troppi effetti collaterali, quindi i moderni sistemi operativi x86 lo fanno "a mano". L'unica volta che x86 NT modifica le attività hardware, ad esempio, è per alcune condizioni davvero eccezionali, come un'eccezione a doppio errore.

Per quanto riguarda x64, molte di queste funzionalità in disuso sono state escluse. (A loro merito, AMD in realtà ha parlato con i team del kernel del sistema operativo e ha chiesto di cosa avevano bisogno da x86, di cosa non avevano bisogno o che non volevano e che cosa vorrebbero aggiungere.) I segmenti su x64 esistono solo in ciò che potrebbe essere chiamato forma vestigiale, non esiste commutazione dello stato delle attività, ecc. E i sistemi operativi continuano a utilizzare solo due squilli.


1
Grazie! (Se non potevi dirlo, ho trascorso più di un po 'di tempo attorno al kernel VMS ...)
Jamie Hanrahan,

Sì, ho avuto questa impressione ... :-) Adoro quando qualcuno come te con una profonda conoscenza di qualcosa scrive questo tipo di risposta, questa è storia dell'IT, e mi piace conoscerla. La tua risposta mi ha ricordato quando ero un ragazzo a scuola, 20 anni fa, e ho comprato il "Manuale di riferimento per programmatori Intel 80268" e poi il manuale di riferimento 386. Ho letto molto sugli anelli di protezione ... ma in realtà non ho mai fatto nulla con loro. Solo una semplice programmazione dell'assemblatore x86 ... poi Turbo Pascal, poi C / C ++, Java ... e infine .Net negli ultimi 13 anni :-)
Max
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.