Открыть сервис

Защищённый режим

Защищённый режим (англ. protected mode) — это режим работы центрального процессора архитектуры x86, который обеспечивает аппаратную поддержку многозадачности, защиты памяти, виртуальной памяти и привилегированных уровней выполнения кода. Он пришёл на смену реальному режиму (real mode), унаследованному от процессора Intel 8086, и стал основой для операционных систем, начиная с Microsoft Windows 3.0 (в расширенном режиме) и OS/2 1.x, а также для всех современных версий Windows, Linux и других многозадачных ОС для x86-совместимых процессоров.

История

Предпосылки появления

Процессор Intel 8086 (1978 год) и его преемники работали исключительно в реальном режиме, который имел существенные ограничения:

  • Адресное пространство: всего 1 Мбайт (20-битная адресация), из которых 640 Кбайт были доступны для приложений (так называемая «граница 640 Кбайт»).
  • Отсутствие защиты: любая программа могла обращаться к любому участку памяти, включая область операционной системы, что приводило к частым сбоям и зависаниям.
  • Однозадачность: без специальных ухищрений (например, Terminate and Stay Resident — TSR) процессор не мог выполнять несколько программ параллельно.

С ростом сложности программного обеспечения и появлением графических интерфейсов (Windows, OS/2) назрела необходимость в более мощном и безопасном режиме работы.

Разработка и внедрение

Intel представила защищённый режим в процессоре 80286 (1982 год). В нём впервые появилась 24-битная адресация (до 16 Мбайт) и аппаратная поддержка защиты памяти, но реализация была неполной: переключение из защищённого режима обратно в реальный требовало сброса процессора, что усложняло обратную совместимость. Полноценная реализация защищённого режима с 32-битной адресацией (до 4 Гбайт) и поддержкой страничной организации памяти появилась в процессоре Intel 80386 (1985 год). Именно 80386 стал стандартом для защищённого режима, который используется и в современных x86-64 процессорах (в режиме совместимости).

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

Первой массовой операционной системой, активно использующей защищённый режим, стала OS/2 1.0 (1987 год). Затем Microsoft Windows 3.0 (1990 год) в расширенном режиме (386 Enhanced Mode) также переключала процессор в защищённый режим, что позволило запускать несколько DOS-приложений в отдельных виртуальных машинах. Windows 95 и последующие версии полностью работали в защищённом режиме (с элементами виртуального 8086 режима для совместимости). Linux с самого начала (1991 год) проектировался для защищённого режима.

Архитектура и принципы работы

Защита памяти

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

Уровни привилегий (кольца защиты)

Защищённый режим вводит четыре уровня привилегий (Ring 0, Ring 1, Ring 2, Ring 3), из которых на практике используются только два:

  • Ring 0 (самый привилегированный) — выполняется ядро операционной системы, драйверы устройств, гипервизоры.
  • Ring 3 (наименее привилегированный) — выполняются пользовательские приложения.

Код, работающий на Ring 3, не может напрямую обращаться к аппаратуре, изменять таблицы страниц или выполнять привилегированные инструкции (например, HLT, IN/OUT). Для доступа к системным ресурсам приложение должно вызывать системные вызовы (syscall/sysenter или int 0x80), которые переключают процессор на Ring 0.

Сегментация

В защищённом режиме адресация памяти строится на сегментах, которые описываются в глобальной таблице дескрипторов (GDT) или локальной таблице дескрипторов (LDT). Каждый сегмент имеет:

  • базовый адрес (32-битный или 64-битный в режиме совместимости);
  • размер (лимит);
  • права доступа (чтение, запись, исполнение, уровень привилегий).

Сегментный адрес (селектор) загружается в сегментные регистры (CS, DS, SS, ES, FS, GS). В отличие от реального режима, селектор не является непосредственным адресом, а указывает на индекс в таблице дескрипторов.

Страничная организация памяти (Paging)

Для реализации виртуальной памяти и защиты на уровне страниц (4 Кбайт, 2 Мбайт, 4 Мбайт) используется механизм страничной трансляции. Процессор поддерживает таблицы страниц (Page Tables), которые отображают виртуальные адреса на физические. Каждая запись в таблице страниц содержит биты присутствия, разрешений на чтение/запись/исполнение, а также бит «доступ» и «грязный» (для подкачки). В современных ОС (Linux, Windows) страничная организация является основным механизмом изоляции процессов.

Виртуальный 8086 режим (VM86)

Для совместимости с программами, написанными для реального режима (DOS-приложения), защищённый режим включает специальный подрежим — виртуальный 8086. В этом режиме процессор эмулирует 16-битное окружение реального режима внутри защищённого, что позволяет запускать DOS-программы в окне Windows или в эмуляторах (например, DOSBox). VM86 использует страничную организацию для изоляции и перехвата обращений к аппаратуре.

Переключение между режимами

Из реального в защищённый

Переход в защищённый режим выполняется программно: загрузчик операционной системы (например, GRUB, NTLDR) настраивает GDT и таблицы страниц, затем устанавливает бит PE (Protection Enable) в регистре CR0 (Control Register 0). После этого процессор начинает работать в защищённом режиме. Обратный переход (из защищённого в реальный) возможен только через сброс процессора (например, через контроллер клавиатуры или специальную последовательность инструкций), что делает его неудобным для повседневного использования. В современных ОС переход в реальный режим не выполняется — все операции происходят в защищённом или 64-битном режиме.

Из защищённого в 64-битный режим (Long Mode)

С появлением архитектуры AMD64 (x86-64) процессоры получили 64-битный режим (Long Mode), который является расширением защищённого режима. Для перехода в Long Mode необходимо:

  1. Включить страничную организацию с 64-битными таблицами страниц.
  2. Установить бит LME (Long Mode Enable) в регистре MSR (Model-Specific Register).
  3. Установить бит PG (Paging) в CR0 и бит LMA (Long Mode Active) в CR4.

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

Применение

Операционные системы

Защищённый режим является обязательным требованием для всех современных многозадачных операционных систем:

  • Microsoft Windows: все версии, начиная с Windows 3.0 (расширенный режим), работают в защищённом режиме. Windows 95/98/Me использовали его для обеспечения многозадачности и защиты памяти. Windows NT/2000/XP/Vista/7/8/10/11 полностью 32-битные или 64-битные, базирующиеся на защищённом режиме.
  • Linux: ядро Linux с версии 0.01 (1991 год) работает в защищённом режиме. Современные дистрибутивы (Ubuntu, Debian, CentOS, Astra Linux и др.) используют 64-битный режим.
  • macOS: операционная система Apple (начиная с Mac OS X 10.0) также использует защищённый режим на процессорах Intel.
  • OS/2: IBM OS/2 1.x и 2.x полностью работали в защищённом режиме.
  • FreeBSD, OpenBSD, NetBSD: все современные BSD-системы.

Встроенные системы и загрузчики

Некоторые загрузчики (например, GRUB, LILO, Syslinux) переключают процессор в защищённый режим перед загрузкой ядра ОС. Встроенные системы (маршрутизаторы, промышленные контроллеры) на базе x86-совместимых процессоров также могут использовать защищённый режим для повышения надёжности.

Эмуляция и виртуализация

Защищённый режим используется в эмуляторах (QEMU, Bochs, DOSBox) для запуска программ, написанных для реального режима. Гипервизоры (VMware, VirtualBox, KVM) также работают в защищённом режиме, эмулируя виртуальные машины.

Критика и ограничения

Сложность реализации

Защищённый режим требует от разработчиков глубокого понимания архитектуры x86: настройка GDT, таблиц страниц, обработка исключений и прерываний. Ошибки в этих настройках приводят к «защищённым ошибкам» (General Protection Fault — GPF), которые могут вызвать сбой всей системы. Для начинающих программистов защищённый режим значительно сложнее реального.

Обратная совместимость

Хотя защищённый режим сохраняет совместимость с 16-битным кодом через виртуальный 8086 режим, многие программы для реального режима (например, старые игры, утилиты DOS) не работают непосредственно в защищённом режиме без эмуляции. Это создаёт проблемы для запуска legacy-приложений на современных ОС.

Энергопотребление и производительность

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

Уязвимости

Несмотря на аппаратную защиту, в защищённом режиме были обнаружены уязвимости, такие как:

  • Spectre и Meltdown (2018 год) — атаки на механизм спекулятивного выполнения, позволяющие читать защищённую память.
  • L1TF (L1 Terminal Fault) — утечка данных через кэш L1.
  • Rowhammer — атака на динамическую память (DRAM), приводящая к изменению битов в соседних строках.

Эти уязвимости потребовали выпуска обновлений микрокода и операционных систем, а также привели к снижению производительности (до 30% в некоторых сценариях).

Интересные факты

  • Процессор Intel 80286 мог переключаться в защищённый режим, но не мог вернуться обратно в реальный без сброса. Это ограничение было устранено в 80386, который добавил инструкцию LOADALL (недокументированная) и возможность переключения через регистр CR0.
  • В защищённом режиме можно выполнять 16-битный код (режим совместимости), но он не поддерживает защиту памяти на уровне сегментов — все сегменты имеют базовый адрес 0 и лимит 64 Кбайт.
  • Операционная система Windows 3.0 в расширенном режиме использовала защищённый режим для запуска DOS-приложений в отдельных виртуальных машинах, что позволяло избежать «синего экрана» при сбое одной программы.
  • В Linux защищённый режим используется не только для ядра, но и для модулей ядра (драйверов), которые выполняются на Ring 0.
  • Существует проект ReactOS — свободная операционная система, совместимая с Windows NT, которая полностью работает в защищённом режиме.

Источники

  • Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3: System Programming Guide. — 2023.
  • AMD Corporation. AMD64 Architecture Programmer’s Manual. Volume 2: System Programming. — 2022.
  • Таненбаум Э., Бос Х. Современные операционные системы. — 4-е изд. — СПб.: Питер, 2015. — 1120 с.
  • Роберт Лав. Ядро Linux. Описание процесса разработки. — 3-е изд. — М.: Вильямс, 2013. — 496 с.
  • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. — 3-е изд. — М.: Вильямс, 2013. — 1328 с. (раздел о виртуальной памяти).
  • Документация Microsoft. Windows Internals, Part 1: System architecture, processes, threads, memory management, and more. — 7th ed. — Microsoft Press, 2017.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →