Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Процессор INTEL в защищенном режиме #13Содержание книги
Поиск на нашем сайте ПРОВЕРКА ТИПА СЕГМЕНТА Это небольшой и простой раздельчик УК IA-32. Теперь самое время вернуться во 2-ой выпуск и посмотреть на картинку с дескриптором. Здесь нас интересуют два поля: бит S (бит 12 второго двойного слова) и поле «Тип» (биты 8-11 второго двойного слова). Если кто-то забыл про их назначение – прошу в выпуск №4. Итак, процессор проверят эти два поля в следующих двух случаях:
Чтобы не растекаться мыслью по древу сразу скажу: #GP возникнет если:
список можно продолжить, но идея уже должна быть ясна. Бит S и поле «Тип» в дескрипторе говорят процессору, чего с сегментом делать можно, а чего нельзя. Если кто-то попытается сделать то, чего делать нельзя, то обработчик #GP (который мы сами и пишем) должен по идее нарушителя наказать. НУЛЕВОЙ СЕЛЕКТОР Это чуть ли не самый маленький раздел УК – содержит всего два положения: Если в CS или SS загрузить селектор, который указывает на нулевой дескриптор (т.е. 16-разрядное число, биты 15-3 которого равны 0), то #GP возникнет немедленно; Кстати, почему именно биты 15-3 – см. 5-й выпуск, а именно на картинку селектора. Если нулевой селектор загрузить в DS,ES,FS или GS то #GP возникнет при попытке обращения к данным через такой селектор (иначе – он там может хоть сто лет пролежать). Вообще нулевой селектор придуман в качестве подстраховки от ненужных обращений к сегментам. УРОВНИ ПРИВИЛЕГИЙ Ну, вот мы и добрались до святая-святых механизма защиты – уровней привилегий. Иногда (в частности – в ОС Windows) их называют кольца защиты (Protection Rings). Как уже было неоднократно сказано – всего уровней привилегий 4: 0 – самый крутой, 3 – самый несчастный и забитый. В одном из предыдущих выпусков я уже разводил ахинею насчет Госдумы и других крутых ребятах, которых можно разместить в 0 кольце. В мире ОС в нулевом кольце располагается код ядра ОС, драйвера, обработчики исключений (тот же #GP). Хотя по задумке инженеров Intel дрова и другие сервисные программы должны располагаться в 1 или 2 кольце. Однако ОС Windows (кстати, и *nix тоже) используют только два кольца: 0 и 3. В третьем – пользовательские приложения и служебные сервисы ОС, в нулевом – все остальное (хотя это грубое разделение, но примерно так все и выглядит). Здесь, во избежание дальнейших недоразумений, следует раз навсегда договориться: если я пишу «уровень привилегий задачи A БОЛЬШЕ уровня привилегий задачи B», то это значит, что численное значение привилегий задачи А МЕНЬШЕ чем у B (хотя это и так очевидно, 0<3, 0 круче 3). С номерами разобрались. Поехали дальше. Всего существует три типа уровней привилегий (и их нужно знать как «Отче наш»): это CPL (Current Privilege Level), RPL (Requested Privilege Level) и DPL (Descriptor Privilege Level). Название каждого говорит само за себя (кроме, пожалуй, RPL – в смысл этого друга нужно еще попытаться въехать). Начнем по-порядку. Итак, CPL. CPL – это текущий уровень привилегий, иначе говоря – уровень привилегий кода (задачи) исполняющейся в данный момент. Очень важно – именно в данный момент! Где же он храниться? Внимательный читатель сразу вспомнит формат селектора... Да. Именно в битах 1-0 он и храниться. Т.е. под CPL отведено 2 бита – всего могут принять 4 значения (0 – самый крутой, 3 – лоховской). Пока все сходиться. Теперь ВНИМАНИЕ! Где находиться сам селектор, хранящий CPL? В CS!!! В CS и нигде больше!!! (правда, он еще храниться и в SS, но пока, пожалуйста, представьте, что он только в CS). Т.е. если в данный момент исполняется код обработчика #GP (и он в раздумьях что сделать с нашалившей программой) то CPL кода (этого самого обработчика #GP) = 0 (хотя и необязательно – все зависит от фантазии разработчика ОС, но логично предположить, что CPL обработчика #GP равен 0). Пока про CPL информации хватит. DPL – уровень привилегий СЕГМЕНТА. Храниться в дескрипторе каждого сегмента в таблице дескрипторов. Вообще вот посмотришь на предыдущий тип уровня привилегий – CPL. CPL – уровень привилегий кода, исполняющегося в данный момент. Но ведь код тоже находиться в каком-то сегменте! Так чем же они отличаются? Фразой «в данный момент». Вот их главное отличие. Ну и помимо того CPL относится ТОЛЬКО К СЕГМЕНТАМ КОДА (исполняющимся в данный момент:), а DPL содержится в КАЖДОМ ДЕСКРИПТОРЕ, неважно что описывает этот дескриптор (кстати, открываем второй выпуск и смотрим на картинку с дескриптором). Как ни странно, под него также отведено 2 бита. Процессор бросает свой гордый взор на поле DPL только при обращении к сегменту. Например, исполняется какая-то пользовательская программа. Все тихо и спокойно. Вдруг процессор встречает инструкцию: mov dword ptr DS:[00000000h],0; программа хочет записать ноль по адресу DS:00000000h(а DS равно все равно чему, например, 1234h) Тут процессор естественно занервничает: а можно ли этой подозрительной программе с CPL=3 записывать данные туда, куда она намеревается это сделать? Тут же из селектора 1234h извлекается индекс (старшие 13 (!) бит - 246h) и в таблице дескрипторов (в данном случае – текущей LDT) находится нужный дескриптор, в котором процессор ищет в первую очередь поле DPL. И тут он видит, что в поле DPL содержится ноль! Т.е. уровень привилегий сегмента, в который хочет писать программа явно выше чем тот, который у подозрительной программы. Тут же генерируется #GP, обработчик которого приговаривает нарушителя к «...наказанию через расстреляние». У некоторых может возникнуть бестолковый вопрос: а если программа «успеет» записать нолик до тех пор, пока процессор соображает что к чему и возиться с привилегиями? Ответ: не успеет. #GP- это исключение типа ошибки (fault), оно ВСЕГДА генерируется ДО исполнения инструкции-нарушителя (об этом мы поговорим в выпуске про исключения). И тут опять всплывает тот самый пресловутый «внимательный читатель рассылки», который в данной модели заприметит одно упущение: селектор храниться в КАЖДОМ сегментном регистре (будь то CS, SS, DS, FS…). С CS и SS вроде разобрались, а что же тогда хранят DS, FS, ES и GS? Ведь даже в вышеприведенном примере использовался DS – так неужели же только для того чтобы посмотреть на DPL и найти нужный сегмент? Что хранят младшие два бита этого селектора??!! RPL – уровень привилегий запроса. Мда. Здесь, чтобы понять для чего вообще нужен этот RPL, нужно немного поднапрячься. В принципе, возможно было построить процессор с архитектурой, использующей только два типа привилегий (CPL и DPL). Это доказывает хотя бы тот факт, что RPL в любом сегм. регистре любая пользовательская программа может изменить себе сама. Зачем Intel-овцы подмахнули RPL – скорее всего «для гибкости». В чем эта гибкость заключается – тема следующего выпуска. На словах смысл CPL, DPL и RPL практически не улавливается (это нормально). Для понимания их сути идеально подходят зрительные образы. Следующий выпуск будет пестреть картинками, по которым даже школьник сможет понять смысл и суть этих наиважнейший понятий. Кроме того, в следующем выпуске мы найдем еще одну ошибку в книге Зубкова С.В. (а также опечатку в официальном мануале от Intel-а, из-за которой (возможно) и возникла ошибка у Зубкова). А посему пока объявляется обещанный конкурс на нахождение опечатки в официальном мануале Intel-а (подсказка: третий том (System Programming Guide), главы 4.8.1.1 и 4.8.1.2 (они небольшие, имена победителей будут объявлены в следующем выпуске).
|
||
|
Последнее изменение этой страницы: 2016-06-22; просмотров: 356; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.176 (0.006 с.) |