В вычислениях защищенный режим , также называемый режимом защищенного виртуального адреса , [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] хотя многие из этих усовершенствований, такие как добавление инструкций и новых регистров, также принесли преимущества реальный режим.
Intel 8086 , предшественник 286, изначально был разработан с 20- битной адресной шиной для памяти . [9] Это позволило процессору получить доступ к 2 20 байтам памяти, что эквивалентно 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 разрешал доступ к памяти только в 16-битных сегментах через каждый из четырех сегментных регистров, то есть одновременно можно было получить доступ только к 4*2 16 байтам, что эквивалентно 256 килобайтам . [11] Поскольку изменение регистра сегмента в защищенном режиме приводило к загрузке 6-байтового дескриптора сегмента в ЦП из памяти, инструкция загрузки регистра сегмента занимала многие десятки тактов процессора, что делало ее намного медленнее, чем на 8086; поэтому стратегия вычисления адресов сегментов на лету для доступа к структурам данных размером более 128 килобайт (совокупный размер двух сегментов данных) стала непрактичной даже для тех немногих программистов, которые освоили ее на 8086/8088. .
286 сохранил обратную совместимость со своим предшественником 8086, первоначально перейдя в реальный режим при включении питания. [4] Реальный режим функционировал практически идентично 8086, позволяя подавляющему большинству существующего программного обеспечения 8086 работать без изменений на более новом 286. Реальный режим также служил более простым режимом, в котором можно было настроить защищенный режим, решая своего рода проблему. проблема курицы и яйца. Чтобы получить доступ к расширенным функциям 286, операционная система должна была создать в памяти несколько таблиц, которые управляли доступом к памяти в защищенном режиме, записать адреса этих таблиц в некоторые специальные регистры процессора, а затем перевести процессор в защищенный режим. Это позволило использовать 24-битную адресацию, что позволило процессору получить доступ к 2 24 байтам памяти, что эквивалентно 16 мегабайтам . [9]
С выпуском 386 в 1985 году [7] были решены многие проблемы, мешавшие широкому распространению предыдущего защищенного режима. [11] Модель 386 была выпущена с размером адресной шины 32 бита, что обеспечивает доступ к 2 32 байтам памяти, что эквивалентно 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]
; программа МАСМ ; войти в защищенный режим (установить бит PE) mov EBX , CR0 ; сохранить регистр управления 0 (CR0) в EBX или EBX , PE_BIT ; установить бит PE с помощью OR, сохранить в 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] Из-за этих ограничений в модели 386 был введен виртуальный режим 8086. Несмотря на такие потенциальные неудачи, Windows 3.0 и ее преемники могут использовать преимущества двоичной совместимости с реальным режимом для запуска многих версий Windows 2.x ( Windows 2.0 и Windows 2.1). x ) приложения в защищенном режиме, которые работали в реальном режиме в Windows 2.x. [33]
С выпуском модели 386 защищенный режим предлагает то, что в руководствах Intel называется виртуальным режимом 8086 . Режим Virtual 8086 предназначен для того, чтобы код, ранее написанный для 8086, мог выполняться без изменений и одновременно с другими задачами без ущерба для безопасности или стабильности системы. [34]
Однако режим Virtual 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 + смещение) mod 2 20 (если A20 выключена) [ необходимы пояснения ] Каждый сегмент имеет размер 2 16 байт.
В защищенном режиме сегмент_часть заменяется 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-битные команды.
Где:
Помимо добавления виртуального режима 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 определяет ограничительные правила программирования, позволяющие Family API или связанной программе работать как в реальном, так и в защищенном режиме. Некоторые ранние операционные системы Unix , OS/2 1.x и Windows использовали этот режим.
Windows 3.0 могла запускать программы реального режима в 16-битном защищенном режиме; при переключении в защищенный режим было решено сохранить модель единого уровня привилегий, которая использовалась в реальном режиме, поэтому приложения Windows и библиотеки DLL могут перехватывать прерывания и осуществлять прямой доступ к оборудованию. Это продолжалось до серии Windows 9x . Если программа Windows 1.x или 2.x написана правильно и избегает сегментной арифметики, она будет работать одинаково как в реальном, так и в защищенном режимах. Программы Windows обычно избегают сегментной арифметики, поскольку Windows реализует схему виртуальной памяти программного обеспечения, перемещая программный код и данные в память, когда программы не выполняются, поэтому манипулирование абсолютными адресами опасно; программы должны сохранять дескрипторы блоков памяти только тогда, когда они не работают. Запуск старой программы, когда Windows 3.0 работает в защищенном режиме, вызывает диалоговое окно с предупреждением, предлагающее либо запустить Windows в реальном режиме, либо получить обновленную версию приложения. Обновление корректных программ с помощью утилиты MARK с параметром MEMORY позволяет избежать этого диалогового окна. Невозможно, чтобы некоторые программы с графическим интерфейсом работали в 16-битном защищенном режиме, а другие программы с графическим интерфейсом работали в реальном режиме. В Windows 3.1 реальный режим больше не поддерживался, и к нему не было доступа.
В современных 32-битных операционных системах виртуальный режим 8086 по-прежнему используется для запуска приложений, например, DPMI- совместимых программ расширения DOS (через виртуальные машины DOS ) или приложений Windows 3.x (через подсистему Windows в Windows ), а также некоторых классов драйверов устройств. (например, для изменения разрешения экрана с помощью функций BIOS) в OS/2 2.0 (и более поздних версиях OS/2) и 32-битной Windows NT , и все это под контролем 32-битного ядра. Однако 64-битные операционные системы (работающие в длинном режиме ) больше не используют это, поскольку из длинного режима удален виртуальный режим 8086.
Система управления доступом к памяти по п.4, в которой упомянутый первый режим адреса является режимом реального адреса, а упомянутый второй режим адреса является режимом защищенного виртуального адреса.
Целью защищенного режима не является защита вашей программы. Цель состоит в том, чтобы защитить всех остальных (включая операционную систему) от вашей программы.
1985 Intel выпускает процессор Intel386.
Что интересно, дизайнеры того времени никогда не подозревали, что кому-то когда-нибудь понадобится более 1 МБ оперативной памяти.
80386SX — дешевая версия 80386. Этот процессор имел 16-битную внешнюю шину данных и 24-битную внешнюю шину адреса.
На сегодняшний день это было невозможно, и группа разработчиков BIOS вынудила добавить в BIOS поддержку вызовов 32-битных функций из 32-битных приложений.
... во-вторых, защищенный режим также был несовместим с огромным количеством кода реального режима, существовавшего в то время.
Обратной стороной использования режима V86 является скорость: каждая инструкция, чувствительная к IOPL, приводит к переходу ЦП в режим ядра, как и ввод-вывод к портам, которые замаскированы в TSS.
Процесс подкачки позволяет операционной системе преодолеть реальные ограничения физической памяти. Однако это также оказывает прямое влияние на производительность из-за времени, необходимого для записи или извлечения данных с диска.
Одновременно может быть активен только один каталог страниц, на что указывает регистр CR3.
Причина, по которой программное переключение задач так популярно, заключается в том, что оно может быть быстрее, чем аппаратное переключение задач. Intel на самом деле никогда не разрабатывала аппаратное переключение задач, они реализовали его, увидели, что оно работает, и просто оставили его там. Достижения в области многозадачности с использованием программного обеспечения сделали эту форму переключения задач быстрее (некоторые говорят, что до 3 раз быстрее), чем аппаратный метод. Другая причина заключается в том, что способ переключения задач Intel вообще не переносим.
... оба полагаются на способность процессоров Intel переключать задачи, они полагаются на это по-разному.