En sidetabel er en datastruktur, der bruges af det virtuelle hukommelsessystem i en computers operativsystem til at lagre kortlægningen mellem en virtuel adresse og en fysisk adresse . Virtuelle adresser bruges af den kørende proces , mens fysiske adresser bruges af hardwaren eller mere specifikt RAM -undersystemet . Sidetabellen er en nøglekomponent i virtuel adresseoversættelse , som kræves for at få adgang til data i hukommelsen.
I operativsystemer, der bruger virtuel hukommelse, skabes den illusion, at enhver proces har adgang til lineær hukommelse af samme størrelse som processens adresserum [1] . Fysisk er hukommelsen for hver proces opdelt i sider (i et system med personsøgning ) eller segmenter (i et system med segmenteret virtuel hukommelse), som kan være spredt over forskellige områder af fysisk hukommelse eller kan flyttes til et andet lager, normalt til en harddisk eller SSD-drev .
Moderne processorer bruger begreberne fysisk hukommelse og virtuel hukommelse : kørende processer bruger virtuelle adresser, og når en instruktion anmoder om hukommelsesadgang, oversætter processoren den virtuelle adresse til en fysisk adresse ved hjælp af den associative translation buffer (TLB) og/eller sidetabel.
Når en proces tilgår data i hukommelsen, skal operativsystemet tilknytte den virtuelle adresse, der bruges af processen, til den fysiske hukommelsesadresse, hvor dataene er gemt. I en process sidetabel gemmer operativsystemet en mapping af virtuelle adresser til fysiske adresser. Hver tabelindgang kaldes også en "sidetabelpost" (PTE) [2] .
CPU'ens Memory Management Unit (MMU) opbevarer en cache over nyligt brugte tilknytninger fra operativsystemets sidetabel. Dette kaldes translation association buffer ( TLB ), som er en association cache.
Når en virtuel adresse skal konverteres til en fysisk adresse, slås TLB op først. Hvis der findes et match (kaldet et " TLB-hit " ), returneres den fysiske adresse, og hukommelsesadgangen kan fortsætte. Men hvis der ikke er noget match (kaldet et " TLB-miss "), så slår enten hukommelsesstyringsmodulet eller operativsystemets TLB-miss-handler op et adressematch i sidetabellen for at se, om der findes et match (kaldet en " page walk " ). Hvis mappingen eksisterer, så skrives den tilbage til TLB'en (dette skal gøres, fordi hardwaren tilgår hukommelsen gennem TLB'en i det virtuelle hukommelsessystem), og den aktuelle instruktion genstartes (hvilket også kan ske parallelt).
Sidetabelopslag kan mislykkes af to årsager:
Når den fysiske hukommelse ikke er fuld, er dette en simpel handling: Siden skrives tilbage til den fysiske hukommelse, sidetabellen og TLB opdateres, og instruktionen genstartes. Men når den fysiske hukommelse er fuld, skal en eller flere sider i den fysiske hukommelse bladres ud for at give plads til den anmodede side. Sidetabellen skal opdateres til 1) at bemærke, at de sider, der tidligere var i den fysiske hukommelse, ikke længere er der, og 2) bemærke, at den side, der var på disken, nu er i den fysiske hukommelse. Du skal også opdatere TLB'en, herunder fjerne den aflastede side fra den og genstarte instruktionen.
De enkleste sidetabelsystemer vedligeholder ofte en rammetabel og en sidetabel. Rammetabellen indeholder information om, hvilke rammer der vises. I mere avancerede systemer kan rammetabellen også indeholde information om hvilket adresseområde siden tilhører, statistisk information eller anden referenceinformation.
Sidetabellen indeholder en mapping mellem en virtuel sideadresse og en fysisk rammeadresse. Der er også supplerende information om siden, såsom den aktuelle bit, beskidt eller ændret bit, adresserum eller proces-id, for eksempel.
Sekundær lagring såsom en harddisk kan bruges til at øge den fysiske hukommelse. Sider kan bladres ud af fysisk hukommelse og disk. Den aktuelle bit kan indikere, hvilke sider der aktuelt er i den fysiske hukommelse eller på disken, og kan indikere, hvordan disse forskellige sider skal håndteres, dvs. om en side skal indlæses fra disken, og om en anden side skal udskrives i fysisk hukommelse.
Den beskidte bit giver dig mulighed for at optimere ydeevnen. En side på disk, der er indlæst i fysisk hukommelse, derefter læst og efterfølgende bladret igen, skal ikke skrives tilbage til disken, fordi siden ikke er ændret. Men hvis en side er blevet skrevet, efter at den er blevet skiftet ud, vil dens beskidte bit blive sat, hvilket indikerer, at siden skal skrives tilbage til backing-lageret. Denne strategi kræver, at backing-lageret opbevarer en kopi af siden, efter at den er blevet flyttet ind i hukommelsen. Når den beskidte bit ikke bruges, bør bagsidelageret kun være lig med den øjeblikkelige samlede størrelse af alle sider, der blades ud på ethvert tidspunkt. Når den beskidte bit bruges, vil nogle sider altid eksistere i både fysisk hukommelse og backing-lager.
Operativsystemer, der ikke er operativsystemer med enkelt adresserum, har brug for adresserum eller proces-id-oplysninger, så det virtuelle hukommelsesstyringssystem ved, hvilke sider der er knyttet til hvilken proces. To processer kan bruge to identiske virtuelle adresser til forskellige formål. Sidetabellen skal give forskellige virtuelle hukommelseskortlægninger for de to processer. Dette kan gøres ved at tildele forskellige adressekort-id'er til de to processer, eller ved at bruge proces-id'er. At knytte proces-id'er til virtuelle hukommelsessider kan også hjælpe med at vælge, hvilke sider der skal vises pr. side, da sider forbundet med inaktive processer, især processer, hvis hovedtabel er blevet skiftet ud, er mindre tilbøjelige til at blive nødvendige med det samme end sider, der ejes af aktive processer..
Som et alternativ til at tagge sidetabelposter med unikke proces-id'er, kan selve sidetabellen optage forskellige sider af virtuel hukommelse for hver proces, så sidetabellen bliver en del af proceskonteksten. I en sådan implementering kan en proces sidetabel bladres ud, når processen ikke længere er i hukommelsen.
Adressen, der bruges i maskinkoden, dvs. værdien af pointeren, kaldes den "virtuelle adresse".
Adressen som processoren sætter på bussen kaldes den "lineære adresse" (som senere konverteres til en fysisk adresse).
Sidetabelposten indeholder normalt følgende oplysninger:
Antallet af poster i en tabel er begrænset og afhænger af poststørrelsen og sidestørrelsen. Der bruges en fler-niveau organisering af tabeller, ofte 2 eller 3 niveauer, nogle gange 4 niveauer (til 64-bit arkitekturer).
Ved 2 niveauer bruges et "katalog" af sider, som gemmer indgange, der peger på sidetabellernes fysiske adresser. Tabellerne indeholder poster, der peger på sider med data.
Når du bruger 3-niveau organisation, tilføjes en supermappe, der indeholder poster, der peger på flere mapper.
De øverste bits af den virtuelle adresse angiver nummeret på posten i biblioteket, de midterste angiver nummeret på posten i tabellen, de nederste bits (adressen inde på siden) går til den fysiske adresse uden oversættelse.
Formatet af tabelposter, deres størrelse, sidestørrelse og organisering af tabeller afhænger af typen af processor og nogle gange også af dens funktionsmåde.
Historisk har x86 brugt 32-bit PTE'er, 32-bit virtuelle adresser, 4-KB sider, 1024 tabelposter, to-niveau tabeller. De øverste 10 bit af den virtuelle adresse er nummeret på posten i biblioteket, de næste 10 er nummeret på posten i tabellen, de nederste 12 er adressen på siden.
Begyndende med Pentium Pro understøtter processoren 4 MB sider. Men for at systemet og de programmer, der kører på det, kan bruge sider af denne størrelse, skal 4 MB-sideteknologien (store sider) være korrekt aktiveret, og applikationen skal konfigureres til at bruge sider af denne størrelse.
x86-processoren i PAE -tilstand (Physical Address Extension) og i x86_64-tilstand (lang tilstand) bruger 64-bit PTE'er (hvoraf ikke alle fysiske adressebit faktisk bruges, fra 36 i PAE til 48 i nogle x86_64), 32-bit virtuelle adresser, 4-KB sider, 512 tabelposter, tabeller på tre niveauer med fire mapper og fire supermappeposter. De øverste 2 bits af den virtuelle adresse er nummeret på posten i supermappen, de næste 9 bits er i mappen, de næste 9 bits er i tabellen. Den fysiske adresse på biblioteket eller superkataloget indlæses i et af processorens kontrolregistre .
Ved brug af PAE bruges 2MB sider i stedet for 4MB store sider. Se også PSE .
På x86_64-arkitekturen er det muligt at bruge sider på 4 kilobyte (4096 bytes), 2 megabyte og (i nogle AMD64'ere) 1 gigabyte.
Hvis hukommelsesadgangen ikke kan oversættes gennem TLB'en, så får processorens mikrokode adgang til sidetabellerne og forsøger at indlæse PTE'en derfra i TLB'en. Hvis problemerne fortsætter efter et sådant forsøg, udfører processoren en speciel afbrydelse kaldet en " sidefejl " (sidefejl). Behandleren for denne afbrydelse er placeret i det virtuelle hukommelsesundersystem i OS-kernen.
Nogle processorer (MIPS) har ikke mikrokode, der får adgang til tabellen, og genererer en sidefejl umiddelbart efter et mislykket opslag i TLB'en, og adgang til tabellen og dens fortolkning er allerede tildelt sidefejlbehandleren. Dette fjerner kravet om, at sidetabeller skal være i overensstemmelse med et hårdkodet format på hardwareniveau.
Årsager til sidefejl ( sidefejl ):
Kernefejlbehandleren kan indlæse den ønskede side fra en fil eller fra swap-området (se swapping ), kan oprette en skrivebeskyttet kopi af siden, der er tilgængelig til skrivning, eller kan rejse en undtagelse (i UNIX-termer - SIGSEGV -signalet ) i denne proces.
Hver proces har sit eget sæt sidetabeller. Sidebiblioteksregistret genindlæses på hver proceskontekstswitch . Det er også nødvendigt at nulstille den del af TLB, der gælder for denne proces.
I de fleste tilfælde er OS-kernen placeret i det samme adresserum som processerne, og de øverste 1-2 gigabyte af 32-bit adresserummet i hver proces er reserveret til det. Dette gøres for at undgå at skifte sidetabeller, når du går ind og ud af kernen. Kernelsider er markeret som utilgængelige for brugertilstandskode.
Hukommelsesregionen, der indeholder kernen, er ofte identisk for alle processer, men nogle af dens underregioner (f.eks. Windows-kerneregionen, der indeholder grafikundersystemet og videodriveren) kan være forskellige for forskellige grupper af processer (sessioner).
Da kernehukommelsen er den samme for alle processer, skal de tilsvarende TLB'er ikke genindlæses efter en processkift. Til denne optimering understøtter x86 det "globale" flag på PTE'en.
I bibliografiske kataloger |
---|