Защищенный режим процессора 80386 это
Защищённый режим (режим защищённой виртуальной адресации) — режим работы x86-совместимых процессоров. Частично был реализован уже в процессоре 80286, но там существенно отличался способ работы с памятью, так как процессоры еще были 16-битными и не была реализована страничная организация памяти. Первая 32-битная реализация защищенного режима - процессор Intel 80386. Применяется в совместимых процессорах других производителей. Данный режим используется в современных многозадачных операционных системах, Microsoft Windows, Linux, OS X.
Ранее похожий режим применялся фирмой Digital Equipment (DEC) для 32-разрядных компьютеров VAX-11.
Особенности процессоров 80386 — 80486
С появлением 32-разрядных процессоров 80386 фирмы Intel процессоры могут работать в трех режимах: реальном, защищённом и виртуального процессора 8086.
В защищённом режиме используются полные возможности 32-разрядного процессора — обеспечивается непосредственный доступ к 4 Гбайт физического адресного пространства и многозадачный режим с параллельным выполнением нескольких программ (процессов). Собственно говоря, многозадачный режим организует многозадачная операционная система, однако микропроцессор предоставляет необходимый для этого режима надежный механизм защиты задач друг от друга с помощью четырехуровневой системы привилегий. Так же в этом режиме доступна страничная организация памяти, повышающая уровень защиты задач друг от друга и эффективность их выполнения.
В процессоре i386 компания Intel учла необходимость лучшей поддержки реального режима, потому что программное обеспечение времени его появления не было готово полностью работать в защищённом режиме. Поэтому, например, в i386, возможно переключение из защищённого режима обратно в реальный (при разработке 80286 считалось, что это не потребуется, поэтому на компьютерах с процессором 80286 возврат в реальный режим осуществляется схемно — через сброс процессора).
При включении микропроцессора в нём автоматически устанавливается режим реального адреса. Переход в защищённый режим осуществляется программно путем выполнения соответствующей последовательности команд. Программы, предназначенные для защищённого режима, должны быть написаны особым образом. Это означает, что реальный и защищённый режим несовместимы.
1.1 Общее сравнение реального и защищенного режимов.
Страничная организация памяти
Основная мысль сводится к формированию таблиц описания памяти, которые определяют состояние её отдельных сегментов/страниц и т. п. При нехватке памяти операционная система может выгрузить часть данных из оперативной памяти на диск, а в таблицу описаний внести указание на отсутствие этих данных в памяти. При попытке обращения к отсутствующим данным процессор сформирует исключение (разновидность прерывания) и отдаст управление операционной системе, которая вернёт данные в память, а затем вернёт управление программе. Таким образом для программ процесс подкачки данных с дисков происходит незаметно.
Мультизадачный подрежим защищённого режима
Этот режим позволяет организовать мультизадачность, то есть возможность одновременного выполнения нескольких задач или многопользовательской системы.
Линейная адресация
Линейная адресация памяти — схема адресации памяти компьютера в защищенном режиме (начиная с Intel 80386 и других совместимых x86-процессорах). Используется большинством современных многозадачных ОС.
Благодаря механизму линейной адресации можно создавать любое (ограниченное только размерами оперативной памяти) количество независимых виртуальных адресных пространств. Причём каждая страница линейного адресного пространства может находиться по любому физическому адресу или даже быть выгруженной на диск.
При использовании линейной адресации 32-битный логический адрес делится на три части:
- Номер записи в каталоге страниц (номер таблицы страниц) — биты 31-22 (10 бит). Одна запись из каталога страниц определяет отображение 4 МБайт адресного пространства.
- Номер записи в таблице страниц (номер страницы в таблице страниц) — биты 21-12 (10 бит). Одна запись из таблицы страниц определяет отображение 4 КБайт адресного пространства.
- Смещение в рамках страницы — биты 11-0 (12 бит).
При использовании страниц по 4 МБайт вторая часть отсутствует. Смещение же в странице будут определять биты 21-0 (22 бита).
Для включения линейной адресации необходимо, находясь в защищенном режиме, установить бит PG в регистре CR0. Предварительно необходимо создать в памяти каталог страниц (англ. Page Directory , PD) и таблицы страниц (англ. Page Table , PT), после чего в регистр CR3 загрузить физический адрес каталога страниц.
Особенности процессора 80286
В процессоре 80286, помимо реального режима, был реализован также защищённый режим. В защищённом режиме процессор может адресовать до 16 Мбайт физической памяти и 1 Гбайт виртуальной (16384 сегмента по 64 кбайт) за счёт изменения механизма адресации. Переключение из реального режима в защищённый происходит программно и относительно просто, однако для обратного перехода необходим аппаратный сброс процессора. Для отслеживания текущего режима работы процессора используется регистр слова состояния машины (MSW). Программы реального режима без модификаций в защищённом режиме исполняться не могут, также как и программы BIOS машины.
Суть защищённого режима в следующем: программист и разрабатываемые им программы используют логическое адресное пространство, размер которого может составлять 1 гигабайт. Логический адрес преобразуется в физический адрес автоматически с помощью схемы управления памятью (MMU). При этом содержимое сегментного регистра не связано напрямую с физическим адресом, а является номером сегмента в соответствующей таблице. Благодаря защищённому режиму, в памяти может храниться только та часть программы, которая необходима в данный момент, а остальная часть может храниться во внешней памяти (например, на жёстком диске). В случае обращения к той части программы, которой нет в памяти в данный момент, операционная система может приостановить программу, загрузить требуемую секцию кода из внешней памяти и возобновить выполнение программы. Следовательно, становятся допустимыми программы, размер которых больше объема имеющейся памяти, и пользователю кажется, что он работает с большей памятью, чем на самом деле.
Физический адрес формируется следующим образом. В сегментных регистрах хранится селектор, содержащий индекс дескриптора в таблице дескрипторов (13 бит), 1 бит, определяющий к какой таблице дескрипторов будет производиться обращение (к локальной или к глобальной) и 2 бита запрашиваемого уровня привилегий. Далее происходит обращение к соответствующей таблице дескрипторов и соответствующему дескриптору, который содержит начальный 24-битный адрес сегмента, размер сегмента и права доступа, после чего вычисляется необходимый физический адрес путём сложения адреса сегмента со смещением из 16-разрядного регистра.
1.3 Программная модель 32-разрядных микропроцессоров в защищенном режиме .
Регистры общего назначения.
Регистры указатели адреса.
Регистры указатели сегментов памяти.
FS , GS – регистры дополнительных сегментов данных
Регистр указатель команд.
Регистр признаков (флагов) ( 8086 , 80386 , 80486 , Pentium ).
Флаги ID , VIP , VIF , AC , VM , RF , NT , IOPL используются операционной системой только в защищенном режиме.
IOPL ( Input / Output Privilege Level ) - задает минимальный уровень привилегий задачи для выполнения команд ввода/вывода (для реального режима всегда 0) (см. главу 3)
NT ( Nested Task ) = 1 показывает, что текущая задача является вложенной в другую. Устанавливается при переключении задач. Используется командой IRET для определения алгоритма ее функционирования ( см . главу 5)
RF ( Restart Flag ) – используется для аппаратной отладки, совместно с отладочными регистрами
VM ( Virtual Mode ) – используется для перехода в режим «виртуального 8086». Бит может устанавливаться только в защищенном режиме – инструкцией IRET на нулевом уровне привилегий ( см . главу 3) или переключением задач на любом уровне привилегий (см. главу 6)
VIF ( Virtual Interrupt Flag ) – виртуальный флаг IF (разрешение прерывания) для многозадачных систем (см. главу 6)
VIP ( Virtual Interrupt Pending ) – виртуальный запрос прерывания.
ID ( Identification flag ) – флаг доступности инструкции CPUID (аппаратная идентификация процессора)
Используются при управлении памятью и переключении задач. К ним относятся:
Регистр адреса глобальной дескрипторной таблицы ( GDT ) (см. главу 2).
Регистр адреса таблицы дескрипторов прерываний ( IDT ) (см. главу 4).
Регистр – селектор сегмента локальной дескрипторной таблицы ( LDT ) (см. главу 2).
Регистр – селектор сегмента состояния задачи ( TSS ) (см. главу 5).
Регистры управления – 32-разрядные CR 0, CR 1, CR 2, CR 3, CR 4
Управляющие регистры ( Control Registers ) CR0, CR1, CR2, CR3 хранят при знаки состояния процессора, общие для всех задач. Регистр СR0[0 ¸ 15] включает в себя биты регистра MSW процессора 80286. Для обеспечения программной совместимости команды LMSW и SMSW затрагивают только эти младшие 4 бита.
Таблица 1.1 Регистры управления
Назначение бит регистра СR0:
· РЕ ( Protection Enable ) - разрешение защиты. Установка этого флага инструкцией LMSW или LOAD CR0 переводит процессор в защищенный режим, сброс флага (возврат в реальный режим) возможен только по ин струкции LOAD CR0. Сброс бита РЕ является частью довольно длинной последовательности инструкций, подготавливающих корректное пере ключение в реальный режим.
· ЕТ ( Extension Туре) - индикатор поддержки инструкций математического сопроцессора. Используется в процессорах 486+, для 486SX - ET=0, для остальных процессоров — ET=1.
· WP ( Write Protect ) - разрешение защиты страниц памяти.
· AM ( Alignment Mask ) - разрешение контроля выравнивания (контроль выравнивания выполняется только на уровне привилегий 3 при АМ=1 и флаге АС=1).
· NW ( Not Write through ) - запрет сквозной записи кэша и циклов анну лирования.
· CD ( Cache Disable ) - запрет заполнения кэша (попадания в ранее запол ненные строки при этом обслуживаются кэшем ).
· PG ( Paging Enable ) - включение механизма страничной переадресации памяти.
Регистр CR1 не используется.
Регистр CR2 ( Page Fault Linear Address ) хранит 32-битный линейный адрес, по которому был получен последний отказ страницы памяти.
Регистр С R З ( Page Directory Base Register ) в старших 20 битах хранит физический базовый адрес таблицы каталога страниц. Из младших 12 бит в процессорах 486+ используются следующие :
· PCD ( Page-Level Cache Disable ) - запрет кэширования страницы (один из источников аппаратного сигнала PCD для управления внешним кэшем ).
· PWT ( Page-Level Writes Trough ) - кэширование страницы со сквозной записью (один из источников аппаратного сигнала PWT для управления внешним кэшем ).
Регистр CR4 (присутствует в процессорах Pentium и старше) содержит биты разрешения архитектурных расширений. Назначение бит регистра CR4:
· VME (Virtual-8086 Mode Extensions ) - разрешение использования виртуального флага прерываний в режиме V86, что позволяет повысить произво дительность за счет сокращения вызовов монитора виртуальных машин.
· PVI ( Protected-Mode Virtual Interrupts ) - - разрешение использования виртуального флага прерываний в защищенном режиме.
· TSD ( Time Stamp Disable ) - превращение инструкции RDTSC (чтение счетчика меток реального времени) в привилегированную .
· DE ( Debugging Extensions ) - расширение отладки (разрешение точек останова на инструкциях обращения к заданным портам ввода/вывода).
· PSE ( Page Size Extension ) - расширение размера страницы (4 Кбайт и 4 Мбайт).
· РАЕ ( Physical Address Extension ) - расширение физического адреса (страницы 4 Кбайт и 2 Мбайт, 36-битная адресация).
· PGE ( Paging Global Extensions ) - разрешение глобальности в страничной переадресации. При PGE=1 по команде MOV CR3 в TLB ( Translation Lookaside Buffer – буфер ассоциативной трансляции адресов страниц) очищаются только вхождения с не установленным битом глобальности G (P6+).
· РСЕ ( Performance-monitoring Counter Enable ) - разрешение обращения к счетчикам событий (инструкция RDPMC) на любом уровне привилегий.
Регистры отладки – 32-разрядные DR 0, DR 1, . . . DR 7
Предназначены для аппаратной отладки. Средства аппаратной отладки машинного кода появились только в процессоре i 80486. Аппаратно процессор содержит восемь регистров отладки – реально используются только шесть. Регистры DR 0 ¸ DR 3 предназначены для задания линейных адресов четырех точек прерывания. Механизм таков: любой формируемый текущей программой адрес сравнивается со значениями этих регистров, и при совпадении генерируется исключение отладки с номером 1. Регистр DR 6 – регистр состояния отладки, его биты устанавливаются в соответствии с причинами, которые вызвали исключение с номером 1.
· b 0 – прерывание по достижению контрольной точки в DR 0;
· b 1 – тоже в DR 1 ;
· b 2 – тоже в DR 2 ;
· b 3 – тоже в DR 3 ;
· bd (13) – служит для защиты регистров отладки;
· bs (14) – устанавливается в «1», если исключение 1 было вызвано состоянием флага tf =1 в регистре Eflags ;
· bt (15) – устанавливается в «1», если исключение 1 было вызвано переключением на задачу с установленным битом ловушки в TSS t =1;
Все остальные биты заполняются нулями. Обработчик исключения 1 должен определить его причину по этому регистру и выполнить необходимые действия.
Регистр DR 7 – регистр управления отладкой. Содержит поля, для всех четырех регистров отладки, уточняющие условия генерации исключения.
Современные модели процессоров семейства “ x 86” имеют дополнительные управляющие биты в регистре признаков, управляющих регистрах, дополнительные регистры для контроля и управления. Их количество и назначение индивидуально для каждого процессора.
При очередной загрузке дизассемблер предлагает открыть файл для дизассемблирования, после выбора он предлагает способ дизассемблирования файла из всех возможных. Когда файл и способ дизассемблирования выбран, перед нами открывается окошко с готовым текстом программы на ассемблере. В этом тексте нам порой и придётся разбираться.
Отладчик
Как было уже сказано в начале статьи, одним дизассемблером не обойтись, поэтому порой приходится прибегать к работе с отладчиком. Одним из удобных отладчиков можно назвать Turbo Debugger от компании Borland. Это классическое DOS-приложение, выглядящее следующим образом:
Опять же, с работой в отладчике мы встретимся в следующих статьях. Пока достаточно того факта, что он должен быть в нашем наборе инструментов.
Проверка возможности перехода в защищённый режим
- проверить нулевой бит регистра CR0;
- убедиться, что не загружена операционная система Windows.
Этот пример тоже пока не показывает реализацию 32-разрядных команд. Для этого следует ещё познакомиться с материалом последующей главы. Кроме этого, у примера есть следующий недостаток: вызываются функции DOS (int 21h), что уже начинает противоречить независимости нашей программы от операционной системы MS-DOS. В дальнейшем придётся избавиться от использования функций операционной системы и перейти к использованию функций BIOS. Но пока достаточно ограничиться и таким кодом.
В предыдущей статье была реализована программа, осуществляющая переход в защищённый режим с проверкой на возможное дальнейшее функционирование в защищённом режиме и реализующая простой цикл с использованием 16-разрядных команд. Теперь задача следующей программы – переход в защищённый режим и использование уже 32-разрядных команд. Для реализации этого следует познакомиться с новой информацией, касающейся защищённого режима.
Как говорилось раньше, сегментация памяти защищённого режима представляет собой совсем другую форму адресации: вместо привычной для реального режима адресации «сегмент:смещение» используется адресация «селектор:смещение». Рассмотрим структуру селектора:
Биты 3-15 указывают номер дескриптора в выбранной таблице дескрипторов (о таблицах чуть ниже). Таким образом, селектор может описать 213=8192 дескрипторов для одной таблицы. Каждый дескриптор в таблице описывает сегмент, при чём он не обязательно должен быть сегментом кода или данных (о типах сегментов будет написано ниже).
Бит 2 – флаг TI (Table Indicator). Этот флаг указывает, какая из двух таблиц дескрипторов будет использоваться для загрузки дескриптора. Если флаг равен нулю, то используется глобальная таблица дескрипторов (GDT – Global Descriptor Table), в другом случае используется локальная таблица дескрипторов (LDT – Local Descriptor Table). Теперь поймём, что значит фраза «загрузка дескриптора». Дело в том, что, начиная с процессора 80286, размер сегментных регистров стал равным не двум байтам, а десяти, доступными из которых остались только два младших (в них и грузится селектор). Однако при загрузке селектора в младшие два байта сегментного регистра, в старшие 8 байт автоматически загружается дескриптор из используемой таблицы, по которому и ведётся дальнейшая адресация.
Биты 0-1 содержат запрашиваемый уровень привилегий (RPL – Requested Privilege Level) доступа к сегменту, то есть с какими привилегиями программа обращается к сегменту, описанному дескриптором. О привилегиях доступа будет сказано позже, и пока будем считать их равными нулю (то есть, самыми высокими).
Пока в наших примерах достаточно пользоваться сегментными дескрипторами. Рассмотрим структуру сегментного дескриптора:
- 0 – сегмент 16-разрядный,
- 1 – сегмент 32-разрядный (этот флаг ещё называют BIG).
- Флаг D задаёт направление роста сегмента (Direction). Обычно, если D=1, то выбранный сегмент является сегментом стека и растёт «задом наперёд». Если же D=0, то выбранный сегмент является сегментом данных. На самом деле, значение D=1 практически не используется.
- Флаг W определяет возможность записи в сегмент (Writable). То есть, сброшенный флаг указывает, что сегмент данных доступен только для чтения. Если флаг установлен, то сегмент доступен также и для записи.
- Бит C называется битом подчинения (Conforming), но рассмотрен он будет позже.
- Флаг R указывает на доступность сегмента кода для чтения (Readable). То есть, если флаг сброшен, читать из сегмента кода нельзя.
Остаётся ещё один вопрос: каким образом процессор находит в памяти эти таблицы. Вспомним структуру реального режима: таблица прерываний хранится, начиная с нулевого логического адреса и занимает 400h байт. Процессору не составляло труда её обнаружить, так как на любой машине под таблицу были зарезервированы самые младшие 400h байт адресного пространства. В защищённом режиме всё несколько иначе: таблицы могут располагаться в любом месте оперативной памяти, и их адреса нужно где-то фиксировать. Для этого в процессорах Intel (начиная с модели 80286) появились новые машинно-специфичные регистры: GDTR(определяет расположение и размер таблицы GDT), LDTR (определяет селектор таблицы LDT), IDTR (определяет расположение и размер таблицы IDT). Регистры GDTR и LDTR схожи по строению: они имеют одинаковый размер (6 байт) и содержат в себе одинаковую структуру данных о расположении и размере таблицы в памяти. Регистр LDTR отличается от этих двух регистров по размеру (10 байт) и содержит в себе селектор дескриптора сегмента данных таблицы LDT и сам дескриптор, который находится в таблице GDT.
Рассмотрим структуру данных, хранящихся в регистрах GDTR и IDTR:
В 1976 году фирма Intel закончила разработку 16-разрядного микропроцессора i8086. Он имел разрядность регистров 16 бит и системной шины адреса 20 бит, за счет чего мог адресовать до 1 Мбайт оперативной памяти.
В 1982 году был создан i80286. Этот микропроцессор представлял собой улучшенный вариант i8086. Он поддерживал уже несколько режимов работы: реальный, когда формирование адреса производилось по правилам i8086, и защищенный, который аппаратно реализовывал многозадачность и управление виртуальной памятью, i80286 имел также большую разрядность шины адреса — 24 разряда против 20 у i8086, и поэтому он мог адресовать до 16 Мбайт оперативной памяти. Первые компьютеры на базе этого микропроцессора появились в 1984 году.
В 1985 году фирма Intel представила первый 32-разрядный микропроцессор i80386, аппаратно совместимый снизу вверх со всеми предыдущими микропроцессорами этой фирмы. Он был гораздо мощнее своих предшественников, имел 32-разрядную архитектуру и мог прямо адресовать до 4 Гбайт оперативной памяти. Микропроцессор i386 стал поддерживать новый режим работы — режим виртуального i8086, который обеспечил не только большую эффективность работу программ, разработанных для i8086, но и позволил осуществлять параллельную работу нескольких таких программ.
В настоящее время микропроцессор с 32-битной Intel-архитектурой может работать в одном из четырех режимов:
- реальный режим
- системный режим
- защищенный режим
- режим виртуального i8086
Реальный режим (Real Mode)
После инициализации (системного сброса) центральный процессор находится в реальном режиме. В реальном режиме центральный процессор работает как очень быстрый i8086 с возможностью использования 32-битных расширений. Механизм адресации, размеры памяти и обработка прерываний (с их последовательными ограничениями) микропроцессор 8086 полностью совпадают с аналогичными функциями других микропроцессоров с 32-битной Intel архитектурой в реальном режиме.
Режим системного управления (System Management Mode).
Защищенный режим (Protected Mode)
Защищенный режим является основным режимом работы микропроцессора. Ключевые особенности защищенного режима: виртуальное адресное пространство, защита и многозадачность. В защищенном режиме программа оперирует с адресами, которые могут относиться к физически отсутствующим ячейкам памяти, поэтому такое адресное пространство называется виртуальным . Размер виртуального адресного пространства программы может превышать емкость физической памяти и достигать 64Тбайт.
Виртуальный режим i8086 (V86)
В режим V86 процессор может перейти из защищённого режима, если установить в регистре флагов EFLAGS бит виртуального режима (VM-бит, бит 17). Когда процессор находится в виртуальном режиме, его поведение во многом напоминает поведение процессора i8086. В частности, для адресации памяти используется схема , размер сегмента составляет 64 килобайта, а размер адресуемой в этом режиме памяти — 1 мегабайт. Виртуальный режим предназначен для работы программ, ориентированных на процессор i8086 (или i8088). Но виртуальный режим – это не реальный режим процессора i8086, имеются существенные отличия. Процессор фактически продолжает использовать схему преобразования адресов памяти и средства мультизадачности защищённого режима.
В виртуальном режиме используется трансляция страниц памяти. Это позволяет в мультизадачной операционной системе создавать несколько задач, работающих в виртуальном режиме. Каждая из этих задач может иметь собственное адресное пространство, каждое размером в 1 мегабайт.
Все задачи виртуального режима обычно выполняются в третьем, наименее привилегированном кольце защиты. Когда в такой задаче возникает прерывание, процессор автоматически переключается из виртуального режима в защищённый. Поэтому все прерывания отображаются в операционную систему, работающую в защищённом режиме.
Обработчики прерываний защищённого режима могут моделировать функции соответствующих прерываний реального режима, что необходимо для правильной работы программ, ориентированных на реальный режим операционной системы MS-DOS.
В процессоре i286 было реализовано два режима работы — защищённый режим и реальный режим. В защищённом режиме процессор мог адресовать до 1 Гбайт виртуальной памяти (при этом объем реальной памяти составлял не более 16 Мбайт), за счёт изменения механизма адресации памяти. Переключение из реального режима в защищённый происходит программно и относительно просто, однако для обратного перехода необходим аппаратный сброс процессора. Для отслеживания текущего режима работы процессора используется регистр слово состояния машины (MSW). Программы реального режима без модификаций в защищённом режиме исполняться не могут, так же как и программы BIOS машины.
Суть защищённого режима заключается в следующем. Программист и разрабатываемые им программы используют логическое адресное пространство (виртуальное адресное пространство), размер которого может составлять 1024 Мбайт (для 80286). Логический адрес преобразуется в физический адрес автоматически с помощью схемы управления памятью (MMU). Благодаря защищённому режиму, в памяти можно хранить только ту часть программы, которая необходима в данный момент, а остальная часть могла храниться во внешней памяти (например, на жёстком диске). В случае обращения к той части программы, которой нет в памяти в данный момент, операционная система может приостановить программу, загрузить требуемую секцию кода из внешней памяти и возобновить выполнение программы. Следовательно, становятся допустимыми программы, размер которых больше объема имеющейся памяти. Другими словами, пользователю кажется, что он работает с большей памятью, чем на самом деле. Однако реализация системы виртуальной памяти была еще далека от совершенства. Для использования защищённого режима необходима многозадачная операционная система, например Microsoft Windows 3.0, IBM OS/2 или UNIX.
Физический адрес формируется следующим образом. В сегментных регистрах хранится селектор, содержащий индекс дескриптора в таблице дескрипторов (13 бит), 1 бит, определяющий к какой таблице дескрипторов будет производиться обращение (к локальной или к глобальной) и 2 бита запрашиваемого уровня привилегий. Далее происходит обращение к соответствующей таблице дескрипторов и соответствующему дескриптору, который содержал начальный, 24-битный, адрес сегмента, размер сегмента и права доступа. После чего вычислялся необходимый физический адрес, путём сложения адреса сегмента со смещением, хранящемся в 16-разрядном указательном регистре.
1.2 Основные возможности и преимущества защищенного режима.
Режим виртуального 8086
Это также подрежим защищённого режима, который позволяет создать виртуальную машину, функционирующую как будто бы она находилась в реальном режиме, но, на самом деле, работающей в защищённом режиме.
Среда разработки Watcom C++
Эта статья представляет собой некоторое введение в разработку программ, функционирующих в защищённом режиме процессора. Здесь будут поставлены основные задачи любой программы, работающей в защищённом режиме, и приведены их решения. В основном, программы будут написаны на языке FASM.
Реальный режим
В этом режиме процессор находится сразу после нажатия кнопки "Power" компьютера. Доступ к памяти в реальном режиме осуществляется конструкцией "сегмент:смещение", которая описывает логический адрес. Значение сегмента, как и смещения, лежит в пределах от 0 до 0FFFFh.
Так как адресоваться можно только в пределах одного сегмента, то максимальный размер сегмента равен 64 килобайт. Физический адрес, который выставляется на адресную шину процессора, считается по формуле:
В реальном режиме процессоров 80186 и 8086 значение сегмента лежало в пределах от 0 до 0F000h. Таким образом, максимальный выставленный адрес на адресную шину равен 0FFFFFh, что соответствует 2 20 ―1, т.е. 1 мегабайту.
Конечно, поначалу объём такой памяти казался колоссальным, но со временем одного мегабайта стало не хватать. С появлением процессора 80286 стал доступен так называемый блок памяти UMB, начинающийся с адреса 0FFFFh:0010h и заканчивающийся адресом 0FFFFh:0FFFFh (65520 байт за пределами одного мегабайта). Теперь можно было переконфигурировать операционную систему MS-DOS так, чтобы она занимала этот блок, освобождая в оперативной памяти 64 килобайт.
Нереальный режим
Это особый подрежим реального режима. Процессор находится в реальном режиме, но адресуется к памяти путём конструкции "селектор: смещение". Таким образом доступна память выше 1 мегабайта. В дальнейшем будет рассматриваться защищённый режим и его подрежимы.
Страничная организация памяти
Вся физическая память делится на страницы фиксированного размера (4 КБайт, 2 МБ или 4 МБ, в x86_64 также 1 ГБ). Каждая страница, независимо от размера, выравнена по границе 4 КБайт.
1.3 Программная модель 32-разрядных микропроцессоров в защищенном режиме.
Первая программа: переход в защищённый режим
Переход в защищённый режим осуществляется установкой бита 0 регистра CR0. Переход в реальный режим осуществляется сбросом того же нулевого бита. Рассмотрим программу, которая выполняет эту операцию (язык ― Flat Assembler):
- проверить, возможно ли переключиться в защищённый режим;
- инициализировать таблицы дескрипторов;
- запретить прерывания (как маскируемые, так и не маскируемые);
- открыть линию A20;
- загрузить регистры управления памятью;
- установить нулевой бит (далее он будет называться PE) регистра CR0;
- выполнить переход на 32-битный сегмент кода, переопределив регистр CS.
- компьютер "зависает";
- компьютер перезагружается.
- программа запущена в режиме V86 (режим виртуального 8086);
- программа запущена в защищённом режиме или под конкретной операционной системой.
Особенности процессоров 80386-80486
С появлением 32-разрядных процессоров 80386 фирмы Intel процессоры могут работать в трех режимах: реальном, защищённом и виртуального процессора 8086.
В защищённом режиме используются полные возможности 32-разрядного процессора — обеспечивается непосредственный доступ к 4 Гбайт физического адресного пространства и многозадачный режим с параллельным выполнением нескольких программ (процессов). Собственно говоря, многозадачный режим организует многозадачная операционная система, однако микропроцессор предоставляет необходимый для этого режима мощный и надежный механизм защиты задач друг от друга с помощью четырехуровневой системы привилегий. Так же в этом режиме доступна страничная организация памяти, повышающая уровень защиты задач друг от друга и эффективность их выполнения.
В процессоре i386 компания Intel учла необходимость лучшей поддержки реального режима, потому что программное обеспечение времени его появления не было готово полностью работать в защищённом режиме. Поэтому, например, в i386, возможно переключение из защищённого режима обратно в реальный (при разработке 80286 считалось, что это не потребуется, поэтому на компьютерах с процессором 80286 возврат в реальный режим осуществляется схемно — через сброс процессора).
При включении микропроцессора в нем автоматически устанавливается режим реального адреса. Переход в защищённый режим осуществляется программно путем выполнения соответствующей последовательности команд. Программы, предназначенные для защищённого режима, должны быть написаны особым образом. Это означает, что реальный и защищённый режим не совместимы.
1.1 Общее сравнение реального и защищенного режимов.
Родоначальник семейства “ x 86” – процессор i 8086 имеет один единственный режим работы (который впоследствии назвали “ Real Mode ” – или режим реального адреса). Начиная с процессора i 80286, все последующие модели имеют возможность работать так же и в защищенном режиме “ Protected Mode ” (режим виртуального адреса). Процессоры i 80386 и выше имеют также режим виртуального процессора i 8086 – “ V 86 Mode ”, который расширяет возможности защищенного режима (эмуляция реального режима).
В реальном режиме любой “ x 86” - совместимый процессор имеет архитектуру 8086, но обладает повышенным быстродействием и расширенной системой команд. При этом возможно использование для программирования как 16-ти, так и 32-х разрядных регистров, в том числе и новых («32-разрядный 8086»).
Особенность архитектуры 8086 состоит в ограниченности объема используемой (адресуемой) памяти = 2 20 байтов = 1 Мбайт. (ША =20 разрядов)
Используется принцип сегментной адресации любого байта этого адресного пространства.
Программно задаваемые “сегмент” и “смещение” являются логическими (программными) компонентами адреса памяти.
“сегмент” – старшие 16 разрядов адреса. Находится в одном из сегментных регистров.
“смещение” – 16-ти разрядная величина внутрисегментного смещения (индекс внутри сегмента).
20-разрядный физический адрес памяти вычисляется микропроцессором из логических компонент аппаратно.
Реальный режим сохранен в 32-разрядных современных процессорах для поддержки исполнения однопрограммных операционных систем, ориентированных на архитектуру 8086 ( MSDOS , PCDOS ), и сохранения архитектурной и программной преемственности с процессорами ранних моделей.
При включении процессор находится в реальном режиме. Переход в защищенный режим выполняется программно ( см . приложение 2).
Архитектура защищенного режима принципиально отличается от архитектуры реального режима. Программно эти режимы не совместимы в силу различных механизмов управления памятью! Программы, написанные под реальный режим в защищенном режиме (на процессоре i 80286) работать не могут (процессоры i 80386 и выше в защищенном режиме имеют возможность эмуляции виртуальной машины 8086 – режим “ V 86 Mode ”).
Строго говоря, защищенный режим процессора i 80286 (во времена этого процессора) программистами не использовался. Так как его преимущества не были столь очевидными (объём памяти 286-ого компьютера редко превышал один мегабайт), а совместимость таких программ с большим, на то время, парком 86-х компьютеров бы терялась. Средств выполнения программ реального режима под операционной системой защищенного режима тогда не было (режим V 86 появился в процессорах начиная с i 80386). Поэтому 286-е машины использовались просто как скоростные варианты 86-х. И только с появлением первого 32-х разрядного процессора i 80386 – защищенный режим (сильно измененный и дополненный) стал набирать популярность. Появлялись первые операционные системы защищенного режима, которые, кстати, в дань совместимости, поначалу поддерживали и защищенный режим процессора i 80286.
Далее мы будем рассматривать защищенный режим, опираясь именно на его реализацию в i 80386, так как в последующих процессорах ( i 80486, Pentium и т.п.) он не претерпел существенных изменений, а был лишь немногим дополнен.
Каталог и таблицы страниц
Обе эти структуры представляют собой таблицы элементов каталога и таблицы страниц (англ. Page Directory Entry , PDE и англ. Page Table Entry , PTE) страницы памяти по 4 КБайт.
Оба элемента занимают по 4 байта (32 бита) и имеют похожую структуру:
В жёлтых полях (Page table address, Page address) записаны старшие 20 бит адреса таблицы страниц и страницы соответственно (младшие 12 бит физического адреса всегда равны нулю — не забывайте о выравнивании).
Три бита Avl — это биты, отданные системе. В них можно записать всё что угодно.
Режимы работы процессора Intel 80386
С появлением процессора Intel 80386 возникла архитектура IA32. Она предполагала появление нового режима работы процессора ― защищённого ("Protected Mode"). Для совместимости с предыдущими процессорами линейки Intel 80x86 процессор 80386 не запускался сразу в защищённом режиме, а работал в так называемом реальном режиме ("Real Mode"). Кроме этого, у каждого режима есть один или несколько подрежимов. Разберём их.
1.2 Основные возможности и преимущества защищенного режима.
Защищенный режим и все принципы работы процессора в этом режиме разрабатывались с целью возможности мультизадачного выполнения программ. Если поставить вопрос о создании операционной системы реального режима с поддержкой многозадачности, то сразу возникает проблема: как изолировать программы от взаимного влияния друг на друга, а при необходимости разрешить обмен информацией. Чтобы ввести такое регулирование, нужно иметь больше информации о самих задачах, что эффективно реализовать в реальном режиме невозможно. Можно предложить различные способы структурной организации и размещения такой информации. Intel не стала нарушать принцип сегментации памяти. Так как каждая задача может занимать один или несколько сегментов, то целесообразно иметь о них больше информации, как об объектах, реально существующих в данный момент в системе. Если каждому из этих объектов (сегментов) присвоить определенные атрибуты, то контроль за ними можно переложить на процессор. Что и было сделано корпорацией Intel .
Основные преимущества защищенного режима:
· Аппаратные механизмы управления памятью, позволяющие адресовать большой физический объем оперативной памяти – 16Мб для процессора i 80286 (ША=24 разряда) и 4Гб для процессора i 80386+ (ША=32 разряда);
· Аппаратные механизмы защиты адресных пространств загруженных задач друг от друга;
· Аппаратные механизмы для переключения исполнения с одной задачи на другую;
· Возможность использования «виртуальной памяти»;
· Возможность страничной адресации памяти ;
· Аппаратная возможность эмуляции виртуальной машины 8086 для исполнения программ реального режима (на процессорах 386+).
Защищённый режим
Этот режим имеет сложную конструкцию по сравнению с реальным. Логический адрес представляется конструкцией "селектор:смещение". Селектор находится в пределах от 0 до 0FFFFh (на самом деле, селекторов в 4 раза меньше ― об этом подробнее в следующих статьях). Смещение, в отличие от реального режима, является 32-разрядным, что позволяет адресовать сегменты размером 4 гигабайт. Логический адрес преобразуется в линейный по следующей схеме:
Линейный адрес в дальнейшем выставляется на адресную шину, если не включен режим страничной адресации. В противном случае линейный адрес преобразуется в физический, и только после этого выставляется на адресную шину. Кроме этого, защищённый режим позволяет организовать виртуальную память, достигающую размера до 64 терабайт и зависящую лишь от объёма жёсткого диска (например, тот же файл подкачки в Windows реализует виртуальную память). В защищённом режиме функционируют практически все современные операционные системы.
Содержание
Читайте также: