Memorie de pagină

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 31 ianuarie 2019; verificările necesită 13 modificări .

Memoria de pagină  este o modalitate de organizare a memoriei virtuale , în care adresele virtuale sunt mapate cu cele fizice pagină cu pagină. Pentru arhitectura x86 pe 32 de biți, dimensiunea minimă a paginii este de 4096 de octeți. [unu]

Suportul pentru acest mod este prezent în majoritatea procesoarelor pe 32 și 64 de biți. Acest mod este clasic pentru aproape toate sistemele de operare moderne, inclusiv Windows și familia UNIX . Utilizarea pe scară largă a unui astfel de mod a început cu procesorul VAX și sistemul de operare VMS de la sfârșitul anilor 1970 (conform unor surse, prima implementare). În familia x86, suportul a apărut încă de la generația 386, care este și prima generație de 32 de biți.

Sarcini de rezolvat

Concepte

Adresa folosită în codul mașinii, adică valoarea indicatorului, se numește „adresă virtuală”.

Adresa pe care procesorul o pune pe magistrală se numește „adresă liniară” (care este ulterior convertită într-o adresă fizică).

Intrarea tabelului de pagini conține de obicei următoarele informații:

Numărul de înregistrări dintr-un tabel este limitat și depinde de dimensiunea înregistrării și de dimensiunea paginii. Se folosește o organizare pe mai multe niveluri a tabelelor, adesea 2 sau 3 niveluri, uneori 4 nivele (pentru arhitecturi pe 64 de biți).

În cazul a 2 nivele, se folosește un „catalog” de pagini, care stochează intrări care indică adresele fizice ale tabelelor de pagini . Tabelele conțin înregistrări care indică pagini de date.

Când utilizați organizarea pe 3 niveluri, se adaugă un superdirector care conține intrări care indică mai multe directoare.

Biții superiori ai adresei virtuale indică numărul intrării din director, cei din mijloc indică numărul intrării din tabel, biții inferiori (adresa din interiorul paginii) merg la adresa fizică fără traducere.

Formatul intrărilor din tabel, dimensiunea lor, dimensiunea paginii și organizarea tabelelor depind de tipul procesorului și, uneori, și de modul său de funcționare.

Din punct de vedere istoric, x86 a folosit PTE-uri pe 32 de biți, adrese virtuale pe 32 de biți, pagini de 4 KB, 1024 de intrări în tabel, tabele cu două niveluri. Cei 10 biți superiori ai adresei virtuale sunt numărul intrării din director, următorii 10 sunt numărul intrării din tabel, cei 12 inferiori sunt adresa din pagină.

Începând cu Pentium Pro, procesorul acceptă pagini de 4 MB. Cu toate acestea, pentru ca sistemul și programele care rulează pe acesta să utilizeze pagini de această dimensiune, tehnologia paginilor de 4 MB (pagini uriașe) trebuie să fie activată corespunzător și aplicația configurată pentru a utiliza pagini de această dimensiune.

Procesorul x86 în modul PAE (Physical Address Extension) și în modul x86_64 (mod lung) utilizează PTE-uri pe 64 de biți (din care nu toți biții de adresă fizică sunt utilizați efectiv, de la 36 în PAE la 48 în unele x86_64), pe 32 de biți adrese virtuale , pagini de 4 KB, 512 intrări de tabel, tabele cu trei niveluri cu patru directoare și patru intrări de superdirector. Cei 2 biți superiori ai adresei virtuale sunt numărul intrării din superdirector, următorii 9 biți sunt în director, următorii 9 biți sunt în tabel. Adresa fizică a directorului sau superdirectorului este încărcată într-unul dintre registrele de control ale procesorului .

Când utilizați PAE , sunt folosite pagini de 2 MB în loc de pagini mari de 4 MB. Vezi și PSE .

Pe arhitectura x86_64 este posibil să se utilizeze pagini de 4 kilobytes (4096 bytes), 2 megabytes și (în unele AMD64-uri) 1 gigabytes.

Dacă accesul la memorie nu poate fi tradus prin TLB , atunci microcodul procesorului accesează tabelele de pagini și încearcă să încarce PTE de acolo în TLB. Dacă problemele persistă după o astfel de încercare, atunci procesorul execută o întrerupere specială numită „ defecțiune de pagină ” (defecțiune de pagină). Managerul pentru această întrerupere se află în subsistemul de memorie virtuală al nucleului OS.

Unele procesoare (MIPS) nu au microcod care accesează tabelul și generează o eroare de pagină imediat după o căutare eșuată în TLB, accesarea tabelului și interpretarea acestuia este deja atribuită handler-ului de erori de pagină. Acest lucru privează tabelele de pagini de cerința de a se conforma unui format hard-coded la nivel hardware.

Cauze ale eșecului paginii ( eroare de pagină ):

Managerul de erori de kernel poate încărca pagina dorită dintr-un fișier sau din zona de swap (vezi swapping ), poate crea o copie numai pentru citire a paginii disponibilă pentru scriere sau poate ridica o excepție (în termeni UNIX - semnalul SIGSEGV ) în acest proces.

Fiecare proces are propriul set de tabele de pagini . Registrul directorului paginii este reîncărcat la fiecare comutare de context de proces . De asemenea, este necesar să resetați partea din TLB care se aplică acestui proces.

În cele mai multe cazuri, nucleul sistemului de operare este plasat în același spațiu de adrese ca și procesele, iar cei 1-2 gigaocteți de sus din spațiul de adresă de 32 de biți al fiecărui proces îi sunt rezervați. Acest lucru se face pentru a evita schimbarea tabelelor de pagini la intrarea și ieșirea din nucleu. Paginile kernel sunt marcate ca inaccesibile pentru codul în modul utilizator.

Memoria regiunii nucleului este adesea exact aceeași pentru toate procesele, dar unele subregiuni ale regiunii nucleului (de exemplu, regiunea Windows în care se află subsistemul grafic și driverul video) pot fi diferite pentru diferite grupuri de procese (sesiuni).

Deoarece memoria nucleului este aceeași pentru toate procesele, TLB-urile corespunzătoare nu trebuie să fie reîncărcate după o schimbare a procesului. Pentru această optimizare, x86 acceptă marcajul „global” pe PTE.

Fișiere mapate în memorie

Managerul de erori de pagină din nucleu este capabil să citească pagina dată din fișier.

Acest lucru duce la posibilitatea implementării ușoare a fișierelor mapate în memorie. Conceptual, aceasta este la fel cu alocarea memoriei și citirea unei secțiuni dintr-un fișier în ea, cu diferența că citirea se realizează implicit „la cerere”, exprimată printr-o eroare a paginii atunci când se încearcă accesarea acesteia.

Al doilea avantaj al acestei abordări este - în cazul unui afișaj numai în citire - partajarea aceleiași memorie fizice între toate procesele care afișează un fișier dat (fiecare proces are propria sa memorie alocată).

Al treilea avantaj este abilitatea de a „renunța” unele dintre paginile mapate fără a le schimba în spațiul de schimb necesar pentru memoria alocată. În cazul unei necesități repetate pentru o pagină, aceasta poate fi încărcată rapid din fișier din nou.

Al patrulea avantaj este neutilizarea cache-ului discului în acest mod, ceea ce înseamnă economii la copierea datelor din cache în regiunea solicitată. Avantajele unui disc cache, care optimizează operațiunile de dimensiuni reduse, precum și citirea repetată a acelorași date, dispar complet la citirea paginilor întregi și cu atât mai mult a grupurilor de pagini, în timp ce dezavantajul copierii suplimentare obligatorii rămâne.

Fișierele mapate în memorie sunt utilizate de sistemele de operare Windows și UNIX pentru a încărca module executabile și biblioteci dinamice. Ele sunt, de asemenea, folosite de utilitarul GNU grep pentru a citi fișierul de intrare, precum și pentru a încărca fonturi într-un număr de subsisteme grafice.

Memoria virtuală a paginii și a segmentelor

Un avantaj uriaș al memoriei virtuale paginate în comparație cu cea segmentată este absența indicatorilor „aproape” și „departe”.

Prezența unor astfel de concepte în programare reduce aplicabilitatea aritmeticii pointerului și duce la probleme uriașe cu portabilitatea codului de la / către astfel de arhitecturi. Deci, de exemplu, o parte semnificativă a software-ului open source a fost dezvoltată inițial pentru platforme fără segmente pe 32 de biți cu memorie de pagină și nu poate fi transferată în arhitecturi de segment fără o reelaborare serioasă.

În plus, arhitecturile segmentare au cea mai grea problemă SS != DS, care era cunoscută pe scară largă la începutul anilor 1990 în programarea sub versiuni de Windows pe 16 biți. Această problemă duce la dificultăți în implementarea bibliotecilor dinamice, deoarece acestea au propriile lor DS, și SS ale procesului curent, ceea ce duce la imposibilitatea utilizării în ele a indicatorilor „aproape”. De asemenea, a avea propriul DS în biblioteci necesită corecții (MakeProcInstance) pentru a seta valoarea corectă DS pentru apelurile înapoi din bibliotecă către aplicația care apelează.

Memoria virtuală și memoria cache pe disc

principal Cache-ul

Suportul pentru fișierele mapate în memorie necesită ca nucleul sistemului de operare să accepte structura „un set de pagini fizice care conțin segmente ale unui fișier dat”. Maparea unui fișier în memorie se face prin completarea intrărilor din tabel cu link-uri către pagini dintr-o structură dată.

Este destul de evident că această structură este un cache de disc gata făcut. Folosirea acestuia ca cache rezolvă și problema coerenței dintre un fișier de citire/scriere și un fișier mapat în memorie.

Astfel, căile I/O stocate în cache către un fișier de disc (FsRtlCopyRead pe Windows și generic_file_read() pe Linux) sunt implementate ca copii ale datelor pe paginile fizice mapate la un fișier.

Această organizare a cache-ului este singura din Windows, acest sistem de operare nu are deloc un bloc clasic de cache pe disc. Metadatele sistemului de fișiere sunt stocate în cache prin crearea de fișiere false (IoCreateStreamFileObject) și crearea unui cache de pagină pentru ele.

Considerații de securitate

Inițial, arhitectura x86 nu avea un semnalizator „pagină nu executabilă” ( NX ).

Suportul pentru acest steag a apărut în arhitectura x86 ca parte a modului PAE (Physical Address Extension) din generația Pentium 4, sub o mare presiune din partea specialiștilor în securitate (vezi arhivele NTBugTraq). Setarea acestui steag pe paginile stivă și heap permite implementarea protecției execuției datelor hardware, ceea ce face imposibilă funcționarea multor tipuri de programe malware, inclusiv, de exemplu, exploatarea rău intenționată a multor defecte în Internet Explorer (defecțiunea din decembrie 2008, consultați cunoștințele MS). baza nu poate fi utilizată dacă DEP este activat ).

Suportul Windows PAE , care permite protecția execuției datelor , a fost introdus în Windows 2000 și este activat implicit pe versiunile de server ale Windows și dezactivat pe versiunile client.

Suport pentru memorie de peste 4 GB în Windows

Dispozitivele PCI, inclusiv memoria plăcii video, acceptă de obicei numai adrese pe 32 de biți. Prin urmare, trebuie să li se dea adrese fizice sub marcajul de 4 GB. Această „apertura” reduce cantitatea de memorie fizică vizibilă sub marcajul de 4 GB la aproximativ 3,2 GB. Restul memoriei fizice este remapată de controler peste marcajul de 4 GB.

Orice acces la memorie de peste 4 GB (adică, mai mult de aproximativ 3,2 GB) necesită controlerul (adică, podul de nord al chipset-ului) să accepte această configurație. Chipseturile moderne (de exemplu, Intel G33) au un astfel de suport.

De asemenea, necesită o setare BIOS numită remaparea memoriei care mapează regiunea [3,2...4] la [4...4,8].

Procesorul x86 din afara modului PAE folosește PTE-uri și adrese fizice pe 32 de biți, adică nu îi este disponibil mai mult de 4 GB (vezi și PSE-36 pentru o modalitate de a ocoli această limitare). Astfel, pentru a utiliza mai mult de aproximativ 3,2 GB de memorie într-un sistem de operare, acesta trebuie să accepte PAE. Pentru Windows, aceasta este opțiunea de pornire; pentru Linux, aceasta este opțiunea de construire a nucleului.

În plus, Microsoft a dezactivat forțat suportul pentru adresele fizice de peste 4 GB din motive politice și de marketing în următoarele sisteme de operare:

Suportul pentru adresele fizice de peste 4 GB este disponibil în următoarele versiuni:

Astfel, pentru a utiliza memoria de peste 3,2 GB în Windows, aveți nevoie de:

Cu toate acestea, chiar și pe o versiune de Windows „demontată” care nu acceptă adrese de peste 4 GB, este logic să utilizați întotdeauna PAE, deoarece (vezi mai sus) Data Execution Protection ( DEP ) necesită și PAE. Activarea PAE poate face ca o mică parte de software să nu mai funcționeze, cum ar fi emulatorul Windows Mobile. Conform versiunii oficiale a Microsoft, introducerea unei limite de spațiu de adresă de 4 GB se datorează suportului lipsă sau slab pentru spațiul de adrese pe 36 de biți de către unele drivere de dispozitiv, acest lucru trebuie avut în vedere, din cauza limitărilor hardware sau inadecvate. drivere, este imposibil să activați PAE pe versiunile care acceptă adrese fizice mai mari de 4 GB. Capacitatea de a activa sau dezactiva PAE nu depinde de drivere, dar dacă driverul unor echipamente PCI vechi nu acceptă corect adresele fizice care nu se potrivesc pe 32 de biți, atunci acest dispozitiv nu va funcționa corect și poate cauza întregul computer îngheţa.

Vezi și

Note

  1. Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide (decembrie 2016). Preluat la 21 decembrie 2019. Arhivat din original la 19 mai 2020.  (Engleză)

Link -uri