ПРОЦЕССОР INTEL В ЗАЩИЩЕННОМ РЕЖИМЕ
Выпуск
№01
Рекомендуется читать запоем от начала
и
до конца, но вдумчиво…
Prelude
Здравствуй, уважаемый подписчик! Перед тобой первый выпуск рассылки. Дизайн, мягко говоря, убогий. Если ты можешь в этом помочь – прошу, не стесняйся. Несколько слов о том, о чем здесь вообще пойдет речь в дальнейшем. Речь, как ты уже догадался и без подсказок, пойдет о программировании в защищенном режиме процессоров Intel, причем даже не столько о программировании, сколько о самой архитектуре, о сущности PM и др. глубоких материях. :) (хотя не пугайся, последнего не будет, упаси боже! А тех, кому без высоких материй не живется на свете – попрошу обратить свой взор на «Низкоуровневое программирование для dzенствующих».
Сразу давай договоримся: защищенный режим и программирование под Windows – это две большие разницы. Windows – это ОС, защищенный режим – режим работы процессора. Это все равно что программирование в реальном режиме называть как-нибудь на манер «программирование под Нортон Коммандер», согласись – глупо, но однако почему то это укоренившееся «в народе» мнение. Итак, никакого виндоуса не будет!
Ты, конечно же, согласен, что реальный режим – прошлый день (или, даже точнее – прошлый век). Но задумывался ли ты о том, что и защищенный режим, как это не прискорбно, остался позади ?.. Год с небольшим назад Intel анонсировала процессор с принципиально новой архитектурой – Itanium; все предыдущие процы (до Itanium-а) были аккуратно сложены в одну большую коробку в кучу (причем, вообще как то даже совсем абстрагировавшись от каких-либо различий между 8086 и Pentium-ом IV), сверху поставлено клеймо – IA32 (Intel Architecture 32) и все это чудо благополучно похоронено…Конечно же, все не совсем так, IA-32 будет жить еще долго (по крайней мере, у нас :).
Первая и главная проблема, с которой мне пришлось сразу же столкнуться: С ЧЕГО НАЧАТЬ? Казалось бы, проблема на ровном месте, однако это не так. Если ты уже довольно неплохо шаришь в защищенке (а таких я не встречал почему то вообще), то думаю, согласишься. Как выразился небезызвестный тов. Зубков: «… управление защищенным режимом в современных процессорах Intel – это самый сложный раздел программирования…», и можешь поверить ему на слово, однако «нет ничего невозможного для человека с интеллектом».
Вся проблема в том, что защищенка – это замкнутый круг, откуда бы я ни начал – останется что-то позади, и впереди… и еще где нибудь сбоку. Но я буду стараться.
Главная причина, побудившая меня к созданию данной рассылки – полное отсутствие русскоязычной более мене толковой документации и учебной литературы о PM. В Зубкове, конечно, все хорошо, но поднимите руку те, для кого PM так же прозрачен и чист как RM? Кто не пытался вникнуть сам, а учился только по известным книжкам, для того PM – темный лес.
Вся «гадость» еще и в том, что в изучении защищенного режима ну никак не обойтись без сухих и нудных описаний полей дескрипторов, структур системных сегментов и т.п., и в конце концов кажется, что вообще вся рассылка будет являть из себя скучное руководство пользователя. Я, по мере своих возможностей, постараюсь преподносить материал в понятном и доступном для ВСЕХ виде, избегая чисто справочных данных (где это возможно). Реализовать сию затею будет не так то просто (особенно поначалу), но если у вас есть хоть какие-то познания в области реального режима Intel – будет проще всем.
Ну и в заключении хочется отметить, что по мере выхода новых выпусков будут опубликовываться интересные статьи из журналов по данной теме (ко всем сразу просьба – у кого есть такая инфа (итересуют только «частные» статьи, желательно на английском, а не ксероксы с книжек Рудаков&Финогенов) – прошу высылать мне на мыло (см. внизу).
Let’s go
Организация памяти в защищенном режиме.
Что вообще такое защищенный режим и почему он так называется? То, что я сейчас скажу – звучит очень просто, но в то же время – это ОЧЕНЬ ВАЖНО ПОНЯТЬ!
Дело в том, что реальный режим процессора Intel – однозадачная среда, в данный момент времени в ней может выполняться ТОЛЬКО ОДНА, конкретная задача. Безусловно, можно сэмулировать многозадачность и в реальном режиме, но все дело в том, что именно в защищенном режиме вся многозадачность реализована АППАРАТНО, это важный момент, и, по сути, является ЕДИНСВТЕННЫМ принципиальным отличием между режимами. Не правда ли, это шокирует? А ты думал, что PM это монстр с дескрипторами между голов и селекторами вместо рук? Ты правильно думал, но до них дело дойдет, не волнуйся…
Для начала рассмотрим общие положения об организации памяти в PM. В процессорах Intel организацию памяти разделяют на две части: сегментация (segmentation), и страничная организация (paging).
Сегментация позволяет изолировать модули кода, данных, стека и позволяет работать нескольким задачам и программам на одном процессоре (как говорится, multitasking) и не конфликтовать между собой – это и есть по большому счету, вся революция по сравнению с 8086.
Страничная организация памяти, вообще говоря, сложнее и громозще сегментации, поэтому во многой литературе ее просто опускают, но я бы особо хотел обратить твое и свое внимание именно на нее (хотя бы потому, что у такой организации больше возможностей, и именно на ней работает Мастдай)
В процессоре нет такого бита, который бы четко отвечал за переключение между этими двумя режимами. Элементы сегментной организации, в любом случае, присутствуют всегда. А вот уже использовать страничную организацию или нет – выбор за нами (за это отвечает флаг PG, бит 31 регистра CR0). Не пугайся, CR0 – это обычный регистр (такой же, как AX, BP и т.д.), подробнее поговорим о нем чуть позже.
Сегментация – это механизма разделения адресного пространства процессора (по-русски: память, которую «видит» процессор) на отдельные защищенные друг от друга кусочки (сегменты). У новичка сразу возникнет вопрос: а от чего защищать то :)? Очень важный момент, но пока не бери в голову, скоро он отпадет сам собой.
Непосредственно сегмент может содержать в себе код, данные, стек, системные структуры данных (TSS, LDT, но о них позже). Если запущено сразу несколько программ :), то каждой программе принадлежит своя, личная группа сегментов.
Итак, что мы имеем. Память, разделена на группы сегментов, у каждой группы есть свой владелец (программа). Программы вынуждены сидеть в оперативе, прижавшись друг к другу, как цыплята в инкубаторе, вследствии чего они потихоньку друг друга ненавидят и не подпускают чужие проги к сегментам из своей группы. При любой попытке пресечь границы вылазит некое подобие «руки правосудия» и нажимает на кнопку ALARM. Вследствие чего вдруг откуда ни возьмись возникает исключение #GP (General Protection) и все проги падают ниц перед ним, а виновника изгоняют вон :) Но что то я увлекся, все эти прекрасы ждут нас в будущем…
Нет, ну вообще, как ты относишься к изложению в таком духе?
Для того, чтобы обратиться к любому байту в любом сегменте в памяти мы должны сформировать ЛОГИЧЕСКИЙ АДРЕС (aka дальний указатель). Что же оно из себя такое представляет, этот логический адрес? А представляет оно селектор и смещение, и больше ничего!
Селектор – это УНИКАЛЬНЫЙ идентификатор сегмента. У КАЖДОГО СЕГМЕНТА ЕСТЬ СВОЙ СЕЛЕКТОР! Это нужно запомнить раз и навсегда!!! Скажу по секрету, что селектор содержится в сегментом регистре (да да, те самые DS, CS, ES …). Селектору будет посвящена отдельная глава, а пока запомни только то, что «… у каждого сегмента он свой».
Зная селектор и зная смещение мы можем получить ЛИНЕЙНЫЙ АДРЕС – место, где РЕАЛЬНО расположен нужный нам байт. Как его получить – пока сказать не могу, потому как придется вплетать еще одно СУПЕРВАЖНОЕ(!) определение – ДЕСКРИПТОР (структура, описывающая сегмент, его паспорт, свидетельство о рождении, водительские права и вообще всю подобную бюрократию).
Существует также такое понятие, как физическое адресное пространство процессора. Не следует на нем особо заострять внимания, скажу только, что физический адрес – это адрес, который проц может выставить на адресную шину, и в случае СЕГМЕНТНОЙ организации памяти (но не СТРАНИЧНОЙ!) СОВПАДАЕТ с линейным адресом! Вот этот момент в литературе всячески перевирается и искажается, но запомни: в случае СЕГМЕНТНОЙ организации памяти ЛИНЕЙНЫЙ адрес ВСЕГДА СОВПАДАЕТ с ФИЗИЧЕСКИМ. Пока больше ничего.
Виды памяти в защищенном режиме
Простая плоская модель
Действительно, самая простая модель: вся память представляет одно ОГРОМНОЕ адресное пространство, никакого механизма распределения, никаких сегментов, ничего нет! Пустыня! Нет, не совсем конечно… Должно быть МИНИМУМ два дескриптора (черт! Опять эти дескрипторы…Это сильно усложняет мне задачу… ладно, продолжим дальше, прими во внимание только то определение которое я давал про дескрипторы выше, и еще дополнительно – в дескрипторе есть поля, в которых указаны начало и конец сегмента). Один из этих дескрипторов ДОЛЖЕН описывать сегмент кода (с началом в 0 и лимитом в 4 Гб), второй – сегмент данных (также с началом в 0 и лимитом в 4 Гб!!!). Как же так? Они же «накладываются друг на друга»? Ну вот так вот, говорю же, никакой защиты, ничего не застраховано, «рука правосудия» спит в гробу.
Защищенная плоская модель
Все отличие от предыдущей модели – база и лимит кода и данных уже не совпадают, и здесь уже #GP может проявить себя в самом разцвете… Более того! Если включить флажочек PG (страничная адресация), мы получим ту самую модель памяти, в которой работает всеми нами любимый мастдай – защищенная плоская модель с страничной адресацией . Но здесь нам уже понадобиться минимум 4 сегмента: для кода и данных на уровне привилегий 3, + для кода и данных на уровне 0 (многие из вас слышали, что мастдай использует только эти два уровня привилегий, оставляя 3 для пользовательских прог, а 0 – для ядра и особ, «особо приближенных к императору»).
Мульти-сегментная
модель
Данная модель использует все возможности проца «на полную катушку», позволяет аппаратно защищать код, структуры данных, задачи и программы друг от друга.
На сегодня хватит, итак много чего нужно запомнить и уловить, в
следующем выпуске я хочу подробно остановиться на СТРАНИЧНОЙ АДРЕСАЦИИ, а пока
– пиши мне письма, что непонятно, где возникли пробелы, и хотя весь первый
выпуск рассылки – по сути сентиментальная чушь, но новичку все эти знания ОЧЕНЬ
помогут в понимании на следующих этапах. ПисАть прошу сюда: brokensword@ukr.net и, плз, без речевых (wav) и графических (bmp) посланий.