Početna » kako da » Zašto x86 procesori koriste samo dva od četiri prstena?

    Zašto x86 procesori koriste samo dva od četiri prstena?

    Kada učite više o tome kako operativni sustavi i hardver rade na poslu i međusobno komuniciraju, možda ćete biti iznenađeni da vidite što se čini čudnim ili nedovoljnim iskorištavanjem „resursa“ koji se pojavljuju. Zašto je to? Današnja postova s ​​pitanjima o odgovorima korisnika imaju odgovor na pitanje znatiželjnog čitatelja.

    Današnja sesija pitanja i odgovora dolazi nam ljubaznošću SuperUser-a, podjele Stack Exchangea, grupiranja web-lokacija za pitanja i odgovore u zajednici.

    Fotografija ljubaznošću Lemsipmatta (Flickr).

    Pitanje

    Čitač SuperUser AdHominem želi znati zašto x86 procesori koriste samo dva od četiri prstena:

    X86 sustavi temeljeni na Linuxu i Windowsu koriste samo Zvoni 0 za kernel mod i Prsten 3 za korisnički način rada. Zašto procesori čak razlikuju četiri različita prstena ako svi završe samo s dva od njih? Je li se to promijenilo s arhitekturom AMD64?

    Zašto x86 procesori koriste samo dva od četiri prstena?

    Odgovor

    Autor suradnika SuperUser Jamie Hanrahan ima odgovor za nas:

    Dva su glavna razloga.

    Prvi je da, iako x86 CPU-ovi nude četiri prstena zaštite memorije, granuliranost zaštite koja se time nudi je samo na razini po segmentu. To znači da svaki segment može biti postavljen na određeni prsten (razina povlastice) zajedno s drugim zaštitama kao što je onemogućeno pisanje. No, ne postoji mnogo dostupnih deskriptora segmenta. Većina operativnih sustava željela bi imati mnogo finiju granularnost zaštite memorije, kao što je… za pojedinačne stranice.

    Dakle, unesite zaštitu tablice na stranici. Većina, ako ne i svi, moderni x86 operativni sustavi manje-više zanemaruju mehanizam segmentiranja (koliko god to ionako može) i oslanjaju se na zaštitu koja je dostupna u bita niskog reda u unosima tablica stranica. Jedan od njih se naziva "povlašteni" bit. Ovaj bit kontrolira da li procesor mora biti na jednoj od “privilegiranih” razina za pristup stranici. "Povlaštene" razine su PL 0, 1 i 2. Ali to je samo jedan bit, tako da na razini zaštite po stranici broj "načina" dostupnih što se tiče zaštite memorije je samo dva: stranica može biti dostupna iz ne-povlaštenog načina ili ne. Dakle, samo dva prstena. Da bi imali četiri moguća zvona za svaku stranicu, morali bi imati dva zaštitna bita u svakoj stavci tablice stranica kako bi kodirali jedan od četiri moguća broja prstena (baš kao i deskriptori segmenta). Međutim, oni to ne čine.

    Drugi razlog je želja za prenosivošću operativnog sustava. Ne radi se samo o x86; Unix nas je naučio da operativni sustav može biti relativno prenosiv na višestruke procesorske arhitekture i da je to dobro. Neki procesori podržavaju samo dva prstena. Ne oviseći o višestrukim zvonima u arhitekturi, implementatori operativnog sustava su operativni sustavi učinili još prenosivijima.

    Postoji treći razlog koji je specifičan za razvoj sustava Windows NT. Dizajneri NT-a (David Cutler i njegov tim, koje je Microsoft unajmio od DEC Western Region Labs) imali su veliko iskustvo u VMS-u; zapravo, Cutler i nekoliko drugih bili su među izvornim dizajnerima VMS-a. A VAX procesor za koji je dizajniran VMS ima četiri prstena (VMS koristi četiri prstena).

    Ali komponente koje su se nalazile u VMS-u Prstenovi 1 i 2 (Usluge upravljanja zapisima i CLI, odnosno) izostavljene su iz dizajna NT-a. Prsten 2 u VMS-u zapravo nije riječ o sigurnosti operacijskog sustava, nego o očuvanju korisničkog CLI okruženja od jednog programa do drugog, a Windows nije imao taj koncept; CLI radi kao običan proces. Što se tiče VMS-a Prsten 1, RMS kod u Prsten 1 morao je nazvati Zvoni 0 prilično često, a prijelazi prstena su skupi. Pokazalo se da je to daleko učinkovitije Zvoni 0 i biti učinjeno s njim, umjesto da ima puno Zvoni 0 prijelaza unutar. \ t Prsten 1 kôd (opet, ne da je NT ionako sličan RMS-u).

    Što se tiče toga zašto je x86 implementirao četiri prstena dok ih operativni sustavi nisu koristili, govorite o operacijskim sustavima mnogo novijeg dizajna od x86. Mnoge značajke programiranja sustava x86 dizajnirane su mnogo prije nego su NT ili pravi Unix-ish kerneli implementirani na njemu, i oni zapravo nisu znali što će operativni sustav koristiti. Nismo uspjeli implementirati istinski Unix-ish ili VMS-jezgre sve dok nismo dobili x86.

    Ne samo da moderni x86 operativni sustavi uglavnom ignoriraju segmentiranje (oni samo postavljaju C, D i S segmente s osnovnom adresom od 0 i veličinom od 4 GB; F i G segmenti ponekad se koriste za ukazivanje na ključne strukture podataka operacijskog sustava ), oni također u velikoj mjeri ignoriraju stvari kao što su "segmenti stanja zadataka". TSS mehanizam je jasno dizajniran za prebacivanje konteksta niti, ali se ispostavilo da ima previše nuspojava, tako da moderni x86 operativni sustavi to rade "ručno". Jedini put kada x86 NT mijenja hardverske zadatke je za neke doista izvanredne uvjete, kao što je dvostruka iznimka pogreške.

    Što se tiče arhitekture x64, mnoge od tih neiskorištenih značajki su izostavljene. Na njihovu zaslugu, AMD je zapravo razgovarao s kernel timovima operacijskog sustava i pitao što im je potrebno od x86, što im nije bilo potrebno ili što nisu željeli, i što bi željeli dodati. Segmenti na x64 postoje samo u onome što bi se moglo nazvati ostatkom oblika, prebacivanje stanja zadatka ne postoji, itd., A operativni sustavi nastavljaju koristiti samo dva prstena.


    Imate li što dodati objašnjenju? Zvuk isključen u komentarima. Želite li pročitati više odgovora od drugih tehničkih korisnika Stack Exchangea? Pogledajte cjelokupnu temu za raspravu ovdje.