De ce procesoarele x86 folosesc numai două din cele patru inele?
Când aflați mai multe despre modul în care sistemele de operare și hardware-ul pe care aceștia le execută lucrează și interacționează unul cu celălalt, este posibil să fiți surprinși să vedeți ce pare a fi ciudățenii sau subutilizarea "resurselor" apărute. De ce este asta? Postul de astăzi SuperUser Q & A are răspunsul la o întrebare curioasă a cititorului.
Sesiunea de întrebări și răspunsuri din ziua de astăzi vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor web Q & A.
Fotografie prin amabilitatea lui Lemsipmatt (Flickr).
Intrebarea
Cititorul super-utilizator AdHominem vrea să știe de ce CPU-urile x86 utilizează numai două din cele patru sonerii:
Sistemele x86 bazate pe sistemele Linux și Windows utilizează numai Inelul 0 pentru modul kernel și Inelul 3 pentru modul de utilizare. De ce procesoarele disting chiar și cele patru inele diferite dacă totul se termină doar cu două dintre ele oricum? Sa schimbat acest lucru cu arhitectura AMD64?
De ce CPU-urile x86 utilizează numai două din cele patru sonerii?
Răspunsul
Contribuitorul SuperUser Jamie Hanrahan are răspunsul pentru noi:
Există două motive primare.
Primul este că, deși CPU-urile x86 oferă patru inele de protecție a memoriei, granularitatea protecției oferite de acestea este doar la nivelul pe segment. Adică, fiecare segment poate fi setat la un anumit inel (nivel de privilegiu) împreună cu alte protecții cum ar fi dezactivarea scriere. Dar nu sunt disponibili atât de mulți descriptori de segment. Cele mai multe sisteme de operare ar dori să aibă o granularitate mult mai fină de protecție a memoriei, ca de exemplu ... pentru pagini individuale.
Deci, introduceți protecția bazată pe tabele. Cele mai multe, dacă nu toate, sisteme de operare moderne x86 ignoră mai mult sau mai puțin mecanismul de segmentare (oricât de mult pot) și se bazează pe protecția disponibilă de la biții de ordin mic în intrările din tabelele de pagini. Unul dintre acestea se numește bitul "privilegiat". Acest bit controlează dacă procesorul trebuie sau nu să fie la unul dintre nivelurile "privilegiate" pentru a accesa pagina. Nivelurile "privilegiate" sunt PL 0, 1 și 2. Dar este doar un bit, deci la nivelul de protecție a paginilor, numărul de "moduri" disponibile în ceea ce privește protecția memoriei este doar două: o pagină poate fi accesibilă din modul non-privilegiat sau nu. Prin urmare, doar două inele. Pentru a avea patru intrări posibile pentru fiecare pagină, ar trebui să aibă doi biți de protecție în fiecare intrare de tabelă pentru a codifica unul din cele patru numere de apel posibile (la fel ca și descriptorii segmentului). Cu toate acestea, nu au.
Celălalt motiv este o dorință pentru portabilitatea sistemului de operare. Nu este vorba despre x86; Unix ne-a învățat că un sistem de operare ar putea fi relativ portabil pentru mai multe arhitecturi de procesoare și că a fost un lucru bun. Și unele procesoare suportă doar două inele. Nu depinzând de mai multe inele din arhitectură, implementatorii de sisteme de operare au făcut sistemele de operare mai portabile.
Există un al treilea motiv care este specific dezvoltării Windows NT. NT designerii (David Cutler și echipa sa, pe care Microsoft la angajat departe de DEC Western Labs) au avut o vastă experiență anterioară în VMS; De fapt, Cutler și câțiva dintre ceilalți erau printre designerii originali ai VMS. Și procesorul VAX pentru care a fost proiectat VMS are patru inele (VMS utilizează patru inele).
Dar componentele care au fugit în VMS Inelele 1 și 2 (Record Management Services și CLI, respectiv) au fost lăsate în afara designului NT. Inelul 2 în VMS nu era vorba de securitatea sistemelor de operare, ci mai degrabă de păstrarea mediului CLI al utilizatorului de la un program la altul, iar Windows nu avea conceptul respectiv; CLI rulează ca un proces obișnuit. În ceea ce privește VMS Inelul 1, codul RMS din Inelul 1 a trebuit să sune Inelul 0 destul de des, iar tranzițiile inelului sunt costisitoare. S-a dovedit a fi mult mai eficient pentru a merge Inelul 0 și să fie făcut cu ea, mai degrabă decât să aibă o mulțime de Inelul 0 tranziții în interiorul Inelul 1 cod (din nou, nu că NT are ceva de genul RMS oricum).
În ceea ce privește motivul pentru care x86 a implementat patru semnale în timp ce sistemele de operare nu le foloseau, vorbim despre sisteme de operare cu design mult mai recent decât x86. O mulțime de caracteristici de programare a sistemului x86 au fost proiectate cu mult înainte ca NT sau adevăratele kernel-uri Unix-ish să fie implementate pe aceasta și nu știau cu adevărat ce ar folosi sistemul de operare. Abia după ce am pagerat pe x86, am putea să implementăm kerneluri de tip Unix-ish sau VMS.
Nu numai sistemele de operare moderne x86 ignoră în mare parte segmentarea (doar au configurat segmentele C, D și S cu o adresă de bază de 0 și o dimensiune de 4 GB; segmentele F și G sunt folosite uneori pentru a indica structurile de date cheie ale sistemului de operare ), ei ignoră, de asemenea, lucruri precum "segmente de stare de activitate". Mecanismul TSS a fost conceput în mod clar pentru a schimba contextul firului, dar se pare că are prea multe efecte secundare, astfel încât sistemele de operare x86 moderne o fac "de mână". Singura dată când x86 NT modifică sarcini hardware este pentru unele condiții cu adevărat excepționale, cum ar fi o excepție dublă de eroare.
În ceea ce privește arhitectura x64, multe dintre aceste caracteristici neutilizate au fost lăsate afară. Pentru credința lor, AMD a vorbit efectiv cu echipele de nucleu ale sistemului de operare și a întrebat ce au nevoie de la x86, ceea ce nu au avut nevoie sau nu au vrut și ce ar dori să le adauge. Segmentele de pe x64 există doar în ceea ce se poate numi formă vestigioasă, comutarea de stare a sarcinii nu există etc., iar sistemele de operare continuă să utilizeze doar două inele.
Aveți ceva de adăugat la explicație? Sunați în comentariile. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.