Segmentarea descriptorilor

Un descriptor de segment este o structură de date din memorie care îi spune procesorului mărimea și locația memoriei segmentului, precum și informațiile de control și informațiile de stare a segmentului. Descriptorii sunt de obicei create de compilatoare, linkere, încărcătoare sau sistemul de operare, dar nu de programele de aplicații. Figura 5-8 prezintă două formate descriptori comune. Descriptorul segmentului de sistem este discutat mai detaliat în Capitolul 6. Toate tipurile de descriptori de sistem au unul din aceste formate.







Descriptorii utilizați pentru segmentele de cod și datele aplicațiilor:

Descriptorii utilizați pentru segmentele de sistem speciale:

Frontiera. Definește dimensiunea segmentului. Procesorul plasează două câmpuri de margine ale segmentului unul lângă altul, care formează împreună o valoare de 20 de biți. Procesorul interpretează limita în două moduri, în funcție de setarea bitului de granulare:

  1. Dacă bitul de granulare este șters, atunci limita poate lua valori de la 1 octet la 1 megabyte, în trepte de un octet.
  2. Dacă bitul de granulare este setat, atunci limita poate lua valori de la 4 Kbytes la 4 Gigabytes, în incremente de 4 KB.

Bit S. Stabilește dacă acest segment este un segment de sistem sau un segment de cod sau date. Dacă bitul S este setat, atunci segmentul este fie un segment de cod, fie un segment de date. Dacă acest bit este șters, atunci segmentul este segmentul de sistem.

Tip. Interpretarea acestui câmp depinde de faptul că descriptorul dat se aplică aplicației sau segmentului de sistem. segmente de sistem au un descriptor de format ușor diferit, luate în considerare în capitolul 6. domeniu de memorie de tip descriptor specifică tipul de acces permis segmentului, precum și direcția în care crește segmentul (a se vedea. Tabelul 5-1).

Tabelul 5-1. Tipuri de segmente de aplicații ----------------------------------------------- ------------------ Numărul E | W | A | Tip | Descriere | | | | | descriptor | ----------------------------------------------- ------------------ 0 0 0 0 Date Numai citire 1 0 0 1 Date Citire, accesate 2 0 1 0 Citire / scriere date 3 0 1 1 Citire / intrare accesat de 4 date 1 0 0 doar pentru citire, mai mici de 5 date de expansiune 1 0 1 numai citire, o extensie în jos, accesul se face 6 1 1 0 datele de citire / scriere, extinderea în jos a datelor 7 1 1 1 citire / scriere, extinderea în jos accesul se face ------------------------------------------------ ----------------- Număr C | R | A | Tip | Descriere | | | | | descriptor | ----------------------------------------------- ------------------ 8 0 0 0 executarea codului numai 9 0 0 1 executarea de cod numai, accesul se face 1 10 0 0 executarea unui cod / citire cod 11 0 1 1 Vapolnenie / lectură, pus la dispoziție 12 ianuarie 0 0 Referință efectua numai conformal 13 ianuarie 0 1 de referință efectua numai conformal, pus la dispoziție 14 ianuarie 1 0 implementare de referință / numai citire conformal 15 ianuarie 1 1 executarea de cod / numai citire conformal, accesate de -------------------------------------------------- ---------------







Pentru segmentele de date, cei trei biți cei mai puțin semnificativi ai câmpului de tip pot fi interpretați ca semnele expansiunii descendente (E), permisiunea de scriere (W) și accesul la segmentul (A). Pentru segmentele de cod, cele mai puțin semnificative trei biți din câmpul de tip pot fi interpretate ca un semn de conformitate (C), permisiune de citire (R) și acces (A).

Segmentele de cod pot fi conformale sau neconforme. Trecerea la un segment conformal mai privilegiat va păstra nivelul actual de privilegii. Lumina zilei care desfășoară într-un segment de bază non-conformist, cu un nivel diferit de excepție privilegiu va genera o protecție generală nu este utilizat în cazul în care problema gateway-ului (a se vedea discuții multitasking mijloace. În capitolul 6). utilitare de sistem care nu sunt cotate la căile de atac, cum ar fi funcții de difuzare a datelor (de exemplu, transcodare EBCDIC / ASCII, codare / decodare a metodei Huffman, o bibliotecă de funcții matematice), precum și unele tipuri de excepții (de exemplu, diviziunea de eroare la zero, depășire detectate folosind INTO sau depășind intervalul BOUND) pot fi încărcate în segmente de cod conforme.

Câmpul Tip indică, de asemenea, dacă acest segment a fost accesat. În starea inițială, descriptorii segmentului raportează că există acces la segment. În cazul în care câmpul Tip este apoi setat la o valoare care indică faptul că accesul la segmentul nu a fost executat, procesorul va restabili valoarea în cazul în care accesul la segmentul au avut loc. Curățați și inspectați cel mai puțin semnificativ bit câmpul Tip, software-ul poate controla utilizarea segmentului (LSB tip de câmp este numit, de asemenea, un pic de acces).

Procesorul poate actualiza câmpul Tip atunci când accesează segmentul, chiar dacă acest acces a avut loc în ciclul de citire. Dacă tabelele descriptorilor au fost plasate în ROM, este posibil ca hardware-ul să nu aibă permisiunea de a dezactiva comunicarea ROM cu magistrala de date în timpul ciclului de scriere. Poate fi necesar să returnați semnalul READY # la procesor în ciclul de scriere în ROM; în caz contrar, acest ciclu nu se va termina. Aceste construcții de mijloace hardware necesare pentru ROM-rezident tabele de descriptori 386 DX, care stabilește întotdeauna biții de acces la încărcarea descriptor de segment. Cu toate acestea, procesorul i486 numai dacă nu este deja instalat. Evitați încercările de a scrie în tabelele descriptorilor în ROM-ul prin setarea biților de acces în fiecare descriptor.

DPL (Descriptor Privilege Level): Stabilește nivelul de privilegii al segmentului. Folosit pentru a controla accesul la un segment utilizând mecanismul de securitate descris în Capitolul 6.

Segment de prezență biți. Dacă acest bit este șters, procesorul generează o excepție "segmentul nu este prezent" atunci când este încărcat în registrul segmentului selectorului acestui descriptor. Această proprietate este utilizată pentru a detecta încercările de accesare a segmentelor care au devenit indisponibile. Segmentul poate deveni indisponibil când sistemul trebuie să creeze memorie liberă. Pentru elementele de memorie, cum ar fi fonturile de caractere sau driverele de dispozitive, atunci când acestea nu sunt utilizate în prezent, alocarea memoriei este anulată. Alocarea memoriei unui astfel de element se realizează prin marcarea unui astfel de segment ca fiind "inexistent" (acest lucru se face prin eliminarea bitului de prezență a segmentului). După aceasta, memoria ocupată de acest segment poate fi alocată pentru alte utilizări. Când elementul pentru care alocarea memoriei a fost anulată este necesară data viitoare, excepția "segmentul nu este prezent" va indica faptul că este necesar să încărcați din nou acest segment în memorie. Dacă acest tip de organizare a memoriei este efectuată într-un mod care nu este vizibil pentru programele de aplicații, atunci se numește o "memorie virtuală". Sistemul poate funcționa cu o dimensiune totală a memoriei virtuale care depășește semnificativ memoria fizică, datorită faptului că numai câteva segmente sunt prezente în memoria fizică în același timp.







Articole similare

Trimiteți-le prietenilor: