входим в защищенный режим

2. ВХОДИМ В ЗАЩИЩЁННЫЙ РЕЖИМ


2.1. Подготовка к переключению в защищённый режим
2.2. Переключение в защищённый режим
2.3. Возврат в реальный режим
2.4. Пример простой программы переключения режима

Задача второй главы - показать на простом примере, как составитьпрограмму для MS-DOS, переключающую процессор из реального режимав защищённый и возвращающую его обратно в реальный режим. Сампроцесс описан во многих книгах, посвящённых i80286, однако приэтом обычно опускаются многие технические детали, связанные саппаратным обеспечением компьютера. Знание этих деталей совершеннонеобходимо для успешного использования защищенного режима на реальныхкомпьютерах.

Сейчас мы не будем рассматривать процесс обработки прерыванийв защищённом режиме - это материал следующей главы. Там же будетприведён и соответствующий пример программы. В программе, которуюпредставим в этой главе, мы запретили прерывания на всё то время,пока процессор находится в защищённом режиме.

2.1. Подготовка к переключению в защищённый режим



Перед тем, как переключить процессор в защищённый режим, надовыполнить некоторые подготовительные действия, а именно:
  • Подготовить в оперативной памяти глобальную таблицу дескрипторовGDT. В этой таблице должны быть созданы дескрипторы для всех сегментов,которые будут нужны программе сразу после того, как она переключитсяв защищённый режим. Впоследствии, находясь в защищённом режиме,программа может модифицировать GDT (если, разумеется, она работаетв нулевом кольце защиты). Программа может модифицировать имеющиесядескрипторы или добавить новые, загрузив заново регистр GDTR.
  • Для обеспечения возможности возврата из защищённого режимав реальный необходимо записать адрес возврата в реальный режимв область данных BIOS по адресу 0040h:0067h, а также записатьв CMOS-память в ячейку 0Fh код 5. Этот код обеспечит после выполнениясброса процессора передачу управления по адресу, подготовленномунами в области данных BIOS по адресу 0040h:0067h.
  • Запретить все маскируемые и немаскируемые прерывания.
  • Открыть адресную линию A20.
  • Запомнить в оперативной памяти содержимое сегментных регистров,которые необходимо сохранить для возврата в реальный режим, вчастности, указатель стека реального режима.
  • Загрузить регистр GDTR.


Первый шаг, связанный с подготовкой GDT, мы уже описали, когдарассказывали о преобразовании адресов в защищённом режиме.

Что же касается возврата из защищённого режима в реальный, тоон выполняется сбросом процессора, инициированного выводом определённогобайта в процессор клавиатуры 8042. Это связано с тем, что разработчикипроцессора i80286 не предусмотрели никакой команды для переключенияпроцессора из защищённого режима в реальный. Есть ещё один способвозврата в реальный режим, основанный на переводе процессора всостояние отключения, он будет описан в главе, посвящённой обработкепрерываний в защищённом режиме.

После выполнения сброса (или после отключения) процессор переходитв реальный режим и управление передаётся в BIOS. BIOS анализируетсодержимое ячейки CMOS-памяти с адресом 0Fh - байта состоянияотключения. Дальнейшие действия определяются содержимым этой ячейки.

Байт состояния отключения 0Fh используется BIOS для определенияспособа возврата из защищённого режима в реальный после аппаратногосброса. В таблице 3 перечислены возможные значения для байта состоянияотключения.


Таблица 3. Значения байта состояния отключения.

ЗначениеПричина отключения
0Программный сброс при нажатии комбинации клавиш CTRL-ALT-DEL или неожиданный сброс. Выполняется обычный перезапуск системы, но процедуры тестирования при включении питания не выполняются.


  • 1
  • Сброс после определения объёма памяти.
  • 2
  • Сброс после тестирования памяти.
  • 3
  • Сброс после обнаружения ошибки в памяти (контроль чётности).
  • 4
  • Сброс с запросом перезагрузки.
  • 5
  • После сброса перезапускается контроллер прерываний, затем управление передаётся по адресу, который находится в области данных BIOS 0040h:0067h.
  • 6,7,8Сброс после выполнения теста работы процессора в защищённом режиме.
    9Сброс после выполнения пересылки блока памяти из основной памяти в расширенную.
    0AhПосле сброса управление немедленно передаётся по адресу, взятому из области данных BIOS 0040h:0067h.


    Для обеспечения возврата в реальный режим после сброса по адресу,записанному в области данных BIOS 0040h:0067h можно использоватьбайты 5 и 0Ah.

    Из за особенностей обработки прерываний в защищённом режиме, которыемы рассмотрим в третьей главе, перед переключением в защищённыйрежим необходимо перепрограммировать контроллер прерываний. Восстановитьсостояние контроллера после возврата в реальный режим можно автоматически,если использовать значение 5 для байта состояния отключения.

    Если же вы не используете прерывания и, соответственно, не перепрограммируетеконтроллер прерываний, можно использовать значение 0Ah, при этомпосле сброса управление будет сразу передано по адресу, взятомуиз области данных BIOS 0040h:0067h. В этом случае затраченноена возврат в реальный режим время будет меньше.

    В следующем фрагменте программы мы записываем в ячейку CMOS-памятис адресом 0Fh значение 5.

    Напомним, что для записи числа в ячейку CMOS-памяти необходимовначале в порт с адресом 70h записать номер нужной ячейки, а затемв порт 71h - записываемые данные.

    Не удивляйтесь, что в этом фрагменте программы вместо ячейки 0Fhуказано значение 8Fh - это не ошибка. Напомним, что единственныйспособ замаскировать немаскируемые прерывания в компьютере IBM AT- это записать в порт 70h байт, в котором старший бит установленв 1. Поэтому наш фрагмент программы не только записывает байтсостояния отключения, но и маскирует немаскируемые прерывания(!). Нам необходимо также замаскировать обычные прерывания, поэтомумы выдаём команду CLI.
    cli
    mov al,8f
    out CMOS_PORT,al
    jmp next1 ; небольшая задержка
    next1: mov al,5
    out CMOS_PORT+1,al


    Следующий шаг - открытие адресной линии A20 - необходим в томслучае, если ваша программа будет обращаться к оперативной памяти,лежащей за пределами первого мегабайта.

    Приведём процедуру, которую можно использовать для этой цели:
    ; ------------------------------------------------------------
    ;Процедура открывает адресную линию A20
    ; ------------------------------------------------------------
    PROC enable_a20 NEAR
    mov al,A20_PORT
    out STATUS_PORT,al
    mov al,A20_ON
    out KBD_PORT_A,al
    ret
    ENDP enable_a20


    Эта магическая последовательность команд выдаёт команду A20_ONклавиатурному процессору 8042, к которому подключены схемы управленияадресной линией A20. После начального сброса линия A20 закрыта,и расширенная память за границами первого мегабайта недоступна.

    Следующий этап - запоминание содержимого сегментных регистров,которые будут нужны при возврате в реальный режим. Это сегментныерегистры SS и ES:
    mov [real_ss],ss ; запоминаем указатель стека
    mov [real_es],es ; для реального режима


    На последнем перед переключением в защищённый режим этапе мы загружаемрегистр GDTR адресом подготовленной заранее GDT:lgdt [QWORD gdt_gdt]

    Всё! Можно переключаться в защищённый режим!

    2.2. Переключение в защищённый режим



    Это самый простой этап. Для перевода процессора i80286 из реальногорежима в защищённый можно использовать специальную команду LMSW,загружающую регистр состояния процессора (Mashine Status Word).Младший бит этого регистра указывает режим работы процессора.Значение, равное 0, соответствует реальному режиму работы, а значение1 - защищённому.

    Если установить младший бит регистра состояния процессора в 1,процессор переключится в защищённый режим:
    mov ax, 1
    lmsw ax


    К сожалению, с помощью команды LMSW невозможно переключить процессоробратно в реальный режим. Для этого необходимо использовать другойспособ.

    2.3. Возврат в реальный режим



    Для того, чтобы вернуть процессор 80286 из защищённого режимав реальный, необходимо выполнить аппаратный сброс (отключение)процессора. Это можно сделать следующим образом:
    mov ax, 0FEh ; команда отключения
    out 64h, ax


    Перед выдачей команды отключения необходимо запомнить содержимоерегистра SP, так как после передачи управления по адресу, записанномув области данных BIOS 0040h:0067h, регистры SS:SP будет указыватьна стек BIOS.

    После выдачи команды отключения надо подождать, когда произойдёт сброс процессора. Это можно сделать, выдавая в цикле команду HLT.

    Вот фрагмент программы, возвращающий процессор в реальный режим:
    ; Запоминаем содержимое указателя стека, так как после; сброса процессора оно будет потеряно
    mov [real_sp],sp; Выполняем сброс процессора
    mov al,SHUT_DOWN
    out STATUS_PORT,al; Ожидаем сброса процессора
    wait_reset:
    hlt
    jmp wait_reset


    Далее необходимо восстановить содержимое сегментных регистров,записанное в оперативную память на этапе подготовки к переключениюв защищённый режим, закрыть адресную линию A20 и размаскироватьпрерывания.

    Для закрытия линии A20 можно воспользоваться следующей процедурой:

    ; Процедура закрывает адресную линию A20
    ; ------------------------------------------------------------
    PROC disable_a20 NEAR
    mov al,A20_PORT
    out STATUS_PORT,al
    mov al,A20_OFF
    out KBD_PORT_A,al
    ret
    ENDP disable_a20


    Следующая последовательность команд размаскирует все прерывания:
    mov ax,000dh ; разрешаем немаскируемые прерывания
    out CMOS_PORT,al
    in al,INT_MASK_PORT ; разрешаем маскируемые прерывания
    and al,0
    out INT_MASK_PORT,al
    sti


    Теперь, когда мы знаем всё, что нужно для переключения процессорав защищённый режим и возврата в реальный режим, можно приступитьк практической работе в защищённом режиме.

    2.4. Пример простой программы переключения режима



    Данная программа запускается в реальном режиме в среде MS-DOS,переключает процессор в защищённый режим, выдаёт сообщение и черезнекоторое время возвращает процессор в реальный режим, стираетэкран и завершает своё выполнение.

    Программа подготовлена с помощью транслятора Borland Turbo Assemblerи использует режим IDEAL. Для её трансляции был использован следующий командный файл:
    tasm %1.asm /l /zit
    link %1.obj /v


    Вы можете запускать эту программу на любой машине, совместимойс IBM AT и оборудованной процессорами i80286, i80386, i80486.Но вы не должны запускать эту программу, если у вас компьютерна базе процессоров i80386 или i80486 и активны драйверы QEMM,EMM386 - отключите эти драйверы. Кроме того, эту программу нельзязапускать на виртуальной машине в среде Microsoft WINDOWS в режимеEnchanced Mode или на виртуальной машине в среде OS/2 версии 2.0.

    Это связано с тем, что в перечисленных выше случаях процессорработает не в реальном режиме, а в так называемом режиме виртуальногопроцессора 8086. Этот режим возможен только для процессоров i80386или i80486.

    Кроме того, не следует запускать эту программу на компьютерахсерии PS/2, так как в них используется другой способ управлениялинией A20 и другой способ сброса процессора для возврата в реальныйрежим.

    Вы можете использовать эту программу для первых экспериментовс защищённым режимом.

    Обратим ваше внимание на некоторые ограничения защищённого режима.Эти ограничения связаны в основном с использованием прерыванийи сегментных регистров.
    • Вашей программе, работающей в защищённом режиме, недоступныни прерывания BIOS, ни прерывания DOS. Любой обмен данными с периферийнымиустройствами (дисплеем, клавиатурой, диском или принтером) долженвыполняться на уровне команд ввода/вывода. Т.е. программа должнаработать непосредственно с портами аппаратуры компьютера.


    Это ограничение связано с тем, что обработчики прерываний BIOSи DOS рассчитаны на работу в реальном режиме процессора. Попыткавызова этих обработчиков в защищенном режиме неизбежно приведётк аварийному завершению программы.

    Поэтому в приведённой ниже программе вывод текстовых строк наэкран производится при помощи непосредственной записи в памятьвидеоконтроллера. Что же касается ввода данных с клавиатуры, тоздесь не обойтись без обработки прерывания от клавиатуры. В следующейглаве мы приведём пример программы, которая не только выводитданные на экран дисплея (также через запись в видеопамять), нои умеет работать с клавиатурой и таймером.

    Если ваша программа составлена на языках высокого уровня (Си илиПаскаль), ей недоступна практически вся библиотека стандартныхфункций. Особенно это касается функций ввода/вывода и управленияпамятью. Причина очевидна - большинство функций стандартных библиотектрансляторов вызывает те или иные прерывания BIOS или DOS.
    • Программы не должны загружать в сегментные регистры значения,которые не являются правильными селекторами, описанными в соответствующихдескрипторных таблицах. Несмотря на то, что сама по себе загрузкапроизвольного значения в сегментный регистр не опасна, попыткаиспользования неправильно загруженного сегментного регистра вызоветаварийное завершение работы программы.


    Это ограничение связано с механизмом преобразования логическогоадреса в физический.

    Итак, наша первая программа для защищённого режима процессора80286:

    Листинг 1. Демонстрация переключения в защищённый режим
    и возврата обратно в реальный режим
    данную программу вы можете найти в папке LST1


    © 2003 virt.lab., all rights reserved.
    Hosted by uCoz