Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2459

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
1.64 Mб
Скачать

данных. Для системных сегментов

, такой дескриптор

может быть размещен только в

таблице GDT. Примеры

= 0

системных сегментов: сегмент LDT, Call Gate (специальный механизм для безопасного вызова функции), Interrupt Gate (специальный механизм для безопасного вызова обработчиков прерываний), Trap Gate (специальный механизм для безопасного вызова обработчиков исключений).

Если = 0, то 4-битное поле Тип содержит идентификатор типа системного сегмента, описываемого данным дескриптором.

Если = 1, то дескриптор сегмента описывает обычный сегмент кода или данных (сегмент стека является сегментом данных). Тогда поле Тип содержит 4 битовых флага. Флаг C/D (Code/Data) позволяет различать сегменты

кода и сегменты данных. Если

 

– то дескриптор

описывает сегмент данных, в

противном случае – сегмент

 

/ = 0

 

кода. При попытке передать управление в сегмент данных процессор генерирует исключение, предотвращая возможность исполнения программного кода из сегмента данных1. Флаг A (Accessed) является признаком обращения к сегменту. Процессор устанавливает его при загрузке дескриптора сегмента в сегментный регистр. Операционная система может проверять и очищать флаг A. Если спустя некоторое время флаг A снова появился в дескрипторе сегмента, значит, этот сегмент использовался. Если же после сброса флаг A долго не появляется, то сегмент можно выгрузить на диск. Два оставшихся бита в поле Тип

1 Один из широко распространенных способов внедрения вредоносного кода – метод переполнение буфера, основан на размещении в сегменте данных кодов вредоносной программы с последующей передачей управления в этот код. Запрет исполнения данных исключает такую возможность.

81

представляют флаги, различные для сегмента кода и сегмента данных.

В дескрипторе сегмента данных представлены флаги

E (Expand-Down)

и W

(Write). Если

, то

в

этом

сегменте базовый

адрес

определяет не

начало,

а

конец

= 1

 

 

сегмента, и при трансляции адреса смещение должно

вычитаться из базового адреса. Если

 

, то разрешена

запись в сегмент, в противном случае,

при попытке записи

= 1

 

процессор сгенерирует исключение.

В дескрипторе сегмента кода представлены флаги C

(Confirming) и R

(Readable).

Если

 

 

,

то код этого

сегмента

можно

вызывать

из

менее

привилегированного

= 1

 

кода, когда

 

 

.

Если

 

 

, то

содержимое

сегмента

кода

может быть прочитано, как данные. В

 

>

 

 

 

= 1

 

 

противном случае, при попытке чтения программного кода процессор сгенерирует исключение

В 64-битном режиме формат дескрипторов сегментов кода и данных не изменился, но большинство полей этих дескрипторов в 64-битном режиме не используются. В дескрипторе сегмента кода используются только флаги D, P, C и поле DPL. В дескрипторе сегмента данных – только флаг P.

Формат дескриптора системного сегмента в 64битном режиме расширен для поддержки 64-битной адресации. При этом расширенные дескрипторы сегментов могут чередоваться в GDT с обычными, что позволяет работать одновременно с 64-битными и 32-битными

процессами.

 

 

 

Формат

расширенного

дескриптора

системного

сегмента

показан

на

рис. 19.

82

Рис. 19. Формат расширенного дескриптора системного сегмента

83

Как видно на рис. 19, расширенный дескриптор строится за счет объединения двух соседних записей в таблице дескрипторов. Предположим, что для расширенного дескриптора используются записи и +1 в таблице GDT. Для выбора такого сегмента в селектор сегмента нужно записывать . При этом у +1 записи GDT установлен недопустимый тип сегмента (все нули), и если такой дескриптор сегмента попытаться адресовать через селектор сегмента (записать в селектор сегмента +1), то процессор сгенерирует исключение.

Пространство присоединенной записи таблицы дескрипторов используется для хранения старших 32 бит 64-битного базового адреса сегмента.

Заметим, что современные операционные системы при реализации виртуальной памяти на архитектуре x86 полагаются исключительно на страничный механизм процессора, а сегменты в виртуальных адресных пространствах реализуют программно. Поэтому при расширении 32-битной архитектуры x86 до 64-битной архитектуры x86-64 сегментный механизм был реализован со значительными упрощениями, что в значительной степени помогло сохранить совместимость с 32-битной архитектурой. Тем не менее, сегментный механизм трансляции адресов не может быть отключен. Операционные системы должны установить необходимые сегментные регистры и поддерживать таблицу GDT, даже если сегменты включают все адресное пространство и полностью перекрываются. Трансляция виртуального адреса сначала выполняется относительно сегмента, а затем, если включен страничный механизм процессора посредством установки флага PG в регистре CR0, преобразование адреса будет продолжено на основе страничного механизма.

84

4.2. Страничный механизм

Как и сегментный механизм, 64-битный страничный механизм в архитектуре x86-64 реализован посредством расширения 32-битного механизма. Страничный механизм поддерживает несколько режимов трансляции адресов с различными размерами страниц и различными ограничениями на разрядность виртуального и физического адресных пространств. Рассмотрим некоторые из них.

4.2.1. 32-битный режим, 4-килобайтные страницы

Упрощенная структурная схема подсистемы трансляции адресов в режиме 32-битных виртуальных и физических адресов с использованием 4-килобайтных страниц показана на рис. 20.

Данный режим трансляции можно считать базовым, именно он был реализован в процессоре 80386. Остальные режимы трансляции будем рассматривать как дополнения этого базового режима.

Для экономии места в ОЗУ реализована иерархическая модель таблиц трансляции. При работе процессора только таблица каталога страниц (PDT), занимающая 4 КБ, должна быть постоянно размещена в ОЗУ. Таблицы страниц могут создаваться, уничтожаться и выгружаться на диск по мере необходимости.

Начальный адрес таблицы PDT, определяющей адресное пространство процесса, загружается в регистр процессора CR3. При переключении процессов операционная система перегружает регистр CR3 для смены ВАП.

85

Рис. 20. Трансляция адреса в режиме 32-битных виртуальных и физических адресов с использованием 4-килобайтных страниц

86

Таблица PDT содержит 1024 записи (их называют PDE), формат которых показан на рис. 21.

 

32

 

 

20

3

 

 

Адрес PT

AVL

A

P

(Биты 31...12)

 

 

 

PS=0 в режиме 4 КБ страниц

Рис. 21. Формат PDE в 32-битном режиме для 4- килобайтных страниц

Запись PDE содержит базовый адрес таблицы страниц (PT), 7 флагов и одно 3-битное поле AVL.

Базовый адрес таблицы страниц содержит только 20 старших бит 32-битного физического адреса PT, поскольку размещение таблиц страниц в памяти должно быть выровнено на 4 КБ. Следовательно, младшие 12 бит 32битного физического адреса PT всегда нулевые и их можно не хранить.

Поле AVL (Available) не влияет на трансляцию адресов. Оно может использоваться операционной системой для размещения дополнительных программных флагов или меток, сопоставленных с записью каталога страниц.

Флаг PS (Page Size) позволяет переключаться между 4-килобайтными и 4-мегабайтными страницами, как будет описано далее. В базовом режиме с 4-килобайтными

страницами

 

.

Флаг

(Accessed) выставляется процессором при

A = 0

 

обращении к записи PDE. Этот флаг может считываться и очищаться операционной системой. Используется при реализации дисциплины замещения для обнаружения

87

таблиц страниц (PT), к которым долгое время нет обращений.

Битовые флаги PCD и PWT управляют режимами кэширования страниц из таблицы, адресуемой PDE. Флаг

PCD (Page-Level Cache Disable) – запрещает кэширование, флаг PWT (Page-Level Writethrough) – включает режим сквозной записи, когда запись данных выполняется одновременно и в кэш и в ОЗУ, а чтение данных может выполняться только из кэша.

Флаг U/S (User/Supervisor) управляет режимом доступа к страницам из таблицы, адресуемой PDE. Если

/= 1, то доступ к страницам возможен при любом CPL,

а если

 

, то попытка обратиться к странице для

записи или/

чтения при

 

(пользовательский режим)

= 0

= 3

 

вызывает исключение.

 

 

Флаг

R/W (Read/Write) управляет возможностью

записи

в страницы из

таблицы, адресуемой PDE. Если

/= 1, то доступ к страницам возможен как на чтение,

так и на запись, а если

, то попытка записи

вызывает исключение.

/ = 0

Флаг P (Present) – флаг присутствия в ОЗУ таблицы страниц, адресуемой PDE. Он устанавливается и сбрасывается операционной системой. Процессор проверяет

флаг P при каждой трансляции адреса. Если

, то при

попытке обратиться к таблице страниц,

адресуемой PDE,

 

= 0

процессор генерирует исключение (страничную ошибку). Если страничная ошибка происходит во время выполнения программы, операционная система должна найти и загрузить требуемую таблицу страниц в ОЗУ, занести ее базовый адрес в PDE и установить флаг P, после чего выполнение программы может быть продолжено.

Таким образом, старшие 10 бит виртуального адреса индексируют запись таблицы каталога страниц. Из записи

88

таблицы каталога выбирается адрес таблицы страниц для продолжения преобразования виртуального адреса в физический.

Таблица страниц (PT – Page Table) содержит 1024 записи (PTE – Page Table Entry) в формате, показанном на рис. 22.

Рис. 22. Формат PTE в 32-битном режиме для 4-килобайтных страниц

Поле адреса содержит начальный адрес страницы, выровненный на 4 КБ. Поле AVL и флаги A, PCD, PWT, U/S, R/W и P аналогичны соответствующим полю и флагам в PDE. При этом поля PCD, PWT, U/S, R/W в PTE

учитываются, только если соответствующие флаги в PDE сброшены, т.е., если PDE не устанавливает режимы кэширования и зашиты для всех страниц из таблицы страниц, то флаги в PTE позволяют установить соответствующие режимы для отдельных страниц.

Флаг G (Global Page) – если = 1, то запись TLB,

соответствующая этой странице, не очищается при изменении регистра CR3, например, при переключении процессов.

Флаг PAT (Page-Attribute Table) – используется,

только если включена поддержка таблицы атрибутов страниц. В этом режиме не используются флаги PCD и PWD. Вместо этого биты PAT, PCD и PWD трактуются как 3-битное поле, определяющее индекс записи в 8-элементной

89

таблице атрибутов страниц. Каждая запись таблицы атрибутов страниц содержит расширенную настройку режима кэширования. Таким образом, можно заранее создать до 8 политик кэширования и установить для страницы любую из них.

Флаг D (Dirty) – выставляется процессором при выполнении операции записи в страницу, может быть считан или очищен программно. Используется операционной системой для обнаружения модифицированных страниц.

4.2.2. 32-битный режим, 4-мегабайтные страницы

Как уже упоминалось, выбор размера страницы является компромиссным. Относительно малый размер страницы используется, чтобы избежать потерь памяти на внутреннюю фрагментацию. В случае же, если большие непрерывные блоки данных представляются в памяти в виде множества мелких страниц, это только увеличивает накладные расходы – необходимо хранить таблицы страниц и отдельно управлять перемещением каждой страницы. Поэтому современные процессоры предусматривают поддержку больших страниц, а современные операционные системы используют большие страницы для представления отдельных частей ВАП ядра, в которых размещены большие структуры данных.

Упрощенная структурная схема подсистемы трансляции адресов в режиме 32-битных виртуальных и физических адресов с использованием 4-мегобайтных страниц показана на рис. 23.

90

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]