Тема 7

7. Системни регистри в защитен режим: състав, предназначение и формати.


страницата се нуждае от дописване/преглеждане


<< Тема 6 | Тема 8 >>

Режими на работа (отново)

Тук ще обясним работата на системните регистри в защитен режим. Да припомним разликите межди реален и защитен режим на работа на процесора. Разгледайте хубаво следната схема. На нея са показани два модела на работа на процесора. Първият сегментацията , вторият – странициране. Сега няма да обясняваме подробно работата със всеки от двата модела, понеже в следващите теми точно това ще бъде нашата работа. Тук важното е да разгледаме системните регистри и техния състав и предназначение.
untitled50.JPG

Реален режим

Когато 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). Ето ги основните стъпки при влизането в защитен режим:

  1. Създаване на валидна GDT ( Global Descriptor Table)
  2. Създаване на 6 байтов псевдо дескриптор който да сочи към GDT
  3. Ако ще се използва странициране се зарежда CR3 с валидна странична таблица, PDPR или PML4.
  4. Ако PAE (Physical Address Extension) ще се използва се устанивява CR4.PAE = 1.
  5. Ако ще се превключва в long режим, установяваме IA32_EFER.LME = 1.
  6. Изключване на прекъсванията (CLI).
  7. Зареждане на IDT псевдо дескриптор
  8. Установяване на PE бита (и PG бита ако страницирането ще се използва) на CR0 регистъра
  9. Изпълняване на далечно скачане (far jump)
  10. Зареждане на сегментните регистри с валидни селектори за да се предодвратят GP exception-и когато се изпълняват прекъсвания
  11. Зареждане на SS:(E)SP с валиден стек
  12. Зареждане на IDT псевдо дескриптор който сочи към IDT
  13. Включване на прекъсванията.

Влизане в Long режим

За да влезем в Long режим при 64-битов x86 процесор (x86-64):

  1. Ако е включено страницирането, изключваме го.
  2. Ако CR4.PAE не е вече установен, го установяваме.
  3. Установяваме IA32_EFER.LME = 1.
  4. Зареждаме CR3 с валидна PML4 таблица.
  5. Включваме страницирането.
  6. На тази точка ще сме в compatiblity режим. far jump може да се изпълни за да се превключи към long режим. Оffset-а не трябва да прехвърля 32-бита.

Използване на CR регистрите

untitled51.JPG
untitled52.JPG
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 регистъра.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License