Јединица за управљање меморијом (ММУ), понекад се назива Јединица за управљање страницама меморије (ПММУ), је јединица рачунарског хардвера кроз коју пролазе све меморијске референце, пре свега она обавља превод виртуалне меморијске адресе у физичке адресе. Обично је имплементирана као део процесора (CPU), али такође може бити у форми посебног интегрисаног кола.
Савремене MMUs обично деле виртуелни адресни простор (опсег адреса које користи процесор) у странице, свака је величине неког степена двојке, обично неколико килобајта, али могу бити и много веће. Доњи битови адресе (офсет унутар странице) остају непромењени. Горњи битови адресе су бројеви виртуалне странице.[1]
Унос табеле страница
Већина MMU користи табелу уноса ставки која се зове табела страница, садржи један унос табеле страница (PTE) по страници, да мапира бројеве виртуелних страница на физичке бројеве страница у главној меморији. Асоцијативни кеш PTE-а се зове Бафер асоцијативног превођења (TLB) и користи се да би се избегла неопходност приступа главној меморији сваки пут када је виртуелна адреса мапирана. Друге MMU могу имати приватне низове меморије[2] или регистре који поседују скуп ставки табеле страница. Број физичке странице се комбинује са офсетом стране дајући потпуну физичку адресу.[1]
Понекад, PTE забрањује приступ виртуелној страници, можда зато што тој виртуелној страници није додељен физички RAM. У овом случају, MMU сигнализира грешку странице процесору. Оперативни систем (ОС) онда управља ситуацијом, можда покушавајући да пронађе резервни оквир РАМ-а и да постави нову PTE да мапира тражену виртуелну адресу. Ако нема слободног РАМ-а, може бити потребно да се изабере нека постојећа страница (познато као "жртве"), користећи неки алгоритам замене, и сачувати га на диск (процес се зове "страничење"). Са неким јединицама за управљање меморијом, може бити мањак уноса табела страница, у том случају ће оперативни систем морати да ослободи једну за ново мапирање.[1]
Предности
У неким случајевима грешка стране може да указује на софтверску грешку. Кључна корист од ММУ је заштита меморије: Оперативни систем може да га користи за заштиту од програма луталица онемогућавањем приступа меморији, да одређени програм не треба да има приступ. Типично, оперативни систем додељује сваки програм свом сопственом виртуелном адресном простору.[1]
ММУ такође ублажава проблем фрагментације меморије. Након што су блокови меморије издвојени је и ослобођени, слободна меморија може постати фрагментирана (испрекидана), тако да највећи непрекидни блок слободне меморије може бити много мањи од укупног износа. Са виртуелним меморијом, непрекидни распон виртуелних адреса може да се мапира на неколико не-суседних блокова физичке меморије.[1]
Иако се овај текст концентрише на савремене ММУ, обично базираним на страницама, ранији системи су користили сличан концепт за адресирање ограничене базе(основе), који се даље развија у сегментацију. Они су повремено присутни на савременим архитектурама.X86 архихектура обезбеђује сегментацију, пре него страничење, у 80286, а у 80386. и у каснијим процесорима (мада употреба сегментације није доступна у 64-битним операцијама) обезбеђује и страничење и сегментацију.
Примери
Многи савремени системи деле меморију на странице које су величине 4-64 KB, често са могућношћу да користе огромне странице величине од 2 MB до 512 MB. Превођење страница је кеширно у TLB-у. Неки системи, углавном старији, који су RISC дизајна, имају грешку у ОС-у када превођење странице није нађено у TLB-у. Већина система користи хардверски базирано стабло. Већина система омогућавају ММУ да буде онемогућена, али неки онемогуће ММУ када у коду ОС-а дође до грешке.
VAX
Величина VAX страница је 512 бајтова, што је веома мало. Оперативни систем може третирати више страница као да су једна већа страница. На пример, Линукс на VAX-у групише осам страница заједно. Дакле, систем се посматра као да има странице од 4 KB. VAX дели меморију у четири региона фиксне намене, сваки величине1 GB. То су:
P0 простор: се користи за опште намене по процесу меморије, као што је хип (енгл.heap),
P1 простор: (или контролни простор) који је такође по процесу и обично се користи за контролу, извршавање, кернел, коришћење стека и других контолних структура по-процесу којима управља оперативни систем,
S0 простор: (или системски простор) који је глобални за све процесе и меморише код оперативног система и податке, било страничења или не, укључујући табеле страница, и
S1 простор: који је неискоришћен и "Резервисан за дигитално".
Табеле страница су велики линеарни низови. Нормално, ово ће бити веома расипнички када се адресе користе на оба краја могућег опсега, али табеле страница за апликације се саме чувају у кернеловој меморији странице. Дакле, ефикасно постоје два нивоа стабла, омогућавајући апликацијама да имају редак распоред меморије без великог губитка простора на неискоришћеним улазима табеле страница. VAX MMU је значајна за недостатак приступљеног бита. Оперативни системи који имплементирају страничење морају да пронађу неки начин да емулирају приступни бит, ако желе да раде ефикасно. Типично, оперативни систем ће периодично демапирати странице тако да страна-није-присутна грешке могу да се користе да допусте ОС-у да сетује приступни бит.
ARM
Процесори базирани наARM архитектури имплементирају јединицу за управљање меморијом(MMU) која је дефинисана у ARM архихектури система виртуелне меморије. Тренутна архихектура дефинише PTE за опис страна од 4 KB и 64 KB, секције од 1 MB у супер-секције од 16 MB; наслеђене верзије такође дефинишу мале стране од 1 KB. ARM користи два-нивоа табеле страница ако користи стране од 4 KB и 64 KB, или само један-ниво табеле страница за секције од 1 MB и 16 MB.
TLB ажурирања аутоматски се обављају хардверски преко табеле страница. PTE укључује дозволу, базирану на привилегијама, за приступ читању/уписивању, могућност кеширања информација, NX бит, и несигурни (енгл.non-secure) бит.
[4]
IBM System/370 и наследници
IBM System/370 је имао MMU још одд почетка 70-их. Првобитно је био познат као DAT кутија. Он има необичну функцију чувања примљених и оштећених битова ван табеле страница. Они се односе на физичку меморију, пре него на виртуелну, и приступа им се преко инструкција специјалне сврхе или намене. Ово смањује додатне трошкове за ОС, који би иначе требало да пропагирају примљене и прљаве битове из табела страница са више физички оријентисаних структура података. Ово чини ниво виртуелизације ОС-а лакшим. Ове карактеристике су наслеђене успехом мејнфрејм архихектуре, до тренутне z/Архихектуре.
DEC Alpha
DEC Alpha процесор дели меморију на 8 KB странице. После промашаја TLB -а, машина ниског нивоа Фирмвер (овде се зове PALcode) уводи три нивоа структуисаног стабла табеле страница. Адресе су подељене на следећи начин: 21 неискоришћи бит, 10 битова да индексира ниво корена стабла, 10 битова да индексира средњи ниво стабла, 10 битова да индексира ниво листа дрвета, као и 13 бита који пролазе кроз физичку адресу без модификација. Подржани су сви битови дозволе за читање/уписивање /извршавање.
MIPS
MIPS архихектура подржава један од 64 уноса у TLB. Број TLB уноса је конфигурисан на CPU конфигурацију пре спајања. TLB уноси су двоструки. Сваки TLB унос мапира виртуелни број стране (VPN2) било којем од два броја оквира стране (PFN0 или PFN1), у зависности од најмање тежине бита виртуелне адресе која није део маске(енгл.mask) странице. Овај бит и битови маск стране нису складиштени у VPN2. Сваки TLB унос има своју величину стране, која може бити било која вредност од 1 KB до 256 MB у мултипликатору четворке. Сваки PFN у TLB уносу има кеширане атрибуте, лош и валидан статус бита. VPN2 има глобални статус бита и ОС додељује ID који учествује у виртуелној адреси поклапања TLB уноса, ако је глобални статус бита постављен на нулу. PFN складишти физичку адресу без битова маск стране.
Допуњен TLB изузетак се генерише када нема уноса у TLB који се подударају са мапираном виртуелном адресом. TLB неважећи изузетак се генерише када постоји подударање али је унос означен као неважећи. TLB модификовани изузетак се генерише када има подударања али dirty статус није постављен. Ако се TLB изузетак јави приликом обраде TLB изузетка, двострука грешка TLB изузетка, он се шаље свом руковаоцу изузецима.
MIPS32 и MIPS32r2 подржавају 32 бита виртуелног адресног простора и до 36 бита физичког адресног простора. MIPS64 подржава до 64 бита виртуелног адресног простора и до 59 бита физичког адресног простора.
Sun 1
Оригинални Sun 1 био је SBC изграђен око Motorola 68000 микропроцесора и уведен је 1982. Он укључује оригиналну Sun 1 јединицу за управљање меморијом која обезбеђује превођење адреса, меморијску заштиту, дељење меморије и меморијску алокацију за вишеструке процесе који су покренути на CPU-у.
Сви приступи CPU-а приватној RAM плочи, спољној меморијској мулти-магистрали, У/И плочи и У/И мулти-магистрали која пролази кроз MMU, где су преведени и заштићени у uniform fashion. MMU је била имплементирана у хардверу на CPU плочи.
MMU се састојала од контекстног регистра, мап сегмента и мап страница. Виртуелна адреса из процесора је преведена на средњу адресу од стане мап сегмента, које су у повратку преведене на физичке адресе помоћу мап странице. Величина страница је 2 KBи величина сегмента је 32 KB што даје 16 страница по сегменту. До 16 контекста могу бити мапирани истовремено. Максимални логички адресни простор за контекст је1024 pages или 2 MB. максимална физичка адреса која може бити мапирана истовремено је 2 MB.
Контексни регистар је био важан у мулти таскингу ОС-а зато што је он дозвољавао процесору да замени процесе без потребе да се информације стања превођења поново пуне. 4-битни контексни регистар је могао да под контролом супервизора замени 16 секција мап сегмента, што је омогућило да се 16 контекста истовремено мапира. Сваки контекст је имао свој виртуелни адресни простор. Дељење виртуелног адресног простора и међу-контексне комуникације може бити обезбеђено уписивањем истих вредности у сегмент или мап странице различитих контекста. Управљање додатним контекстима уз помоћ обраде мап сегмента као кеш контекста и заменом истеклог контекста на последњој скоро коришћеној магистрали.
Контексни регистар не прави никакву разлику између корисника и контроле стања. Прекиди и изузеци (грешке, замке) не замењују контексте који захтевају да сви валидни прекиди вектора увек буду мапирани на страни 0 неког контекста, као и валидни стек контолор.[5]
PowerPC
PowerPC странице G1, G2, G3, и G4 су 4 KB. После промашаја TLB -а, стандардна PowerPC MMU започиње два истовремена претраживања(lookup). Једно претраживање настоји да мечује адресу са једним од четири или осам DBAT регистра, или четири или осам IBAT, по потреби. BAT регистри могу да мапују линеарне комаде меморије велике као 256 MB, и обично се користе од стране оперативног система за мапирање великих делова адресног простора за сопствену употребу оперативног система кернела. Ако BAT претрага успе, следећа претрага је прекинута и игнорисана.
Друга претрага, није директно подржана од стране свих процесора у овој фамилији, је помоћу такозване "инвертоване табеле страница", која делује као хеширана екстензија TLB-а ван чипа. Прво, прва четири бита адресе се користе да селектују један од 16 сегментних регистара. Затим, 24 бита из сегментног регистра замени ова четири бита, стварајући 52-битне адресе. Употреба сегментираних регистара дозвољава вишеструким процесима да деле исту хеш табелу.
52-битна адреса је хеширана, затим искоришћена као индекс у табели ван чипа. Група од осам табела странице уноса се скенира за ону која одговара. Ако ниједна не одговара током прекомерне хеш колизије, процесор поново покушава са мало другачијом хеш функцијом. Ако и она не успе, процесор јавља грешку ОС-у (са онеспособљеном MMU), тако да се проблем можда може решити. Оперативни систем мора да одбаци ставку из хеш табеле да направи простор за нови улаз. Подршка за контролу бита који се не извршава је у сегментом регистру, доводи до 256 MB разуђености.
Главни проблем овог дизајна је сиромашна локалност кеша проузрокована хеш функцијом. Дизајн базиран на стаблу избегава то тако што смешта унос табеле страница за суседне странице у суседне локације. Оперативни систем који се покреће на PowerPC-у може да минимизује величину хеш табеле да би умањио овај проблем.
Донекле је споро да се уклони табела страница уноса процеса. Оперативни систем може да избегне поновно коришћење вредности сегмента да одложи суочавање са овим, или може да одлучи да трпи губитак меморије повезане са по-процесом хеш табеле. G1 чипови не траже ставке табеле страница, али генеришу хеш, са очекивањем да ће ОС тражити хеш табелу преко софтвера. ОС може да пише по TLB-у. G2, G3, и рани G4 чипови користе хардвер за претрагу хеш табела. Последњи чипови дозвољавају ОС-у да изабере метод. На чипу који пружа ову опционалност или је не подржава уопште, ОС може изабрати да користи искључиво табелу страница која је базирана на стаблу.
IA-32 / x86
X86 архихектура је еволуирала током веома дугог периода задржавајући потпуну софтверску компатибилност, чак и за OS код. Дакле, MMU је веома комплексна, са много различитих могућих режима рада. Нормалан рад традиционалног 80386. процесора и његових наследника (IA-32) је описан овде.
Процесор најпре дели меморију на странице од 4 KB. Сегментни регистри, од основне су важности за старије 8088 и 80286. дизајне MMU-а, не користе се у савременим оперативним системима, са једним главним изузетком: приступ специфичним нитима података за апликације или специјалне процесорске податке за ОС кернел, које се обавља уз експлицитно коришћење FS и GS сегментних регистра. Сав приступ меморији подразумева регистар сегмента, који је изабран према коду који се извршава. Сегментни регистар се понаша као индекс у табели, који омогућује да се дода офсет у виртуелну адресу. Осим када се користи FS or GS, оперативни систем осигурава да ће бити офсет нула.
Пошто је офсет додат, адреса се маскира да не буде већа од 32 бита. Резултат се може претражити преко структуре стабла табеле страница, са адресним битовима подељеним на следећи начин: 10 битова за грану стабла, 10 битова за листове гране, и 12 најнижих битова се директно копира у резултат. Неки оперативни системи, као OpenBSD са својим W^X својством, и Линукс са Exec Shield или PaX закрпама, такође могу лимитирати дужину сегментног кода, као што је наведено од стране CS регистра, да онемоући извршавање кода у изменљивим регијама адресног простора.
Мање ревизије јединица за управљање меморијом (MMU) уведене са Пентијумом, имају дозвољене веома велике 4 MB стране, тако што прескачу доње нивое стабла. Мање ревизије MMU-а уведене са Пентијумом Про уводе својство проширења физичке адресе, омогућавајући 36-битну физичку адресу преко нивоа стабла табеле страница (са 9+9+2 битова за нивое стабла, 12 најмањих битова је директно копирано у резултат; велике странице постају величине само 2 MB). Поред тога, табела атрибута странице дозвољава спецификацију могућности кеширања тражењем неколико високих битова у малим на процесорској табели.
Подршка NX (non-execute) бита се првобитно пружала само на оновном пер-сегменту, што је врло незгодно за коришћење. Новији x86 чипови обезбеђују NX бит по-станици у PAE режиму. W^X, Exec Shield и PaX механизми, изнад описани, опонашају NX подршку по страници на машинама са x86 процесорима недостаје NX бит постављањем дужине сегментног кода, са губитком перформансе и смањењем расположивог адресног простора.
x86—64
x86-64 је 64-битно проширење x86-це које скоро у потпуности уклања сегментацију у корист линеарног модела меморије, које користе скоро сви оперативни системи за 386 или за новије процесоре. У дугом режиму, сви сегменти офсета су игнорисани, осим FS и GS сегменти. Када се користи са 4 KB страницама, дрво табеле странице има четири нивоа уместо три. Виртуелне адресе су подељене на следећи начин: 16 бита неискоришћено, девет битова сваки четири нивоа стабла (укупно 36 бита), а 12 најнижих битова се директно копирају у резултат. Са страницама од 2 MB, има само три нивоа табеле страица, укупно 27 битова се користи у страничењу и 21 бит за офсет. Неки новији процесори такође подржавају странице од 1 GB са два нивоа страничења и 30 битова за офсет.[6]CPUID може да се користи да се утврди да ли су странице од 1 GB подржане. У сва три случаја, 16 највиших битова треба да буду једнаки 48. биту, или другим речима, најнижи 48 битови су знак проширењана више битове. Ово се ради да омогући будуће проширење адресабилног опсега, без угрожавања повратне компатибилности. У свим нивоима табеле страница, унос табеле странице садржи бит који се не извршава.
Unisys MCP Systems (Burroughs B5000)
Таненбаум и сар., недавно су изјавили[7] да B5000 (системи потомци) немају MMU. Да бисте разумели функционалност коју обезбеђује ММУ, поучно је проучити контра пример система који остварује ову функционалност другим средствима.
B5000 је био први комерцијални систем који је подржавао виртуелну меморију после Атласа. Он пружа две функције MMU-а на различите начине. У мапирању виртуелних меморијских адреса, уместо потребе за јединицом која управља меморијом, MCP су базитани на дескриптору. Сваки издвојен меморијски блок је дат главном дескриптору са особинама блока (тј., величина, адреса, и да ли у меморији). Када је захтев поднет за приступ блоку за читање или писање, хардвер проверава своје присуство преко присутности бита (пбита) у дескриптору.
Пбит 1 указује на присуство блока. У овом случају, блоку се може приступити преко физичкое адресе у дескриптору. Ако је пбит 0, прекид се генерише за MCP (оперативног система) да би блок представљен. Ако је адресно поље 0, то је први приступ блоку, и он је додељен (инит пбит). Ако адресно поље није нула, то је диск адресе блока, који је претходно био избачен, па је блок учитан са диска и пбит је постављен на један и физички меморијска адреса је ажурирана да укаже на блок у меморији (још један пбит). Ово чини дескриптора еквивалентим на улазу табеле страница у неком MMU систему. Перформансе система се могу пратити преко броја пбитова. Инит пбитови показују почетне расподеле, али висок ниво осталих пбитова указује да систем може бити оштећен.
Све алокације меморије су зато потпуно аутоматске (једна од одлика модерних система[8]) и не постоји начин да се издвоје блокови, осим преко овог механизма. Не постоје такви позиви као Malloc или dealloc, пошто се меморијски блокови такође аутоматски одбацују. Шема је такође лења, јер блок неће бити алоциран док се заправо не референцира. Када је меморија скоро пуна, MCP испитује радни сет, испробава компактност (јер систем је сегментиран, није страничење), деалоцира реад-онли сегменте (као што су кодни сегменати који могу бити враћени из своје оригиналне копије) и, као последње средство, избацује лоше сегменте података из диска.
Други начин да B5000 омогући дункцију MMU је у заштити. Пошто су сви приступи преко дескриптора, хардвер може да провери да ли су сви приступи унутар граница и, у случају уписа, који процес уписује дозволу. MCP систем је сами по себи безбедан и стога нема потребе за ММУ да обезбеди овај ниво заштите меморије. Дескриптори се читају само за корисничке процесе и могу бити ажурирани само од стране система (хардвера или MCP-а). (Речи чија ознака је непаран број су рид-онли (read-only); дескриптори имају ознаку 5 и код речи има ознаку 3).
Блокови могу да се деле између процеса преко копирања дескриптора у процесу стека. Тако, неки процеси могу имати дозволу писања, док други не. Сегментни код је рид-онли и на тај начин увучен и подељен између процеса. Копија дескриптора садржи 20-битно адресно поље дајући индекс главног дескриптора у главном низу дескриптора. Ово такође имплементира веома ефикасан и сигуран IPC механизам. Блокови могу лако бити премештени, јер само главни дескриптор треба ажурирати када се статус блока промени.
Једини други аспект јесте перформанса - да ли MMU-based или non-MMU-based системи обезбеђују боље перформансе? MCP системи могу се спроводити на врху стандардног хардвера који има MMU (на пример, стандардни PC). Чак и ако системска имплементација користи MMU на неки начин, то неће бити нимало видљиво на нивоу MCP-а.