Homepage » hogyan kell » Miért csak az x86 CPU-k használnak kettőt a négy „gyűrűből”?

    Miért csak az x86 CPU-k használnak kettőt a négy „gyűrűből”?

    Ha többet szeretne megtudni arról, hogyan működnek az operációs rendszerek és a hardverek, hogyan működnek a munka, és kölcsönhatásba lépnek egymással, akkor meglepődhet, hogy látszólag furcsa vagy alulhasználható a „források”. Miért van az, hogy? A mai SuperUser Q&A bejegyzés válaszol egy kíváncsi olvasó kérdésére.

    A mai Kérdések és válaszok munkamenet a Jóvagyon - a Stack Exchange alosztályának, a közösség által vezérelt Q&A webhelyek csoportjának köszönhetően..

    Fénykép jóvoltából Lemsipmatt (Flickr).

    A kérdés

    A SuperUser olvasó Az AdHominem tudni akarja, hogy az x86 processzorok csak négy négy gyűrűt használnak:

    Csak Linux és Windows alapú x86 rendszerek használhatók Gyűrű 0 kernel módban és 3. gyűrű felhasználói módban. Miért különböztetnek meg a processzorok még négy különböző gyűrűt, ha mindössze kétet használnak? Ez megváltozott az AMD64 architektúrával?

    Miért csak az x86 processzorok használnak négy négy gyűrűt?

    A válasz

    Jamie Hanrahan SuperUser közreműködője válaszol nekünk:

    Két fő oka van.

    Az első az, hogy bár az x86 CPU-k négy memóriavédő gyűrűt kínálnak, az így kínált védelem szemcséssége csak szegmensenkénti szinten van. Ez azt jelenti, hogy minden szegmens beállítható egy adott gyűrűre (jogosultsági szint) más védelemmel, mint például az írásvédett. De nem állnak rendelkezésre sok szegmens-leíró. A legtöbb operációs rendszer szeretné, ha a memóriavédelem sokkal finomabb lenne, mint például az egyes oldalak esetében.

    Tehát adja meg az oldal táblázat alapú védelmet. A legtöbb, ha nem minden modern x86 operációs rendszer többé-kevésbé figyelmen kívül hagyja a szegmentáló mechanizmust (amennyire csak lehet), és támaszkodhat a védelemre, amely az alacsony táblázatú bitekből érhető el az oldal táblázat bejegyzéseiben. Ezek közül az egyik a „kiváltságos” bit. Ez a bit szabályozza, hogy a processzornak az egyik "kiváltságos" szinten kell-e lennie az oldal eléréséhez. A „kiváltságos” szintek PL 0, 1 és 2. De ez csak egy kicsit, így a laponkénti védelem szintjén a rendelkezésre álló „módok” száma mindaddig, amíg a memóriavédelem érintett, csak egy: Az oldal nem privilegizált módból érhető el, vagy sem. Ezért csak két gyűrű. Ahhoz, hogy minden oldalhoz négy lehetséges gyűrű legyen, két oldaltábla bejegyzésben két védőbitnek kell lennie, hogy négy lehetséges gyűrűszámot kódoljon (ugyanúgy, mint a szegmensleírók). Azonban nem.

    A másik ok az operációs rendszer hordozhatósága. Nem csak x86-ról van szó; A Unix azt tanította, hogy egy operációs rendszer viszonylag hordozható lehet több processzor architektúrára, és jó dolog volt. Egyes processzorok csak két gyűrűt támogatnak. Az operációs rendszer implementátorai az architektúra több gyűrűjétől nem függően hordozhatóvá tették az operációs rendszereket.

    Van egy harmadik ok, ami a Windows NT fejlesztésére jellemző. Az NT tervezői (David Cutler és csapata, akiket a Microsoft bérelt a DEC Western Region Labs-től) széleskörű tapasztalattal rendelkezett a VMS-ben; Valójában Cutler és néhányan közülük a VMS eredeti tervezői voltak. És a VAX processzor, amelyre a VMS-t tervezték, négy gyűrűvel rendelkezik (a VMS négy gyűrűt használ).

    De a VMS-ben futó összetevők Gyűrűk 1 és 2 (A Record Management Services és a CLI) kihagyásra került az NT-tervezésből. 2. gyűrű a VMS-ben valójában nem az operációs rendszer biztonságáról szólt, hanem inkább a felhasználó CLI-környezetének megőrzéséről egy programról a másikra, és a Windows nem rendelkezett ezzel a koncepcióval; a CLI szokásos eljárásként működik. Ami a VMS-eket illeti 1. gyűrű, az RMS kódot 1. gyűrű be kellett hívnia Gyűrű 0 meglehetősen gyakran, és a gyűrű-átmenet drága. Kiderült, hogy sokkal hatékonyabb, ha csak megy Gyűrű 0 és nem sokkal, hanem vele Gyűrű 0 átmenetek a 1. gyűrű kód (ismét, hogy az NT-nek egyébként nincs más RMS-je).

    Amiért az x86-nak négy gyűrűt hajtott végre, miközben az operációs rendszerek nem használták őket, akkor sokkal újszerűbb operációs rendszerekről beszél, mint az x86. Az x86 rendszerművelet sok jellemzőjét sokáig az NT vagy az igazi Unix-ish kernelek végrehajtása előtt tervezték, és nem igazán tudták, hogy az operációs rendszer milyen módon fog működni. Nem csak az x86-os lapozást kaptuk meg, hogy valós Unix-ish vagy VMS-szerű magokat tudtunk megvalósítani.

    A modern x86 operációs rendszerek nemcsak nagyrészt figyelmen kívül hagyják a szegmentálást (csak a C, D és S szegmenseket állítják be, amelyek alapcíme 0 és 4 GB méretű; F és G szegmensek néha arra szolgálnak, hogy a legfontosabb operációs rendszer adatszerkezeteire mutassanak ), nagyrészt figyelmen kívül hagyják a „feladatállapot-szegmenseket”. A TSS mechanizmus kifejezetten a szál kontextusváltásra lett kifejlesztve, de kiderül, hogy túl sok mellékhatása van, így a modern x86 operációs rendszerek ezt "kézzel" teszik. Az egyetlen x86 NT változásakor a hardveres feladatok közül néhány igazán kivételes körülmény, például a kettős hiba kivétel.

    Az x64 architektúrával kapcsolatban ezek közül a kihagyott funkciók közül sok maradt ki. Hitelükre az AMD ténylegesen beszélt az operációs rendszer kernelcsapataival, és megkérdezte, mit kell az x86-tól, amit nem kellett, vagy nem akart, és mit szeretne hozzáadni. Az x64-es szegmensek csak abban az esetben léteznek, mint az úgynevezett lelkesítő formák, a feladatállapot-váltás nem létezik, stb., És az operációs rendszerek továbbra is csak két gyűrűt használnak.


    Van valami, amit hozzá kell adni a magyarázathoz? Kikapcsolja a megjegyzéseket. Szeretne további válaszokat olvasni más tech-savvy Stack Exchange felhasználóktól? Nézze meg a teljes beszélgetés szálát itt.