7. Системни регистри в защитен режим: състав, предназначение и формати.
страницата се нуждае от дописване/преглеждане
Режими на работа (отново)
Тук ще обясним работата на системните регистри в защитен режим. Да припомним разликите межди реален и защитен режим на работа на процесора. Разгледайте хубаво следната схема. На нея са показани два модела на работа на процесора. Първият сегментацията , вторият – странициране. Сега няма да обясняваме подробно работата със всеки от двата модела, понеже в следващите теми точно това ще бъде нашата работа. Тук важното е да разгледаме системните регистри и техния състав и предназначение.
Реален режим
Когато x86 процесор се включва или reset-ва, той е в реален режим. В реален режим x86 процесора се използва само базовия набор от инструкции на процесора. Адресното пространство на реалния режим е лимитирано до 1MiB адресируема памет и всеки сегмент на паметта е лимитиран до 64KiB.
Защитен режим
В защитен режим x86 може да адресира 16 Mb или 4 GB от адресно пространство. Това може да се изобрази директно върху физическия RAM (в този случаи ако имаме по-малко от 4 GB RAM, част от адресното пространство остава неизползвано) или може да се използва странициране.
Защитения режим се контролира от управляващи регистри (Control Registers), които са означени CR0, CR2, CR3 и CR4.
Навлизане в защитен режим
Най-ниските 5 бита от управляващия регистър CR0 съдържа 5 флага които определят как системата ще работи. Статусния регистър има 1 флаг от който най-много се интересуваме: "Protected Mode Enable" флагът (PE). Ето ги основните стъпки при влизането в защитен режим:
- Създаване на валидна GDT ( Global Descriptor Table)
- Създаване на 6 байтов псевдо дескриптор който да сочи към GDT
- Ако ще се използва странициране се зарежда CR3 с валидна странична таблица, PDPR или PML4.
- Ако PAE (Physical Address Extension) ще се използва се устанивява CR4.PAE = 1.
- Ако ще се превключва в long режим, установяваме IA32_EFER.LME = 1.
- Изключване на прекъсванията (CLI).
- Зареждане на IDT псевдо дескриптор
- Установяване на PE бита (и PG бита ако страницирането ще се използва) на CR0 регистъра
- Изпълняване на далечно скачане (far jump)
- Зареждане на сегментните регистри с валидни селектори за да се предодвратят GP exception-и когато се изпълняват прекъсвания
- Зареждане на SS:(E)SP с валиден стек
- Зареждане на IDT псевдо дескриптор който сочи към IDT
- Включване на прекъсванията.
Влизане в Long режим
За да влезем в Long режим при 64-битов x86 процесор (x86-64):
- Ако е включено страницирането, изключваме го.
- Ако CR4.PAE не е вече установен, го установяваме.
- Установяваме IA32_EFER.LME = 1.
- Зареждаме CR3 с валидна PML4 таблица.
- Включваме страницирането.
- На тази точка ще сме в compatiblity режим. far jump може да се изпълни за да се превключи към long режим. Оffset-а не трябва да прехвърля 32-бита.
Използване на CR регистрите
CR0
CR0 32-битовия регистър има 6 бита от които се интересуваме. Ниските 5 бита на CR0 регистъра и най-високия бит. Ето пример за CR0:
CR0: |PG|RESERVED|ET|TS|EM|MP|PE|
PE - Нулев бит. Protected Environment флаг. Този флаг слага системата в защитен режим когато се установи.
MP - Първи бит. Monitor Coprocessor флаг. Този флаг контролира изпълнението на "WAIT" инструкцията.
EM - Втори бит. Emulate флаг. Когато флага е установен инструкциите на копроцесора ще издадат exception.
TS - Трети бит. Task Switched флаг. Този флаг се установява автоматично когато процесора се включи в различна задача.
ET - Четвърти бит. Extension Type флаг. ET (също наричан "R") указва какъв тип копроцесор е инсталиран. Ако ET = 0, 80287 е и нсталиран, ако ET = 1 - 80387.
PG - 31-ви бит. Paging флаг. Когато този флаг е установен страницирането на паметтта е включено.
CR1
CR1 е резервиран и в момента не се използва.
CR2
CR2 съдържа стойност наречена Page Fault Linear Address (PFLA). Когато настъпи грешка в дадена страница, този адрес се записва в CR2.
CR3
Горните 20 бита от CR3 са наречени Page Directory Base Register (PDBR). PDBR съдържа физическия адрес на страничната директория.
CR4
CR4 съдържа няколко флага контролиращи по-сложни способности на процесора.
Странициране
Страницирането е специална работа, която микропроцесора ще извърши, за да направи паметта в системата да изглежда повече отколкото е в действителност и да бъде по-динамична.
При страничната система, определено количество пространство може да бъде заделено на харддрайва и наречено swap файл. Виртуалната памет на една система е всичко което една програма може да достъпи като памет и това включва физически RAM и swap пространството.
Крайната виртуална памет е разделена на части или страници от памет, всяка обикновено по 4096 байта (въпреки че това число може да бъде различно за различните системи). Тези страници могат де бъдат размествани в цялата виртуална памет и всички указатели в тези страници ще бъдат автоматично ъпдейтнати да сочат към новите места. Указателят на текущата странична директория се съдържа в CR3 регистъра.
Страниците които не се използват често може да се преместят е swap пространството, за да освободят пространство във физическия RAM за страници които трябва да бъдат достъпвани по-често или които се нуждаят до по-бърз достъп. Четенето и писането на страници на харддрайва е бавна операция , така че при някои много стари процесори може да бъде по-добре да се изключи страницирането. Това става чрез CR0 регистъра.
Грешка при някоя страница се получава при системен опит да се прочете от страница която е маркирана "not present" в таблицата на страниците(директорията) и при други подобни случаи. Когато такава грешка възникне, адресът на достъпената памет се запазва в CR2 регистъра.





