Зашто к86 процесори користе само два од четири прстена?
Када научите више о томе како оперативни системи и хардвер раде на послу и међусобно комуницирају, можда ћете бити изненађени да видите шта се чини чудним или недовољним коришћењем „ресурса“ који се појављују. Зашто је то? Данашњи пост СуперУсер К&А има одговор на питање знатижељног читаоца.
Данашња сесија питања и одговора долази нам захваљујући СуперУсер-у - подјела Стацк Екцханге-а, груписане од стране заједнице веб-локација за питања и одговоре.
Фотографија љубазношћу Лемсипматта (Флицкр).
Питање
Читач СуперУсер АдХоминем жели да зна зашто к86 процесори користе само два од четири прстена:
Линук и Виндовс базирани к86 системи користе само Ринг 0 за кернел мод и Ринг 3 за кориснички режим. Зашто процесори чак разликују четири различита прстена ако сви на крају заврше користећи само два од њих? Да ли се ово променило са АМД64 архитектуром?
Зашто к86 процесори користе само два од четири прстена?
Одговор
Допринос СуперУсер-а Јамие Ханрахан има одговор за нас:
Постоје два основна разлога.
Прва је да, иако к86 ЦПУ-ови нуде четири прстена заштите меморије, грануларност заштите која се тиме нуди је само на нивоу по сегменту. То значи да сваки сегмент може да се подеси на одређени прстен (ниво привилегије) заједно са другим заштитама као што је онемогућено писање. Али не постоји много доступних дескриптора сегмента. Већина оперативних система жели да има много финију грануларност заштите меморије, као што је… за појединачне странице.
Дакле, унесите заштиту на табели страница. Већина, ако не и сви, модерни к86 оперативни системи мање-више игноришу механизам сегментирања (колико год они могу) и ослањају се на заштиту која је доступна у битовима ниског реда у уносима табеле страница. Једна од њих се назива “привилегованим” битом. Овај бит контролира да ли процесор мора бити на једном од “привилегованих” нивоа за приступ страници. „Повлашћени“ нивои су ПЛ 0, 1 и 2. Али то је само један бит, тако да на нивоу заштите по страници, број "режима" доступних у погледу заштите меморије је само два: страница може бити доступна из не-повлаштеног режима, или не. Дакле, само два прстена. Да би имали четири могућа прстена за сваку страницу, морали би имати два заштитна бита у свакој ставци табеле страница да би кодирали један од четири могућа броја прстена (баш као и дескриптори сегмента). Међутим, они то не чине.
Други разлог је жеља за преносивошћу оперативног система. Не ради се само о к86; Уник нас је научио да оперативни систем може бити релативно преносив на више процесорских архитектура и да је то добра ствар. Неки процесори подржавају само два прстена. Не зависећи од вишеструких прстенова у архитектури, имплементатори оперативног система су оперативни системи учинили преносивијима.
Постоји трећи разлог који је специфичан за развој Виндовс НТ-а. Дизајнери НТ-а (Давид Цутлер и његов тим, које је Мицрософт унајмио од ДЕЦ Вестерн Регион Лабс) имали су велико искуство у ВМС-у; у ствари, Цутлер и неколико других били су међу оригиналним дизајнерима ВМС-а. А ВАКС процесор за који је ВМС дизајниран има четири прстена (ВМС користи четири прстена).
Али компоненте које су радиле у ВМС-у Прстени 1 и 2 (Услуге управљања записима и ЦЛИ, респективно) су изостављене из дизајна НТ-а. Ринг 2 у ВМС-у се заправо не ради о сигурности оперативног система, већ о очувању корисничког ЦЛИ окружења од једног програма до другог, а Виндовс није имао тај концепт; ЦЛИ ради као обичан процес. Што се тиче ВМС-а Ринг 1, РМС код у Ринг 1 морао сам да позовем Ринг 0 прилично често, и прелази прстена су скупи. Испоставило се да је много ефикасније да се иде Ринг 0 и урадити с њом, а не много Ринг 0 транзиције унутар Ринг 1 код (опет, не да НТ ипак има нешто као РМС).
Што се тиче тога зашто је к86 имплементирао четири прстена док их оперативни системи нису користили, говорите о оперативним системима далеко новијег дизајна од к86. Многе карактеристике системског програмирања к86 дизајниране су много пре него што су НТ или прави Уник-исх кернели имплементирани на њему, и нису знали шта ће оперативни систем користити. Све док нисмо стигли до странице к86, могли смо да имплементирамо праве језгре попут Уник-исх или ВМС-а.
Не само да модерни к86 оперативни системи углавном игноришу сегментирање (они само постављају Ц, Д и С сегменте са основном адресом од 0 и величином од 4 ГБ; Ф и Г сегменти се понекад користе за указивање на кључне структуре података оперативног система ), они такође у великој мери игноришу ствари као што су „сегменти стања задатака“. ТСС механизам је јасно дизајниран за пребацивање контекста нити, али се испоставило да има превише споредних ефеката, тако да модерни к86 оперативни системи то раде „ручно“. Једини пут када к86 НТ промени хардверске задатке је за неке заиста изузетне услове, као што је двоструки изузетак.
Што се тиче к64 архитектуре, многе од ових неискоришћених функција су изостављене. На њихову заслугу, АМД је заправо разговарао са кернел тимовима оперативног система и питао их шта им је потребно од к86, шта им није било потребно или што нису жељели, и шта би хтјели додати. Сегменти на к64 постоје само у ономе што би се могло назвати вестигијална форма, пребацивање стања задатка не постоји, итд., А оперативни системи настављају да користе само два прстена.
Имате ли нешто да додате објашњењу? Звучи у коментарима. Желите ли прочитати више одговора од других технолошки паметних Стацк Екцханге корисника? Погледајте цео дискусију овде.