Часть серии статей о |
Режимы микропроцессора для архитектуры x86 |
---|
|
Первая поддерживаемая платформа указана в скобках |
В вычислительной технике защищенный режим , также называемый защищенным виртуальным адресным режимом , [1] является рабочим режимом x86 -совместимых центральных процессоров (ЦП). Он позволяет системному программному обеспечению использовать такие функции, как сегментация , виртуальная память , подкачка и безопасная многозадачность, разработанные для повышения контроля операционной системы над прикладным программным обеспечением . [2] [3]
Когда процессор, поддерживающий защищенный режим x86, включается, он начинает выполнять инструкции в реальном режиме , чтобы сохранить обратную совместимость с более ранними процессорами x86. [4] Защищенный режим может быть введен только после того, как системное программное обеспечение настроит одну таблицу дескрипторов и включит бит включения защиты (PE) в регистре управления 0 (CR0). [5]
Защищенный режим был впервые добавлен в архитектуру x86 в 1982 году [6] с выпуском процессора Intel 80286 (286), а затем расширен с выпуском 80386 ( 386) в 1985 году [7]. Благодаря улучшениям, добавленным защищенным режимом, он получил широкое распространение и стал основой для всех последующих улучшений архитектуры x86 (IA-32), [8] хотя многие из этих улучшений, такие как добавленные инструкции и новые регистры, также принесли преимущества реальному режиму.
Первый процессор x86, Intel 8086 , имел 20- битную адресную шину для своей памяти , как и его вариант Intel 8088. [9] Это позволяло им получать доступ к 220 байтам памяти, что эквивалентно 1 мегабайту . [9] В то время 1 мегабайт считался относительно большим объемом памяти, [10] поэтому проектировщики персонального компьютера IBM зарезервировали первые 640 килобайт для использования приложениями и операционной системой, а оставшиеся 384 килобайта — для BIOS (базовой системы ввода-вывода) и памяти для дополнительных устройств . [11]
По мере снижения стоимости памяти и увеличения ее использования ограничение в 1 МБ стало существенной проблемой. Intel намеревалась решить это ограничение наряду с другими с выпуском 286. [11]
Первоначальный защищенный режим, выпущенный с 286, не получил широкого распространения; [11] например, он использовался Coherent (с 1982 г.), [12] Microsoft Xenix (около 1984 г.) [13] и Minix . [14] Несколько недостатков, таких как невозможность совершать вызовы BIOS и DOS из-за невозможности переключиться обратно в реальный режим без сброса процессора, препятствовали широкому использованию. [15] Принятие дополнительно затруднялось тем фактом, что 286 допускал доступ к памяти только сегментами по 64 килобайта , адресуемыми его четырьмя сегментными регистрами, что означало, что за один раз можно было получить доступ только к 4 × 64 КБ , что эквивалентно 256 КБ. [11] Поскольку изменение сегментного регистра в защищенном режиме приводило к загрузке 6-байтового сегментного дескриптора в ЦП из памяти, инструкция загрузки сегментного регистра занимала многие десятки процессорных циклов, что делало ее намного медленнее, чем на 8086 и 8088; поэтому стратегия вычисления адресов сегментов «на лету» для доступа к структурам данных размером более 128 килобайт (совокупный размер двух сегментов данных) стала непрактичной даже для тех немногих программистов, которые освоили ее на 8086 и 8088.
286 поддерживал обратную совместимость с 8086 и 8088, изначально входя в реальный режим при включении питания. [4] Реальный режим функционировал практически идентично 8086 и 8088, позволяя подавляющему большинству существующего программного обеспечения для этих процессоров работать без изменений на новом 286. Реальный режим также служил более базовым режимом, в котором можно было настроить защищенный режим, решая своего рода проблему курицы и яйца. Чтобы получить доступ к расширенным функциональным возможностям 286, операционная система создавала в памяти некоторые таблицы, которые управляли доступом к памяти в защищенном режиме, устанавливала адреса этих таблиц в некоторые специальные регистры процессора, а затем переводила процессор в защищенный режим. Это включало 24-битную адресацию, что позволяло процессору получать доступ к 224 байтам памяти, что эквивалентно 16 мегабайтам . [9]
С выпуском 386 в 1985 году [7] были решены многие проблемы, препятствовавшие широкому принятию предыдущего защищенного режима. [11] 386 был выпущен с размером адресной шины 32 бита, что позволяет осуществлять доступ к 232 байтам памяти, что эквивалентно 4 гигабайтам . [16] Размеры сегментов также были увеличены до 32 бит, что означает, что к полному адресному пространству в 4 гигабайта можно было получить доступ без необходимости переключения между несколькими сегментами. [16] В дополнение к увеличенному размеру адресной шины и регистров сегментов, было добавлено много других новых функций с целью повышения операционной безопасности и стабильности. [17] Защищенный режим теперь используется практически во всех современных операционных системах , работающих на архитектуре x86, таких как Microsoft Windows , Linux и многих других. [18]
Кроме того, извлекая уроки из неудач защищенного режима 286 для удовлетворения потребностей многопользовательской DOS , Intel добавила отдельный виртуальный режим 8086 , [19] который позволял эмулировать несколько виртуализированных процессоров 8086 на 386. Однако аппаратная виртуализация x86 , необходимая для виртуализации самого защищенного режима, должна была ждать еще 20 лет. [20]
С выпуском 386 в защищенный режим были добавлены следующие дополнительные функции: [2]
До выпуска 386 защищенный режим не предлагал прямого метода переключения обратно в реальный режим после входа в защищенный режим. IBM разработала обходной путь (реализован в IBM AT ), который включал сброс ЦП через контроллер клавиатуры и сохранение системных регистров, указателя стека и часто маски прерываний в ОЗУ чипа часов реального времени. Это позволяло BIOS восстанавливать ЦП до аналогичного состояния и начинать выполнение кода до сброса. [ необходимо разъяснение ] Позже для сброса ЦП 286 использовался тройной отказ , что было намного быстрее и чище, чем метод контроллера клавиатуры (и не зависит от совместимого с IBM AT оборудования, но будет работать на любом ЦП 80286 в любой системе).
Для входа в защищенный режим сначала необходимо создать таблицу глобальных дескрипторов (GDT) с минимум тремя записями: нулевой дескриптор, дескриптор сегмента кода и дескриптор сегмента данных. В IBM-совместимой машине также должна быть включена линия A20 (21-я адресная линия), чтобы разрешить использование всех адресных линий, чтобы процессор мог получить доступ к памяти свыше 1 мегабайта (только первые 20 линий разрешено использовать после включения питания, чтобы гарантировать совместимость со старым программным обеспечением, написанным для моделей IBM PC и PC/XT на базе Intel 8088 ). [22] После выполнения этих двух шагов бит PE должен быть установлен в регистре CR0, и должен быть выполнен дальний переход для очистки очереди входных данных предварительной выборки . [23] [24]
; Программа MASM ; войти в защищенный режим (установить бит PE) mov EBX , CR0 ; сохранить регистр управления 0 (CR0) в EBX или EBX , PE_BIT ; установить бит PE с помощью ORing, сохранить в EBX mov CR0 , EBX ; сохранить EBX обратно в CR0 ; очистить очередь предварительной выборки; (используя инструкцию дальнего перехода jmp) jmp CLEAR_LABEL CLEAR_LABEL:
С выпуском 386 из защищенного режима можно было выйти, загрузив сегментные регистры значениями реального режима, отключив линию A20 и очистив бит PE в регистре CR0, без необходимости выполнять начальные шаги настройки, требуемые для 286. [25]
Защищенный режим имеет ряд функций, разработанных для улучшения контроля операционной системы над прикладным программным обеспечением с целью повышения безопасности и стабильности системы. [3] Эти дополнения позволяют операционной системе функционировать таким образом, который был бы значительно сложнее или даже невозможен без надлежащей аппаратной поддержки. [26]
В защищенном режиме существует четыре уровня привилегий или кольца , пронумерованные от 0 до 3, причем кольцо 0 является наиболее привилегированным, а 3 — наименее. Использование колец позволяет системному программному обеспечению ограничивать доступ задач к данным, вызов шлюзов или выполнение привилегированных инструкций. [27] В большинстве сред операционная система и некоторые драйверы устройств работают в кольце 0, а приложения — в кольце 3. [27]
Согласно Справочному руководству программиста Intel 80286 , [28]
80286 сохраняет обратную совместимость с большинством прикладных программ 8086 и 80186. Большинство прикладных программ 8086 можно перекомпилировать или пересобрать и запустить на 80286 в защищенном режиме.
По большей части, бинарная совместимость с кодом реального режима, возможность доступа к 16 МБ физической памяти и 1 ГБ виртуальной памяти были наиболее очевидными изменениями для программистов приложений. [29] Это не было без ограничений. Если приложение использовало или полагалось на любой из нижеперечисленных методов, оно не запускалось: [30]
В действительности, почти все прикладные программы DOS нарушали эти правила. [32] Из-за этих ограничений виртуальный режим 8086 был введен с 386. Несмотря на такие потенциальные неудачи, Windows 3.0 и ее преемники могут использовать преимущества двоичной совместимости с реальным режимом для запуска многих приложений Windows 2.x ( Windows 2.0 и Windows 2.1x ) в защищенном режиме, которые работали в реальном режиме в Windows 2.x. [33]
С выпуском 386 защищенный режим предлагает то, что руководства Intel называют виртуальным режимом 8086. Виртуальный режим 8086 разработан, чтобы позволить коду, ранее написанному для 8086, работать без изменений и одновременно с другими задачами, не ставя под угрозу безопасность или стабильность системы. [34]
Однако виртуальный режим 8086 не полностью обратно совместим со всеми программами. Программы, требующие манипуляции сегментами, привилегированные инструкции, прямой доступ к оборудованию или использующие самомодифицирующийся код , будут генерировать исключение , которое должно быть обработано операционной системой. [35] Кроме того, приложения, работающие в виртуальном режиме 8086, генерируют ловушку с использованием инструкций, которые включают ввод/вывод (I/O), что может негативно повлиять на производительность. [36]
Из-за этих ограничений некоторые программы, изначально разработанные для работы на 8086, не могут быть запущены в виртуальном режиме 8086. В результате системное программное обеспечение вынуждено либо идти на компромисс с безопасностью системы, либо с обратной совместимостью при работе с устаревшим программным обеспечением . Пример такого компромисса можно увидеть в выпуске Windows NT , которая отказалась от обратной совместимости для «плохо себя ведущих» приложений DOS. [37]
В реальном режиме каждый логический адрес указывает непосредственно на физическую ячейку памяти, каждый логический адрес состоит из двух 16-битных частей: Сегментная часть логического адреса содержит базовый адрес сегмента с гранулярностью 16 байт, т. е. сегмент может начинаться с физического адреса 0, 16, 32, ..., 2 20 − 16. Смещенная часть логического адреса содержит смещение внутри сегмента, т. е. физический адрес можно вычислить как physical_address = segment_part × 16 + offset, если адресная строка A20 включена, или (segment_part × 16 + offset) mod 2 20 , если A20 выключена. [ необходимо пояснение ] Каждый сегмент имеет размер 2 16 байт.
В защищенном режиме segment_part заменяется 16-битным селектором , в котором 13 старших бит (бит 3–15) содержат индекс записи внутри таблицы дескрипторов . Следующий бит (бит 2) указывает, используется ли операция с GDT или LDT. Нижние два бита (бит 1 и бит 0) селектора объединяются для определения привилегии запроса, где значения 0 и 3 представляют наивысшую и наименьшую привилегию соответственно. Это означает, что смещение байтов дескрипторов в таблице дескрипторов такое же, как у 16-битного селектора, при условии, что нижние три бита обнулены.
Запись таблицы дескрипторов определяет реальный линейный адрес сегмента, предельное значение размера сегмента и некоторые биты атрибутов (флаги).
Адрес сегмента внутри записи таблицы дескрипторов имеет длину 24 бита, поэтому каждый байт физической памяти может быть определен как граница сегмента. Предельное значение внутри записи таблицы дескрипторов имеет длину 16 бит, поэтому длина сегмента может быть от 1 байта до 2 16 байт. Вычисленный линейный адрес равен адресу физической памяти.
Адрес сегмента внутри записи таблицы дескрипторов расширяется до 32 бит, поэтому каждый байт физической памяти может быть определен как граница сегмента. Предельное значение внутри записи таблицы дескрипторов расширяется до 20 бит и дополняется флагом гранулярности (G-бит, для краткости):
Процессор 386 также использует 32-битные значения для смещения адреса.
Для поддержания совместимости с защищенным режимом 286 был добавлен новый флаг по умолчанию (D-бит, для краткости). Если D-бит сегмента кода выключен (0), все команды внутри этого сегмента будут интерпретироваться как 16-битные команды по умолчанию; если он включен (1), они будут интерпретироваться как 32-битные команды.
80286 Описатель сегмента | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
80386 Описатель сегмента | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Где:
В дополнение к добавлению виртуального режима 8086, 386 также добавил подкачку в защищенный режим. [39] С помощью подкачки системное программное обеспечение может ограничивать и контролировать доступ задачи к страницам, которые являются разделами памяти. Во многих операционных системах подкачка используется для создания независимого виртуального адресного пространства для каждой задачи, предотвращая манипулирование одной задачей памятью другой. Подкачка также позволяет перемещать страницы из первичного хранилища в более медленное и большее вторичное хранилище , такое как жесткий диск . [40] Это позволяет использовать больше памяти, чем физически доступно в первичном хранилище. [40]
Архитектура x86 позволяет управлять страницами через два массива : каталоги страниц и таблицы страниц . Первоначально каталог страниц имел размер одной страницы, четыре килобайта и содержал 1024 записи каталога страниц (PDE), хотя последующие усовершенствования архитектуры x86 добавили возможность использовать страницы большего размера. Каждый PDE содержал указатель на таблицу страниц. Таблица страниц также изначально имела размер четыре килобайта и содержала 1024 записи таблицы страниц (PTE). Каждый PTE содержал указатель на фактический физический адрес страницы и используется только при использовании четырехкилобайтных страниц. В любой момент времени может активно использоваться только один каталог страниц. [41]
Благодаря использованию колец, привилегированных шлюзов вызовов и сегмента состояния задачи (TSS), представленного в 286, на архитектуре x86 стала возможной вытесняющая многозадачность . TSS позволяет изменять регистры общего назначения, поля селектора сегмента и стеки, не затрагивая при этом другие задачи. TSS также позволяет уровню привилегий задачи и разрешениям порта ввода-вывода быть независимыми от других задач.
Во многих операционных системах не используются все функции TSS. [42] Обычно это происходит из-за проблем с переносимостью или из-за проблем с производительностью, возникающих при аппаратном переключении задач. [42] В результате многие операционные системы используют как аппаратное, так и программное обеспечение для создания многозадачной системы. [43]
Операционные системы, такие как OS/2 1.x, пытаются переключать процессор между защищенным и реальным режимами. Это и медленно, и небезопасно, поскольку программа реального режима может легко привести к сбою компьютера. OS/2 1.x определяет ограничительные правила программирования, позволяющие API семейства или связанной программе работать как в реальном, так и в защищенном режиме. Некоторые ранние операционные системы Unix , OS/2 1.x и Windows использовали этот режим.
Windows 3.0 могла запускать программы реального режима в 16-битном защищенном режиме; при переключении в защищенный режим она решила сохранить модель с одним уровнем привилегий, которая использовалась в реальном режиме, поэтому приложения и библиотеки DLL Windows могут перехватывать прерывания и выполнять прямой доступ к оборудованию. Это продолжалось в течение всей серии Windows 9x . Если программа Windows 1.x или 2.x написана правильно и избегает сегментной арифметики, она будет работать одинаково как в реальном, так и в защищенном режимах. Программы Windows обычно избегают сегментной арифметики, поскольку Windows реализует схему программной виртуальной памяти, перемещая программный код и данные в памяти, когда программы не запущены, поэтому манипулирование абсолютными адресами опасно; программы должны хранить только дескрипторы блоков памяти, когда они не запущены. Запуск старой программы, когда Windows 3.0 работает в защищенном режиме, вызывает предупреждающее диалоговое окно, предлагающее либо запустить Windows в реальном режиме, либо получить обновленную версию приложения. Обновление хорошо себя ведущих программ с помощью утилиты MARK с параметром MEMORY позволяет избежать этого диалогового окна. Невозможно, чтобы некоторые программы GUI работали в 16-битном защищенном режиме, а другие программы GUI работали в реальном режиме. В Windows 3.1 реальный режим больше не поддерживался и не мог быть доступен.
В современных 32-разрядных операционных системах виртуальный режим 8086 по-прежнему используется для запуска приложений, например, совместимых с DPMI программ расширения DOS (через виртуальные машины DOS ) или приложений Windows 3.x (через подсистему Windows on Windows ) и определенных классов драйверов устройств (например, для изменения разрешения экрана с использованием функциональности BIOS) в OS/2 2.0 (и более поздних OS/2) и 32-разрядной Windows NT , все под управлением 32-разрядного ядра. Однако 64-разрядные операционные системы (которые работают в длинном режиме ) больше не используют его, поскольку виртуальный режим 8086 был удален из длинного режима.
Система управления доступом к памяти согласно пункту 4, в которой указанный первый режим адреса является режимом реального адреса, а указанный второй режим адреса является режимом защищенного виртуального адреса.
Цель защищенного режима — не защита вашей программы. Цель — защита всех остальных (включая операционную систему) от вашей программы.
1985 Intel выпускает процессор Intel386
, что проектировщики того времени и не подозревали, что кому-то когда-либо понадобится больше 1 МБ ОЗУ.
— бюджетная версия 80386. Этот процессор имел 16-битную внешнюю шину данных и 24-битную внешнюю шину адреса.
До сих пор это было невозможно и вынудило команды разработчиков BIOS добавить в BIOS поддержку вызовов 32-битных функций из 32-битных приложений.
... во-вторых, защищенный режим также был несовместим с огромным количеством кода реального режима, существовавшего в то время.
использования режима V86 является скорость: каждая инструкция, чувствительная к IOPL, приведет к переходу ЦП в режим ядра, как и ввод-вывод на порты, которые замаскированы в TSS.
Процесс подкачки позволяет операционной системе преодолевать реальные ограничения физической памяти. Однако он также напрямую влияет на производительность из-за времени, необходимого для записи или извлечения данных с диска.
Только один каталог страниц может быть активен в один момент времени, на что указывает регистр CR3.
Причина, по которой программное переключение задач так популярно, заключается в том, что оно может быть быстрее, чем аппаратное переключение задач. Intel на самом деле никогда не разрабатывала аппаратное переключение задач, они реализовали его, увидели, что оно работает, и просто оставили его там. Достижения в области многозадачности с использованием программного обеспечения сделали эту форму переключения задач быстрее (некоторые говорят, что до 3 раз быстрее), чем аппаратный метод. Другая причина заключается в том, что способ переключения задач Intel вообще непереносим
... оба полагаются на способность процессоров Intel переключаться между задачами, они полагаются на это по-разному.