Как регистры сегментов участвуют в преобразовании адресов памяти? - PullRequest
0 голосов
/ 07 сентября 2018

Из того, что я узнал о сегментации:

  • Виртуальный адрес содержит селектор сегмента и смещение
  • Селектор сегмента используется вместе с GDTR, чтобы найти линейный адрес дескриптора сегмента
  • Дескриптор сегмента содержит информацию о выбранном сегменте, включая его линейный адрес

Итак, мои вопросы:

  • Исходя из того, что я прочитал, виртуальный адрес загружается в регистр сегмента, и затем каким-то образом перевод оттуда продолжается. Что происходит с регистром сегмента после загрузки в него виртуального адреса для получения дескриптора?

  • Насколько я понимаю, регистр сегмента также содержит кэшированное значение дескриптора. Как это влияет на процесс перевода?

  • Как система определяет, в какой регистр сегмента загружать данные, учитывая, что селектор сегмента может иметь до 2 ^ 13 различных значений и имеется только шесть первичных регистров?

1 Ответ

0 голосов
/ 07 сентября 2018

Обычный перевод выглядит следующим образом:

 Logical address   -->   GDT -->  Linear address          --> Page tables --> Physical Address
(segment:offset)                 (segment base + offset)         

\______________________________________________________/ 
                  Virtual address                                     
             (can be either logical or linear)

Если работает в режиме VMX без полномочий root (т.е. в виртуальной машине) и EPT включен, тогда:

 Logical address   -->   GDT -->  Linear address          --> Page tables --> Guest Physical Address --> EPT --> (System) Physical Address
(segment:offset)                 (segment base + offset)         

\______________________________________________________/                      \__________________________________________________________/
                  Virtual address                                                        Physical address
             (can be either logical or linear)

ЕслиПрисутствует IOMMU (как и зонтичная технология VT-d):

Logical address   -->   GDT -->  Linear address          --> Page tables --> Guest Physical Address --> EPT --> (System) Physical Address  -->  1 or 2 level translation --> (IO) Physical address
(segment:offset)                 (segment base + offset)         

\______________________________________________________/                     \___________________________________________________________________________________________________________________/
                  Virtual address                                                        Physical address
             (can be either logical or linear)

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

Примечание Как указывало Хади Браис , термин "виртуальный адрес" обозначает только линейный адрес в руководствах Intel и AMD.
Я нахожу его большеполезно пометить как логические, так и линейные адреса как виртуальные, поскольку они находятся перед этапом перевода страницы.


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

Каждый адрес, указанный на уровне инструкций, представляет собой логический адрес - требуется поиск сегмента дескриптор .
Чтобы избежать чтения из памяти при каждом обращении к памяти по инструкции, процессор кэширует ее - в противном случае это может привести к снижению производительности.

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

Основной целью сегментации (в PM) было выполнение изоляции процесса путем определения непересекающихся сегментов для каждой программы.
Программе обычно требуется только сегмент стека, сегмент данных и сегмент кода -другие три предназначены для того, чтобы избежать сохранения / восстановления сегмента данных тогда, когда максимальный размер сегмента составлял 64 КБ (читай: Реальный режим. fs и gs были добавлены позже, хотя).

Сегодня операционные системы используютплоская модель, в которой есть только два сегмента (код и данные / стек - это упрощение, требуются другие сегменты), охватывающие все адресное пространство, плюс сегменты, специфичные для ОС, для таких вещей, как TLS или PEB / TEB.
Итак, шесть сегментоврегистров даже больше, чем нужно, 8192 записей GDT есть в случае, если они (если даже) необходимы.

...