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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Защищённый режим (режим защищённой виртуальной адресации) — режим работы x86-совместимых процессоров. Частично был реализован уже в процессоре 80286, но там существенно отличался способ работы с памятью, так как процессоры еще были 16-битными и не была реализована страничная организация памяти. Первая 32-битная реализация защищенного режима - процессор Intel 80386. Применяется в совместимых процессорах других производителей. Данный режим используется в современных многозадачных операционных системах, Microsoft Windows, Linux, OS X.

Ранее похожий режим применялся фирмой Digital Equipment (DEC) для 32-разрядных компьютеров: VAX-11.

Особенности процессора 80286[править | править исходный текст]

В процессоре 80286, помимо реального режима, был реализован также защищённый режим. В защищённом режиме процессор может адресовать до 16 Мбайт физической памяти и 1 Гбайт виртуальной (16384 сегмента по 64 кбайт) за счёт изменения механизма адресации. Переключение из реального режима в защищённый происходит программно и относительно просто, однако для обратного перехода необходим аппаратный сброс процессора. Для отслеживания текущего режима работы процессора используется регистр слова состояния машины (MSW). Программы реального режима без модификаций в защищённом режиме исполняться не могут, так же как и программы BIOS машины.

Суть защищённого режима в следующем: программист и разрабатываемые им программы используют логическое адресное пространство, размер которого может составлять 1 гигабайт. Логический адрес преобразуется в физический адрес автоматически с помощью схемы управления памятью (MMU). При этом содержимое сегментного регистра не связано напрямую с физическим адресом, а является номером сегмента в соответствующей таблице. Благодаря защищённому режиму, в памяти может храниться только та часть программы, которая необходима в данный момент, а остальная часть может храниться во внешней памяти (например, на жёстком диске). В случае обращения к той части программы, которой нет в памяти в данный момент, операционная система может приостановить программу, загрузить требуемую секцию кода из внешней памяти и возобновить выполнение программы. Следовательно, становятся допустимыми программы, размер которых больше объема имеющейся памяти, и пользователю кажется, что он работает с большей памятью, чем на самом деле.

Физический адрес формируется следующим образом. В сегментных регистрах хранится селектор, содержащий индекс дескриптора в таблице дескрипторов (13 бит), 1 бит, определяющий к какой таблице дескрипторов будет производиться обращение (к локальной или к глобальной) и 2 бита запрашиваемого уровня привилегий. Далее происходит обращение к соответствующей таблице дескрипторов и соответствующему дескриптору, который содержит начальный 24-битный адрес сегмента, размер сегмента и права доступа, после чего вычисляется необходимый физический адрес путём сложения адреса сегмента со смещением из 16-разрядного регистра.

Особенности процессоров 80386 — 80486[править | править исходный текст]

С появлением 32-разрядных процессоров 80386 фирмы Intel процессоры могут работать в трех режимах: реальном, защищённом и виртуального процессора 8086.

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

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

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

Страничная организация памяти[править | править исходный текст]

Вся физическая память делится на страницы фиксированного размера (4 КБайт, 2 МБ или 4 МБ, в x86_64 также 1 ГБ). Каждая страница, независимо от размера, выровнена по границе 4 КБайт.

Основная мысль сводится к формированию таблиц описания памяти, которые определяют состояние её отдельных сегментов/страниц и т. п. При нехватке памяти операционная система может выгрузить часть данных из оперативной памяти на диск, а в таблицу описаний внести указание на отсутствие этих данных в памяти. При попытке обращения к отсутствующим данным процессор сформирует исключение #PF (разновидность прерывания) и отдаст управление операционной системе, которая вернёт данные в память, а затем вернёт управление программе. Таким образом для программ процесс подкачки данных с дисков происходит незаметно.

Линейная адресация[править | править исходный текст]

Линейная адресация памяти — схема адресации памяти компьютера в защищенном режиме (начиная с 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 загрузить физический адрес каталога страниц.

Схема образования линейного адресного пространства. (Все стрелки указывают на начало страниц)

Каталог и таблицы страниц[править | править исходный текст]

Обе эти структуры представляют собой таблицы элементов каталога и таблицы страниц (англ. Page Directory Entry, PDE и англ. Page Table Entry, PTE) страницы памяти по 4 КБайт.

Оба элемента занимают по 4 байта (32 бита) и имеют похожую структуру:

Элемент каталога страниц

Элемент таблицы страниц

В жёлтых полях (Page table address, Page address) записаны старшие 20 бит адреса таблицы страниц и страницы соответственно (младшие 12 бит физического адреса всегда равны нулю — не забывайте о выравнивании).

Три бита Avl — это биты, отданные системе. В них можно записать всё что угодно.

Описание флагов:

  • Бит P (англ. Present) определяет наличие данной страницы или таблицы страниц в физической памяти. Если он сброшен, то процессор записывает линейный адрес отсутствующей страницы [1] в регистр CR2 и передаёт управление обработчику #PF, который должен загрузить страницу в память (или создать её) и установить этот бит.
  • Бит RW (англ. Read/Write) определяет, можно ли в эту страницу что-то писать (1 — можно, 0 — нельзя).
  • Бит US (англ. User/Supervisor) разрешает коду с CPL=3 (код пользователя) обращаться к этой странице (при US=1).
  • Бит PWT (англ. Page write through) — запрещение кэша записи (немедленная запись). Используется для управления кэшированием данной страницы. Если он установлен, то запись происходит непосредственно в оперативную память. Актуально обычно в многоядерных машинах.
  • Бит PCD (англ. Page cache disable) — запрещение кэширования этой страницы. При обращении к такой странице, она не заносится в кэш.
  • Бит A (англ. Accessed). Аналогично биту A в дескрипторе сегмента, этот бит никак не влияет на работу со страницей. Он просто устанавливается процессором при первом же обращении к этой странице (чтение, запись, выполнение).
  • Бит D (англ. Dirty, букв. грязный) используется только в элементах таблицы страниц (PTE) для отслеживания изменений страницы. Аналогично биту A, устанавливается процессором, но только при записи на эту страницу.
  • Бит PS (англ. Page size, только каталог страниц) определяет размер страницы. Если сброшен, то этот элемент указывает на таблицу страниц с размером страниц 4 КБайт. Если установлен, то элемент указывает на страницу размером 4 МБайт при 32-битной физической адресации или 2 МБайт при 36-битной. Важно! Работает только при установленном бите PSE в регистре CR4.
  • Бит PAT (англ. Page attribute table, только таблица страниц). - Начиная с Pentium 3 может использоваться (совместно с PCD и PWT и MSR IA32_CR_PAT) для определения политики кеширования страницы (UC, WC, WT, WP, WB, UC-) наряду с MTRR[2][3]
  • Бит G (англ. Global). Если этот бит установлен, то адрес страницы (или таблицы страниц) никогда не удаляется из TLB кэша.[4]

Примечания[править | править исходный текст]

  1. Конкретнее, в CR2 записывается полный адрес (32 бита). Напр. если программа обратилась по адресу 00001543h (то есть ко второй странице (№ 1) при страницах по 4 Кбайт), то в CR2 запишется именно это число
  2. The Unabridged Pentium 4: IA32 Processor Genealogy ISBN 0-321-24656-X "PAT Feature (Page Attribute Table)" page 797
  3. kernel.org/doc/ols/2008/ols2008v2-pages-135-144.pdf
  4. Удалить из TLB кэша можно любую страницу привилегированной командой INVLPG

См. также[править | править исходный текст]

Литература[править | править исходный текст]

  • Рудаков П. И., Финогенов К. Г. Программируем на языке Ассемблера IBM PC. — М.: Энтроп, 1996.

Ссылки[править | править исходный текст]