Разлика между версии на „Защитен режим“

м
== Технология ==
 
Тъй като защитениязащитеният режим е базирабазиран на [[real mode|реалния режим]] и наследява повечето му архитектурни особенностиособености, тук ще бъдат посочени само разликите с [[real mode|реалния режим]].
 
* Разширяване на всички регистри от 16 на 32 бита.
=== Регистри ===
 
При защитения режим всички регистри стават 32-битови, а имената им се образуват от префикса '''E''' и името на съответния 16-битов регистър. 32-битовите регистри с общо предназначение са EAX, EBX, ECX, EDX, ESP, ЕBP, EDI и ESI, флаговияфлаговият регистър е EFLAGS, а програмияпрограмият брояч - EIP. Сегментните регистри си остават 16-битови (но адресаадресът се формира по друг начин), като към вече съществуващите CS, DS, SS и ES се прибавят два нови сегментни регистъра, наречени FS и GS.
 
Няма директен начин за достъп до старшите 16 бита на 32-битовите регистри EAX, EBX, ECX и EDX, но се запазва възможността за директен достъп до младшия и старшия байт на младшите 16 бита под имената AL, AH, BL, BH и т.н.
 
Всички нови регистри са достъпни в пълния им 32-битов размер и в [[real mode|реален режим]], но подразбиращияподразбиращият се размер е 16-битов и трябва да се използва специален префикс на иструкцията, за да се работи с 32-битовите регистри. В реален режим сегментните регистри FS и GS работят като останалите семнентни регистри и дават възможнодст за достъп до 6 16-битови сегмента наведнъж.
 
=== Типове данни ===
=== Методи за адресиране ===
 
При защитения режим физическияфизическият адрес се формира по по-сложен начин в сравнение с [[Real_mode#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4.D0.B8_.D0.B7.D0.B0_.D0.B0.D0.B4.D1.80.D0.B5.D1.81.D0.B8.D1.80.D0.B0.D0.BD.D0.B5|реалния режим]]. От самата инструкция се определя т.нар. ''ефективен адрес'', който се преобразува в ''линеен адрес'' чрез механизма за [[сегментиране на паметта]]. Ако не е включен механизма за [[странициране на паметта]], то линейниялинейният адрес съвпада с физическия, но ако механизмамеханизмът за странициране е включен, той преобразува линейния адрес в съответния ''физически адрес''.
 
==== Формиране на адресите ====
:'''A''' е получения ефективен адрес на операнда,
 
:'''B''' е базов адрес (задава се в някой от регистрите с общо предназначение),
 
:'''I''' е индекс (задава се в някой от регистрите с общо предназначение, с изключение на ESP),
 
:'''S''' е мащаб (може да бъде 1, 2, 4 или 8) (задава се като непосредствен операнд в самата инструкция).
 
:'''O''' е отместване, което е непосредствено закодирано в самата инструкция като 8-, 16-, или 32-битово число със знак.
==== Сегментиране на паметта ====
 
ПолученияПолученият по посочения в предната точка начин ефективен адрес, всъщност представлява отместване в рамките на ''сегмент'' от паметта. Докато в реалния режим сегментите се използват само като средство за преодоляване на ограниченото адресно пространство, в защитения режим сегментите служат изключително за осигуряването на апаратна защита на паметта от непозволен достъп.
 
В защитения режим сегментите са дълги до 4 GB (2<sup>32</sup> байта), като началният им адрес, размераразмерът им и другите им атрибути са записани в така наречения ''сегментен дескриптор''. Сегментните десрипторидескриптори са подредени в таблица в паметта, наречена дескрипторна таблица. Може да има множество такива таблици, като във всеки един момент трябва да има поне 2 дефинирани таблици - глобалната дескрипторна таблица (GDT), която е една и съща за всички процеси; и локалната дескрипторна таблица (LDT), която може да е различна за всеки процес. Адресите на GDT и LDT се зареждат в специални 32-битови регистри.
 
Всяка дескрипторна таблица може да съдържа до 2<sup>13</sup> дескриптора на сегменти (2<sup>13</sup> - 1 за GDT, защото първияпървият запис не се използва). Сегментните регистри съдържат 16-битов индекс на някои от дескрипторите в GDT или LDT. Един от битовете на индекса определя дали се прави достъп до LDT или GDT, други два определят обявеното ниво на привилегированост на сегмента (използва се при защитата на паметта), а останалите 13 бита съдържат номера на съответния дескриптор на сегмент в съответната таблица.
 
По отношение на защита на паметта, всеки сегмент има като атрибут т. нар. ниво на привилегированост (цяло число от 0 до 3, като 0 е най-привилегированото ниво). ОбикновенноОбикновено операционната система работи на ниво 0, а потребителските програми - на ниво 3. Останалите нива не се използват при повечето съвременни операционни системи.
 
Действието на защатита на паметта може да бъде обобщено по следния начин:
==== Странициране на паметта ====
 
Полученият след сегментирането ''линеен адрес'' съвпада с физическия адрес само ако не е включено страницирането на паметта (страницирането на паметта е опционално и може да се изключи). При включено странициране на паметта, линейниялинейният адрес се преобразува във физически по описаната по-долу схема.
 
Страниците на паметта при защитения режим са с размер 4 KB (2<sup>12</sup> байта) и са подравнени на гранците 4 KB (по-късно са въведени страници с по-голям размер - 4 MB, за да може да се използват по-големи адресни пространства). 32-битовият линеен адрес може да се разглежда като съвкупност от:
 
* Най-старшите 10 бита определят индекс в каталога на страниците, който представлява таблица от 1024 елемента в паметта. Всеки от тези елементи сочи към адреса на една от таблиците на страниците, или към началния адрес на страница от 4 MB; или е невалиден.
Страницирането на паметта осигурява възможност за използването на [[виртуална памет]], тъй като една страница може да бъде обявена за невалидна в таблицата на страниците и всеки достъп до нея предизвиква специално прекъсване, което дава възможност на операционната система да зареди съответната страница в паметта.
 
В съвременните операционни системи за управление на паметта се използва предимно страницирането, а сегментирането почти не се използва (обикновеннообикновено всички сегменти са с максимален размер и начален адрес 0, което на практика ги обезмисляобезсмисля). Това се налага поради факта, че при писането на приложни и системни програми сегментирането създава много главоболия и проблеми, а страницирането е напълно невидимо за потребителските програми.
 
Защитата на паметта от гледна точка на страницирането е доста "орязана": в описанието на страницата има само 2 еднобитови флага, които осигуряват следните нива на достъп: забранен всякакъв достъп, разрешено четене и разрешено четене и запис. В по-съвременните x86 процесори (произведени след 2003 г.) е въведен т. нар. [[NX бит]], който показва дали е разрешено изпълнението на програмен код в съответната страница. Това повишава сигурността на операционната система, предотвратявайки една от най-често използваните хакерски атаки - препълването на буфер.
 
=== Входно-изходно адресно пространство ===
* '''CLI''', '''STI''' (прави се само първата проверка)
 
Както се вижда, освен достъпа до входно-изходното адресно пространство, се ограничава и способността на програмата да маскира прекъсванията, за да не може да "завземе" процесорното време, игнорирайки прекъсванията от часовника.
 
Както полето IOPL, така и таблицата за защита на входно-изходното пространство са специфични за всеки процес, която позволява на операционната система да управлява достъпа до входно-изходното пространство изключително гъвкаво.
=== Инструкции ===
 
Следва описание на новите инструкции в сравнение с [[Real mode#.D0.98.D0.BD.D1.81.D1.82.D1.80.D1.83.D0.BA.D1.86.D0.B8.D0.B8|реалния режим]]. Трябва да се има предвид, че повечето нови инструкции могат да се използват и в реален режим. Новите инструкции, които могат да бъдат използвани само в защитен режим, са специално отбелязани.
 
==== Инструкции за трансфер на данни ====
* '''BT''' - проверка на даден бит (бита се записва в полето CF на на регистъра EFLAGS).
* '''BTC''' - също като '''BT''', като стойността на адресирания бит се променя.
* '''BTR''' - също като '''BT''', като адресиранияадресираният бит се нулира.
* '''BTS''' - също като '''BT''', като адресиранияадресираният бит се установява в 1.
 
==== Инструкции за работа със стрингове ====
149

редакции