Uzzinot vairāk par to, kā operētājsistēmas un aparatūra darbojas, un mijiedarbojas viens ar otru, jūs, iespējams, būsiet pārsteigti, redzot to, kas, šķiet, ir dīvaini vai nepietiekami izmantotie "resursi". Kāpēc ir tā, ka? Šodienas SuperUser Q & A ziņai ir atbilde uz ziņkārīgo lasītāja jautājumu.
Šodienas jautājumu un atbilžu sesija mums priecājas par SuperUser - Stack Exchange dalību, kas ir kopienas vadīta Q & A tīmekļa vietņu grupa.
Foto pieklājīgi no Lemsipmatt (Flickr).
SuperUser lasītājs AdHominem vēlas uzzināt, kāpēc x86 procesori izmanto tikai divus no četriem gredzeniem:
Linux un Windows x86 sistēmas izmanto tikai Gredzens 0 par kodola režīmu un Gredzens 3 lietotāja režīmā. Kāpēc pārstrādātāji pat atšķir no četriem dažādiem gredzeniem, ja viņi visi vienīgi tikai izmanto divus no tiem vienalga? Vai tas mainījies ar AMD64 arhitektūru?
Kāpēc x86 procesori izmanto tikai divus no četriem gredzeniem?
SuperUser atbalstītājs Jamie Hanrahan ir atbilde mums:
Ir divi galvenie iemesli.
Pirmais ir tas, ka, lai arī x86 procesori piedāvā četrus atmiņas aizsardzības rullīšus, to piedāvāto aizsardzības detalizācijas pakāpe ir tikai katra segmenta līmenī. Tas nozīmē, ka katram segmentam var iestatīt noteiktu zvana (privilēģiju līmeni), kā arī citas aizsardzības iespējas, piemēram, atspējot rakstīšanu. Bet nav pieejami daudzi segmentu deskriptori. Lielākā daļa operētājsistēmu vēlētos, lai būtu daudz precīzāka atmiņas aizsardzības detalizācija, piemēram, ... atsevišķām lapām.
Tātad, ievadiet lapu tabulas balstītu aizsardzību. Lielākā daļa, ja ne visas, mūsdienu x86 operētājsistēmas vairāk vai mazāk ignorē segmentēšanas mehānismu (cik vien iespējams) un paļaujas uz pieejamo aizsardzību no zemā līmeņa bitu lapas tabulas ierakstiem. Vienu no tiem sauc par "privileģēto" mazliet. Šis bits pārbauda, vai procesoram jābūt vai nav kādā no privileģētajiem līmeņiem, lai piekļūtu lapai. "Privileģētais" līmenis ir PL 0, 1 un 2. Bet tas ir tikai viens bits, tādēļ lapaspuse ar aizsardzības līmeni, "pieejamo" režīmu skaits, ciktāl tas attiecas uz atmiņas aizsardzību, ir tikai divi: lapa var būt pieejama no nepriviliģētā režīma vai nē. Tātad, tikai divi gredzeni. Lai katrai lapai būtu četri iespējamie zvani, katras lapas tabulas ierakstā tiem būtu jābūt diviem aizsardzības bitiem, lai kodētu vienu no četriem iespējamajiem zvana numuriem (tāpat kā segmentu deskriptorus). Tomēr viņiem tas nav.
Cits iemesls ir vēlme operētājsistēmas pārnesamību. Tas nav tikai par x86; Unix mums mācīja, ka operētājsistēma varētu būt relatīvi pārnēsājama vairāku procesoru arhitektūrā un ka tā bija laba lieta. Un daži pārstrādātāji atbalsta tikai divus gredzenus. Neatkarīgi no vairākiem gredzeniem arhitektūrā operētājsistēmas izpildītāji padarīja operētājsistēmas pārnēsājamas.
Ir trešais iemesls, kas raksturīgs Windows NT izstrādei. NT dizaineri (David Cutler un viņa komanda, ko Microsoft iznomāja prom no DEC Rietumu reģiona laboratorijām) bija plaša iepriekšēja pieredze VMS jomā; Patiesībā Cutler un daži citi bija starp VMS oriģināliem dizaineriem. Un VAX procesors, kuram tika izveidota VMS, ir četri gredzeni (VMS izmanto četrus gredzenus).
Bet komponenti, kas skrēja VMS 1. un 2. gredzeni (Attiecīgi ierakstu pārvaldības pakalpojumi un CLI) tika atstāti ārpus NT dizaina. 2. gredzens VMS nebija īsti par operētājsistēmas drošību, bet gan par lietotāja CLI vides saglabāšanu no vienas programmas uz otru, un Windows tam nebija. CLI darbojas kā parasts process. Attiecībā uz VMS 1. gredzens, RMS kods iekšā 1. gredzens bija jāuzsāk Gredzens 0 diezgan bieži, un zvana pārejas ir dārgas. Izrādījās daudz efektīvāk, lai vienkārši dotos uz to Gredzens 0 un ar to jādara, nevis ir daudz Gredzens 0 pārejas 1. gredzens kods (atkal, ne, ka NT kaut ko līdzīgu RMS anyway).
Runājot par to, kāpēc x86 ieviesa četrus gredzenus, kamēr operētājsistēmas tos neizmantoja, jūs runājat par daudz jaunāka dizaina operētājsistēmām nekā x86. Daudzas x86 sistēmas plānošanas funkcijas tika izstrādātas ilgi pirms tam, kad tika ieviesti NT vai patiesie Unix-ish kodoli, un viņi patiešām nezināja, ko izmantotu operētājsistēma. Tikai tad, kad mēs iegūstam peidžeru x86 versijā, mēs varējām īstenot patiesos Unix-ish vai VMS tipa kodus.
Ne tikai modernās x86 operētājsistēmas lielā mērā ignorē segmentēšanu (tās vienkārši izveido segmentus C, D un S ar bāzes adresi 0 un lielumu 4 GB, F un G segmentus dažreiz izmanto, lai norādītu uz galvenajām operētājsistēmas datu struktūrām ), viņi lielākoties ignorē arī tādas lietas kā "uzdevuma valsts segmenti". TSS mehānisms bija nepārprotami paredzēts vītņu kontekstu pārslēgšanai, bet izrādījās, ka tam ir pārāk daudz blakusparādību, tāpēc modernās x86 operētājsistēmas to dara "ar roku". Vienīgais laiks, kad x86 NT maina aparatūras uzdevumus, ir saistīts ar dažiem patiešām izņēmuma apstākļiem, piemēram, dubultās kļūdas izņēmumu.
Attiecībā uz x64 arhitektūru, daudzi no šiem neizmantotajiem elementiem tika izslēgti. Viņu skatījumā AMD patiešām runāja ar operētājsistēmas kodola komandām un jautāja, kas viņiem vajadzīgs no x86, ko viņiem nebija vai nevēlējās, un ko viņi vēlētos pievienot. Segmenti x64 eksistē tikai tādā veidā, ko varētu saukt par vestigālu formu, uzdevuma valsts pāreja nepastāv utt., Un operētājsistēmas turpina izmantot tikai divus gredzenus.
Vai kaut ko pievienot paskaidrojumam? Skatieties komentāros. Vēlaties lasīt citas atbildes no citiem tehnoloģiju savvy Stack Exchange lietotājiem? Šeit skatiet pilnu diskusiju pavedienu.