Обычный перевод выглядит следующим образом:
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 есть в случае, если они (если даже) необходимы.