Този раздел е нов. Създаден е през 2022 година.
6.4.7. Устройство за управление на паметта (MMU – Memory Management Unit)
Предназначение и свойства
Според така обявената тема, тук ще се постараем да изясним, или
по-точно, да оправдаем съществуването на устройството за управление на паметта в логическата структура на компютъра. Веднага следва да
уговорим, че да наричаме този компонент от апаратурата на компютъра “устройство”
е доста унизително, като имаме предвид изключителната му сложност и важно значение
за функционирането на съвременния компютър. Това не е просто устройство, а
съвкупност от множество сложни и важни апаратни системи, чиято задача е да
превърне илюзорната представа на Програмиста за строежа и функционирането на
компютърната памет, в действително функционираща физическа система. При
изложението ни ще се основаваме на всичко написано от нас в отделните раздели
на тази книга, което има отношение към аспектите, които ще засегнем тук.
Така нареченото MMU отговаря за управлението на достъпа до клетките в
оперативната памет, които процесорът адресира (вижте
фигура 6.4.3). Основната функция на устройството (ще приемем това
наложило се наименование) е апаратната обезпеченост на виртуалната памет и в
тази връзка:
·
Преобразуването на виртуалните адреси, подавани от процесора, във
физически, т.е. в действителни ;
·
Защита на данните в паметта ;
·
Управление на кеш паметите ;
·
Арбитриране на процесорните шини ;
·
Превключване на блоковете памет .
В някои съвременни системи се говори за PMMU (Paged memory management unit), устройство, което е свързано с управлението на
виртуалната памет, особено в условията на многозадачни операционни системи. MMU (PMMU) са хардуерни блокове, които често се интегрират в
състава на централния процесор или в чипсета на платформите.
Системите с
виртуална памет се отличават със следните свойства:
·
Потребителските процеси са изолирани един от друг, с което закриването им
не се отразява на системата като цяло ;
·
Потребителските процеси са изолирани от физическата памет, така че не им е
известно количеството на оперативните участъци нито по кои адреси се намират ;
·
Операционната система е много по-сложна от тази, поддържаща система без
виртуална памет ;
·
Никога не е възможно да се определи предварително колко време ще е
необходимо за изпълнението на следващата машинна команда .
Принцип на работа
Принципът на работа на съвременните MMU се базира на разделянето на виртуалното адресно
пространство на блокове (рамки, фреймове, страници), имащи еднакъв обем. Обемът
е кратен на 2 и обикновено е няколко килобайта, но може да бъде и значително
повече. Обемът се определя според дължината на онзи младша част от линейния
виртуален адрес, която се нарича отместване в пространството на блока (на
страницата). За подробности в тази връзка, разгледайте раздел
6.4.1 на настоящата книга.
Старшите
битове от виртуалния адрес представят номера на виртуалната страница.
Постъпилият в MMU виртуален адрес подлежи на
преобразуване, в резултат на което се постига реалния физически адрес, до който
се осъществява достъп. Номерата на виртуалните страници се преобразуват в
номера на физически страници, с помощта на буфера за асоциативна транслация ТЛБ
(TLB - Translation Lookaside Buffer).
Фиг. 6.4.7.1. Обобщена
схема за достъп
Ако преобразуването с помощта на TLB е невъзможно, то автоматично се включва по-бавен
механизъм на преобразуване, основан на специализирано апаратно-програмно
осигуряване, работещо в специализираните системни структури на процесора. Данните в тези структури (таблици на страниците) (PT – Page Tables) се наричат елементи на страничните таблици (PTE – Page Table Entries). Конкатенация
от номера на физическата страница и отместването вътре в страницата формира
физическия адрес. Елементите PTE или TLB могат да съдържат и друга информация, която
характеризира състоянието на всяка отделна страница, като например:
·
Бит за запис на данни в страницата (Dirty Bit) ;
·
Време на последния достъп в страницата (Accessed Bit) ;
·
За реализация алгоритъма за заместване на страниците (LRU – Least Recently Used) метка най-отдавна използваната страница ;
·
Какви процеси (потребителски – User
Mode) (или системни - Supervisor
Mode) могат да четат или да записват
данни в страницата ;
·
Може ли страницата да бъде кеширана .
Системна връзка с
ОЗУ
Както е показано на
следващата фигура, процесор, който не поддържа виртуална памет, има “олекотена”
логическа структура. Всички адреси, които използват програмите, изпълняващи се
в този процесор, представляват реални, физически адреси. С други думи, Програмистът,
свързвайки такива програми, следва да знае всеки адрес, към който машинните
команди ще търсят достъп. Ако разполагате само с
640 [KiB] с адреси в интервала 0x02300000-0x0239FFFF, то всички адреси следва да попадат в тази област.
Фиг. 6.4.7.2. Процесор без
поддръжка на виртуална памет
Ако програмистът иска да разчита на памет например с обем от 4[GiB] (обем възможен само за процесори с 32
битова разрядна мрежа) единственото средство, с което може да се удовлетвори
това желание е преход към виртуална памет. Как се постига това е обяснено
подробно в раздел 6.4. на тази книга. Разбира
се това води до използване на MMU, което ще стои между процесора и оперативната памет.
MMU се използва само в случаите, когато се налага достъп до физическата памет
(например, при кеш-пропуск). В останалите случаи, когато MMU не се използва, същото се намира в
икономичен режим , в който консумацията на енергия е минимизирана. Това обаче
не влияе на бързодействието на процесора.
Алгоритъм за достъп
до ОЗУ
Достъп
до реална клетка в ОЗУ процесорът получава само по реален (физически) адрес.
Ето защо е необходимо изпълнението на следните действия:
·
MMU получава виртуален адрес от
процесора ;
·
Ако MMU е изключено, или ако виртуалният
адрес попада в непреобразуема област, то той се приема в качеството на
физически адрес ;
·
Ако MMU е включено и виртуалният адрес
попада в преобразуемата област, се извършва преобразуване на виртуалния адрес
(подменя се виртуалният страничен номер на съответния физически такъв) и заедно
с отместването се формира реалния адрес ;
·
Ако в TLB на виртуалния страничен номер
съществува съответен запис с номера на физическата страница, то той се извлича
и се включва като старша част на бъдещия физически адрес ;
·
Ако в TLB на виртуалния страничен номер не
съществува съответен запис с номера на физическата страница, то тогава се
налага този номер да се търси в таблиците на страниците, които операционната
система поддържа в системата (непреобразуемата) част на оперативната памет.
Таблицата с номерата на физическите страници, създадена от операционната
система при планиране на зареждането на програмата в паметта, се съхранява в
системната област на паметта, с цел да не се допусне пропуск при претърсването
на TLB по време на предходен пропуск.
Търсенето може да бъде реализирано както апаратно, така и програмно. Това е
задача на автомата, обработващ изключенията Page Fault (странична грешка).
Намереният запис се зарежда в TLB, след което командата,
предизвикала пропуска в TLB, се изпълнява отново.
Фиг. 6.4.7.3. Обобщен
алгоритъм за функциониране на MMU
Работата на TLB буфера ще разгледаме с
помощта на простичък пример. Приемаме, че имаме два процеса, А и Б. Всеки един
от тях заема своя собствена адресна област, като при това на неговите команди
са достъпни всички адреси в интервала [0x00000000,
0xFFFFFFFF]. Адресното пространство на всеки от процесите е разделено на страници от по
256[B] (това е измислен размер, на
практика обемът на страницата не е по-малък от 1[KiB]). По този начин, адресът на
първата страница на всеки от процесите ще бъде нула, на втората страница –
0х100, на третата – 0х200 и т.н. до последната, чийто начален адрес ще бъде 0xFFFFFF00. Разбира се, процесът не длъжен да заема цялото адресно
пространство, което му е достъпно. В нашия пример Процес А заема само две
страници, а Процес Б – три. При това една от страниците е обща за двата
процеса.
Фиг. 6.4.7.4. Изходно
състояние на процесите
Освен това налична е
физическа памет с обем 1536[B], която е разделена на
страници всяка с обем 256[B]. Съществува правило,
което се обосновава хардуерно, според което размерът на виртуалната и на
физическата страница, е еднакъв. В примера, паметта на процесите се отразява
във физическата памет на процесора от начален адрес 0х40000000.
Първата страница на Процес А е разположена във физическата
памет с начален адрес 0х40000000 (както е изобразено на горната фигура).
Разпределението и зареждането на програмните страници е функция на
операционната система. Разпределението, което ОС е направила, тя го фиксира в
таблицата на страниците. Така се документира връзката между виртуалната и
физическата страници. При стартиране на програмата се създава процес, който
получава управлението (например Процес А). Първата команда на Процес А няма да
може да се изпълни, тъй като ще предизвика пропуск при достъп до буфера за
транслиране на адреса TLB. В резултат на този
пропуск TLB ще бъде обновен с нов запис,
който се доставя от таблицата на страниците. Така започва изпълнението на
машинните команди от виртуалната страница – всеки заявен виртуален адрес се
преобразува във физически с посредничеството на TLB, по описания вече начин. Когато на Процес А поиска
достъп до втората страница, операционната система ще я зареди в намерено от нея
свободно място във физическата памет, чието начален адрес ще актуализира в
таблицата на страниците (в половината за физически адреси, както е показано на
фигурата по-горе). В примера е прието втората физическа страница да се зареди
по адрес 0х40000200. Ще настъпи още един пропуск в TLB и неговото съдържание отново ще бъде актуализирано с
необходимия запис. Ако TLB е напълно запълнен и
няма място за новия запис, то се изпълнява процедура по изхвърляне (обикновено
на най-отдавна записаната в него страница) и на подмяна на изхвърлената с
ново-заявената от процесора (подробно разгледана в предходните раздели на тази
глава).
След това операционната система може да преустанови Процес А и
да стартира Процес Б. Неговата първа страница ще бъде заредена по физическия
адрес 0х40000000. За разлика обаче от Процес А, първата команда от Процес Б
вече няма да предизвика пропуск в TLB, тъй като записът за
нулевия виртуален адрес вече съществува в буфера. В резултат на това Процес Б
ще започне изпълнението на команди от Процес А! (именно такова се е случвало в
процесор ARM9). Най-лесният начин за решаване на
този проблем е чрез инвалидиране на TLB след всяко превключване
на контекста, т.е. да се маркират всички записи в буфера като недействителни.
Това не е най-добрата идея, тъй като:
·
В TLB към този момент се съдържат само
два записа от възможно 8, т.е. новият запис би се поместил в буфера без проблем
;
·
Изхвърляйки от TLB записи, които
принадлежат на други процеси, ние сме длъжни да генерираме тези процеси
повторно. Заедно с това ще възникнат вече описаните странични грешки, когато
операционната система ги стартира. При това, ако в TLB има не 8 (както в примера) а 1000 записа, то
производителността на системата значително би се влошила.
Съществува още един малко по-сложен
подход. Той изисква свързването на всички програми така, щото те да използват
различни области на виртуалното адресно пространство. Например, Процес А може
да се планира за младшата част (0х00000000 – 0х7FFFFFFF), а Процес Б в старшата част (0х80000000 – 0хFFFFFFFF). Очевидно е, че в този
случай липсва каквато и да е изолация на процесите един от друг, но този подход
се прилага на практика често във встроените системи. За системите с общо
предназначение той очевидно не е подходящ.
И ще се спрем на още един способ, който
представлява едно развитие на по-горе описания. Вместо да делим 4[GiB] виртуално адресно пространство между няколко процеса, то
можем да увеличим това пространство, например 256 пъти. А за да осигурим
изолацията между процесите, ще приемем, че на всеки от процесите е достъпно по
4[GiB] оперативна памет. Това може
лесно да се организира, ако разширим виртуалния адрес до 40 бита. При това
старшите 8 бита на този адрес ще съдържат уникална за всеки процес комбинация,
с която всеки отделен процес ще бъде идентифициран. Присвояването на такива
адреси ще извършва операционната система За целта в логическата структура на MMU следва да се добави специален регистър, който ще съдържа идентификатора на процеса (PID – Process IDentifier). При всяко превключване
на контекста, операционната система ще презаписва идентификатора на процеса в PID регистъра.
Фиг. 6.4.7.5. Виртуално
адресно пространство с идентификатор на процесите
По този начин ако за нашия Процес А
идентификатор PID е равен на единица, а за Процес
Б е равен на две, то еднаквите от гледна точка на процесите виртуални адреси,
например 0х00000100, от гледна точка на процесора ще се окажат равни -
0х01000100 и 0х02000100 съответно. Очевидно е, че в нашият TLB сега трябва да се намират не 24-битови, а 32-битови
номера на виртуални страници. За по-удобно възприемане старшите 8 бита се
съхраняват в отделно поле в идентификатора на адресното пространство (ASID – Address Space IDentifier).
Сега, когато процесорът подава на входа на
MMU виртуален адрес, претърсването на TLB се извършва с помощта на комбинацията VPN и ASID. В резултат първата
команда на Процес Б ще предизвика странична грешка даже без предшестваща
инвалидация на TLB.
В съвременните процесори ASID обикновено има дължина
8, или 16 бита. Като примери читателят може да разгледа процесорите на ARM.
Ще отбележим още, че ако процесорът поддържа виртуална памет, то покрай ASID той може да притежава още и VSID (Virtual address Space IDentificator),
който още
повече разширява виртуалното адресно пространство на процесора. В него се
съдържа номерът на стартираната виртуална машина.
Ще отбележим още, че даже след добавяне на
ASID в структурата на буфера, могат
да възникнат ситуации, при които ще се наложи инвалидация на един или на
няколко записа, или даже на целия TLB буфер:
1.
Ако физическата страница е извадена от оперативната памет във външния диск,
тъй като при обратно зареждане на тази страница в паметта, тя може да бъде
заредена по съвсем друг адрес, т.е. виртуалният адрес няма да се измени, а
физическият ще се измени ;
2.
Ако операционната система е променила
PID на
процеса, при което и ASID ще бъде друг ;
3.
Ако операционната система е завършила процеса.
Следващият раздел е:
Глава 7. ОРГАНИЗАЦИЯ НА УПРАВЛЕНИЕТО