Segmentarea memoriei - Memory segmentation

Segmentarea memoriei este un sistem de operare de management al memoriei tehnica de divizare a unui calculator e de memorie primar în segmente sau secțiuni . Într-un sistem computerizat care utilizează segmentarea, o referință la o locație de memorie include o valoare care identifică un segment și un offset (locația de memorie) din acel segment. Segmentele sau secțiunile sunt, de asemenea, utilizate în fișierele obiect ale programelor compilate atunci când sunt legate împreună într-o imagine de program și când imaginea este încărcată în memorie.

Segmentele corespund de obicei diviziunilor naturale ale unui program, cum ar fi rutine individuale sau tabele de date, astfel încât segmentarea este în general mai vizibilă pentru programator decât paginarea singură. Pot fi create segmente diferite pentru diferite module de program sau pentru diferite clase de utilizare a memoriei, cum ar fi segmente de cod și date . Anumite segmente pot fi partajate între programe.

Segmentarea a fost inițial inventată ca o metodă prin care software-ul de sistem ar putea izola diferite procese software ( sarcini ) și date pe care le utilizează. A fost menit să sporească fiabilitatea sistemelor care rulează simultan mai multe procese. Într-o arhitectură x86-64 este considerată moștenită și majoritatea software-urilor de sistem moderne bazate pe x86-64 nu folosesc segmentarea memoriei. În schimb, gestionează programele și datele lor utilizând paginarea memoriei, care servește și ca o modalitate de protecție a memoriei. Cu toate acestea, majoritatea implementărilor x86-64 încă o acceptă din motive de compatibilitate inversă.

Implementare hardware

Într-un sistem care utilizează segmentarea, adresele de memorie ale computerului constau dintr-un segment de identificare și un offset în cadrul segmentului. O unitate de gestionare a memoriei hardware (MMU) este responsabilă pentru traducerea segmentului și decalajul într-o adresă fizică și pentru efectuarea verificărilor pentru a se asigura că traducerea se poate face și că este permisă referința la acel segment și decalaj.

Fiecare segment are o lungime și un set de permisiuni (de exemplu, citire , scriere , executare ) asociate acestuia. Un proces este permis să facă o referință într-un segment numai dacă tipul de referință este permis de permisiuni și dacă compensarea în cadrul segmentului este în intervalul specificat de lungimea segmentului. În caz contrar, se ridică o excepție hardware, cum ar fi o eroare de segmentare .

Segmente pot fi, de asemenea, utilizate pentru a implementa memoria virtuală . În acest caz, fiecare segment are un semnal asociat care indică dacă este prezent sau nu în memoria principală. Dacă se accesează un segment care nu este prezent în memoria principală, se ridică o excepție, iar sistemul de operare va citi segmentul în memorie din stocarea secundară.

Segmentarea este o metodă de implementare a protecției memoriei . Paginarea este un alt lucru și pot fi combinate. Dimensiunea unui segment de memorie nu este, în general, fixă ​​și poate fi la fel de mică ca un singur octet .

Segmentarea a fost implementată în mai multe moduri diferite pe diferite hardware, cu sau fără paginare. Segmentarea memoriei Intel x86 nu se potrivește niciunui model și este discutată separat mai jos și, de asemenea, mai detaliat într-un articol separat.

Segmentare fără paginare

Fiecare segment este asociat cu informații care indică locul în care este situat segmentul în memorie - baza segmentului . Când un program face referire la o locație de memorie, offset-ul este adăugat la baza segmentului pentru a genera o adresă de memorie fizică.

O implementare a memoriei virtuale pe un sistem care utilizează segmentarea fără paginare necesită ca segmente întregi să fie schimbate înainte și înapoi între memoria principală și stocarea secundară. Când un segment este schimbat, sistemul de operare trebuie să aloce suficientă memorie liberă contiguă pentru a menține întregul segment. De multe ori rezultă fragmentarea memoriei dacă nu există suficientă memorie contiguă, deși poate fi suficientă în total.

Segmentarea cu paginare

În loc de o locație de memorie reală, informațiile despre segment includ adresa unui tabel de pagini pentru segment. Când un program face referire la o locație de memorie, offset-ul este tradus la o adresă de memorie folosind tabelul de pagini. Un segment poate fi extins pur și simplu alocând o altă pagină de memorie și adăugând-o în tabelul de pagini al segmentului.

O implementare a memoriei virtuale pe un sistem care utilizează segmentarea cu paginare mută, de obicei, doar pagini individuale înainte și înapoi între memoria principală și stocarea secundară, similar cu un sistem paginat non-segmentat. Paginile segmentului pot fi localizate oriunde în memoria principală și nu trebuie să fie adiacente. Acest lucru duce de obicei la o cantitate redusă de intrare / ieșire între stocarea primară și secundară și o fragmentare a memoriei redusă.

Istorie

Burroughs Corporation B5000 calculator a fost unul dintre primii care pune în aplicare segmentare, și „probabil , primul computer comercial pentru a furniza memorie virtuală“ bazată pe segmentare. Mai târziu, computerul B6500 a implementat segmentarea; o versiune a arhitecturii sale este încă în uz astăzi pe serverele Unisys ClearPath Libra.

GE-645 calculator, o modificare a GE-635 cu segmentare și paginare suport suplimentar, a fost proiectat în 1964 pentru a sprijini Multics.Gaseau .

Intel iAPX 432 , început în 1975, a încercat să pună în aplicare o arhitectură segmentată cu adevărat de protecție a memoriei pe un microprocesor.

Versiunea 960MX a procesoarelor Intel i960 a acceptat instrucțiunile de încărcare și stocare, sursa sau destinația fiind un „descriptor de acces” pentru un obiect și un offset în obiect, cu descriptorul de acces într-un registru pe 32 de biți și cu offset-ul calculat dintr-un offset de bază în registrul următor și dintr-un offset suplimentar și, opțional, un registru index specificat în instrucțiune. Un descriptor de acces conține biți de permisiune și un index de obiect pe 26 de biți; indexul obiectului este un index într-un tabel de descriptori de obiecte, oferind un tip de obiect, o lungime de obiect și o adresă fizică pentru datele obiectului, un tabel de pagini pentru obiect sau tabelul de pagini de nivel superior pentru un nivel de două niveluri tabel de pagini pentru obiect, în funcție de tipul de obiect.

Calculatoarele Prime , Stratus , Apollo , IBM System / 38 și IBM AS / 400 (inclusiv IBM i ) utilizează segmentarea memoriei.

arhitectura x86

Segmentarea memoriei utilizate de procesoarele x86 timpurii , începând cu Intel 8086 , nu oferă nicio protecție. Orice program care rulează pe aceste procesoare poate accesa orice segment fără restricții. Un segment este identificat numai prin locația sa de plecare; nu există verificarea lungimii. Granularitatea adresei de pornire a segmentului este de 16 octeți, iar offsetul este de 16 biți, suportând dimensiuni de segment de până la 64 KiB, astfel încât segmentele se pot suprapune (și adesea se supun) și fiecare adresă fizică poate fi notată cu 4096 perechi diferite de segmente-offset (permițând adresa offset wrap-around).

Segmentarea în Intel 80286 și ulterior oferă protecție: odată cu introducerea modelului 80286, Intel a denumit retroactiv singurul mod de operare al modelelor anterioare de CPU x86 „ mod real ” și a introdus un nou „ mod protejat ” cu caracteristici de protecție. Pentru compatibilitate inversă, toate procesoarele x86 pornesc în „mod real” fără protecție a memoriei, segmente fixe de 64 KiB și numai adresare pe 20 de biți (1024 KiB). Un procesor 80286 sau o versiune ulterioară trebuie să fie comutat într-un alt mod de către software pentru a utiliza spațiul său complet de adrese și caracteristicile MMU avansate.

Intel 80386 și procesoare mai târziu , de asemenea , să sprijine paginare; în aceste procesoare, tabelul de segmente, mai degrabă decât indicând o tabelă de pagini pentru segment, conține adresa segmentului în memoria liniară . Adresele din memoria liniară sunt apoi mapate la adrese fizice folosind un tabel de pagini separat, dacă paginarea este activată.

X86-64 Arhitectura nu utilizează segmentarea în modul lung ( în modul pe 64 de biți). Într-o arhitectură x86-64 este considerată moștenită și majoritatea software-urilor moderne de sistem bazate pe x86-64 nu folosesc segmentarea memoriei. În schimb, gestionează programele și datele lor utilizând paginarea memoriei, care servește și ca o modalitate de protecție a memoriei. Deși majoritatea implementărilor x86-64 încă o acceptă din motive de compatibilitate inversă. Patru dintre registrele de segmente: CS, SS, DS și ES sunt forțate la 0, iar limita la 2 64 . Segmentul înregistrează FS și GS poate avea în continuare o adresă de bază diferită de zero. Aceasta permite sistemelor de operare să utilizeze aceste segmente în scopuri speciale.

Vezi si

Referințe

linkuri externe