Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборка Часть2 / АВМиС / Лекции / Переключение между реальным и защищенным режимами.doc
Скачиваний:
49
Добавлен:
15.09.2014
Размер:
46.08 Кб
Скачать

Переключение между реальным и защищенным режимами

Переключение процессора в защищенный режим из реального осуществляется загрузкой в системный регистр CR0 слова с единичным значением бита РЕ (Protect Enable). До переключения в памяти должны быть проинициализированы необходимые таблицы дескрипторов IDT и GDT. Переключение процессора из защищенного режима в реальный возможно не только через аппаратный сброс, как это было у 80286, но и сбросом бита РЕ в CR0. До этого переключения также необходимо загрузить в сегментные регистры селекторы дескрипторов, описывающие свойства сегментов стандартного реального режима. Однако вместо этого можно создать и «нереальный» режим (big real mode), отличающийся от реального возможностью доступа к сегментам большого (до 4 Гбайт) размера. Правда, у процессоров 80286 и 80386 лимит кодового сегмента принудительно ограничивается размером 64 Кбайт, но у более новых процессоров большой размер допустим для всех сегментов. «Нереальный» режим часто используется менеджерами памяти для DOS и игровыми программами, требующими большого объема памяти.

В режим с 64-битной адресацией процессор можно перевести из обычного защищенного режима. Для этого в пределах первых 4 Гбайт должны быть сформированы необходимые структуры данных (после активации 64-битного режима они могут быть перемещены):

  • таблицы IDT с 64-битными дескрипторами (и сами обработчики прерываний и исключений для 64-битного режима);

  • таблица GDT с соответствующими дескрипторами;

  • 64-битный сегмент состояния задачи (TSS);

  • четырехуровневые таблицы страничной трансляции.

64-битный режим активируется установкой в регистре EFER бита LMA и последующим включением страничной трансляции (перед активацией страничная трансляция должна быть отключена, поскольку в 32- и 64-битном режимах механизмы трансляции различны).

Обновление микрокода

Фирма Intel (и не только она) постоянно модернизирует свои процессоры, и даже в пределах одной модели процессоры разного времени выпуска различаются степпингом. Для процессоров каждого степпинга известны свои ошибки (errata) и методы их исправления. Микроархитектура процессоров начиная с 6-го поколения, позволяет исправлять эти ошибки путем загрузки в процессор блока «заплат», являющегося, очевидно, набором фрагментов микропрограмм. Обновление микрокода (microcode update) должно выполняться во время инициализации процессора после аппаратного сброса, загруженный микрокод действует только до следующего аппаратного сброса (инициализация сигналом INIT# на загруженное обновление не влияет). Фирма Intel отвечает за корректность работы своих процессоров только при загруженных «заплатах», и для каждого степпинга выпускает специальный блок данных (в виде файла). Таким образом, процессор определенного степпинга рассматривается как комплект из собственно процессора и «заплат». Заплаты фирма помещает на своем сайте; правда, доступ к ним закрыт паролями. Пароли сообщаются официальным дилерам, так что за свежими «заплатами» следует обращаться именно к ним. Если дилер не способен предоставить «заплаты» (или сообщить пароль), то можно усомниться в его легальности. Загрузка актуальных «заплат» в процессор организуется в два этапа: требуемый образ «зашивается» в BIOS изготовителем компьютера или пользователем; на этапе инициализации компьютера BIOS организует загрузку микрокода в процессор. Если BIOS не поддерживает процессор требуемого степпинга, следует обновить либо всю систему BIOS, либо только область с микрокодами. Для обновления в BIOS области с микрокодом могут быть использованы функции DMI. Если требуемое обновление микрокода в BIOS встроить не удается, можно использовать загружаемые утилиты обновления, запускаемые на платформах DOS/Windows из файла AUTOEXEC.BAT при каждой загрузке ОС.

«Заплаты» поставляются в виде блоков данных размером 2048 байт и никакого исполняемого кода не содержат. Блок состоит из 48-байтного заголовка (номер версии заголовка указывается в самом его начале) и собственно данных обновления (2000 байт). Целостность всего блока проверяется контрольной суммой. Поле версии обновления позволяет определить, загружено ли данное обновление в процессор. Блок обновления приемлем только для процессора, имеющего тот же идентификатор (тип, семейство, модель, степпинг), который указан в заголовке блока. Обновление должно загружаться загрузчиком, версия которого соответствует указанной в заголовке. Загрузчик версии 1 (другие пока не описаны) просто записывает линейный адрес данных (адрес блока +48) в MSR79h. Обновление может выполняться многократно без каких-либо побочных эффектов. Успешность и версию произведенного обновления можно проверить программно, не изменяя состояния обновления. Попытка загрузить обновление с идентификатором, не соответствующим данному процессору, не удастся (процессор проигнорирует эту попытку). В мультипроцессорных системах обновляемые данные для каждого процессора должны соответствовать его типу, модели, степпингу и идентификатору платформы.