Защитен режим: Разлика между версии
Изтрито е съдържание Добавено е съдържание
м -и век ---> век ; козметични промени |
м замяна с n-тире |
||
Ред 24:
=== Регистри ===
При защитения режим всички регистри стават 32-битови, а имената им се образуват от префикса '''E''' и името на съответния 16-битов регистър. 32-битовите регистри с общо предназначение са EAX, EBX, ECX, EDX, ESP, EBP, EDI и ESI, флаговият регистър е EFLAGS, а програмият брояч
Няма директен начин за достъп до старшите 16 бита на 32-битовите регистри EAX, EBX, ECX и EDX, но се запазва възможността за директен достъп до младшия и старшия байт на младшите 16 бита под имената AL, AH, BL, BH и т.н.
Ред 34:
В добавка към типовете данни, които могат да бъдат обработвани в [[реален режим]], в защитения режим могат да бъдат обработвани следните типове данни:
* '''32-битови цели числа без знак'''. Имат диапазон на възможните стойности от 0 до 2<sup>32</sup>
* '''32-битови цели числа със знак'''. Имат диапазон на възможните стойности от -2<sup>31</sup> до 2<sup>31</sup>
* '''низ от байтове'''. Последователност от байтове с максимален размер до 2<sup>32</sup>
=== Методи за адресиране ===
Ред 68:
Полученият по посочения в предната точка начин ефективен адрес, всъщност представлява отместване в рамките на ''сегмент'' от паметта. Докато в реалния режим сегментите се използват само като средство за преодоляване на ограниченото адресно пространство, в защитения режим сегментите служат изключително за осигуряването на апаратна защита на паметта от непозволен достъп.
В защитения режим сегментите са дълги до 4 GB (2<sup>32</sup> байта), като началният им адрес, размерът им и другите им атрибути са записани в така наречения ''сегментен дескриптор''. Сегментните дескриптори са подредени в таблица в паметта, наречена дескрипторна таблица. Може да има множество такива таблици, като във всеки един момент трябва да има поне 2 дефинирани таблици
Всяка дескрипторна таблица може да съдържа до 2<sup>13</sup> дескриптора на сегменти (2<sup>13</sup>
По отношение на защита на паметта, всеки сегмент има като атрибут т. нар. ниво на привилегированост (цяло число от 0 до 3, като 0 е най-привилегированото ниво). Обикновено операционната система работи на ниво 0, а потребителските програми
Действието на защатита на паметта може да бъде обобщено по следния начин:
Ред 83:
Полученият след сегментирането ''линеен адрес'' съвпада с физическия адрес само ако не е включено страницирането на паметта (страницирането на паметта е опционално и може да се изключи). При включено странициране на паметта, линейният адрес се преобразува във физически по описаната по-долу схема.
Страниците на паметта при защитения режим са с размер 4 KB (2<sup>12</sup> байта) и са подравнени на гранците 4 KB (по-късно са въведени страници с по-голям размер
* Най-старшите 10 бита определят индекс в каталога на страниците, който представлява таблица от 1024 елемента в паметта. Всеки от тези елементи сочи към адреса на една от таблиците на страниците, или към началния адрес на страница от 4 MB; или е невалиден.
Ред 97:
В съвременните операционни системи за управление на паметта се използва предимно страницирането, а сегментирането почти не се използва (обикновено всички сегменти са с максимален размер и начален адрес 0, което на практика ги обезсмисля). Това се налага поради факта, че при писането на приложни и системни програми сегментирането създава много главоболия и проблеми, а страницирането е напълно невидимо за потребителските програми.
Защитата на паметта от гледна точка на страницирането е доста "орязана": в описанието на страницата има само 2 еднобитови флага, които осигуряват следните нива на достъп: забранен всякакъв достъп, разрешено четене и разрешено четене и запис. В по-съвременните x86 процесори (произведени след 2003 г.) е въведен т. нар. [[NX бит]], който показва дали е разрешено изпълнението на програмен код в съответната страница. Това повишава сигурността на операционната система, предотвратявайки една от най-често използваните хакерски атаки
=== Входно-изходно адресно пространство ===
Ред 122:
==== Инструкции за трансфер на данни ====
* '''MOVSX'''
* '''MOVZX'''
* '''PUSHA'''
* '''POPA'''
==== Инструкции за побитови операции ====
* '''BSF''', '''BSR'''
* '''BT'''
* '''BTC'''
* '''BTR'''
* '''BTS'''
==== Инструкции за работа с низове ====
* '''INS'''
* '''OUTS'''
==== Инструкции за преход ====
* '''ENTER'''
* '''LEAVE'''
* '''SETO''', '''SETNE''', '''SETB'''/'''SETNAE'''/'''SETC''', '''SETNB'''/'''SETAE'''/'''SETNC''', '''SETE'''/'''SETZ''', '''SETNE'''/'''SETNZ''', '''SETBE'''/'''SETNA''', '''SETS''', '''SETNS''', '''SETP'''/'''SETPE''', '''SETNP'''/'''SETPO''', '''SETL'''/'''SETNGE''', '''SETNL'''/'''SETGE''', '''SETLE'''/'''SETNG''', '''SETNLE'''/'''SETJG'''
==== Инструкции, работещи само в защитен режим ====
* '''ARPL'''
* '''LAR'''
* '''LGDT''', '''SGDT'''
* '''LIDT''', '''SIDT'''
* '''LLDT''', '''SLDT'''
* '''LMSW''', '''SMSW'''
* '''LSL'''
* '''LTR''', '''STR'''
* '''VERR''', '''VERW'''
== Проблеми ==
|