Информация об изменениях

Сообщение Re[8]: история персональной ВТ от 24.01.2022 7:44

Изменено 24.01.2022 7:52 netch80

Re[8]: история персональной ВТ
Здравствуйте, m2l, Вы писали:

PD>>Для совместимости с PM-16, естественно, оставили LDT/GDT, и они теперь под 32 бита, но практически все ОС настраивают сегменты так, чтобы из база была 0, а лимит 4Г. То есть фактически "обнуляют" сегментный механизм от 80286 — он есть, но его преобразование есть тождественное преобразование.

m2l>Нет. Таблицы трансляции работают через таблицы GDT/LDT — они часть общего механизма.

Нет. Читай оригинал, том 3, главы 4 и 5. Единственная принципиальная завязка DAT у Intel на механизм защиты — что без защиты страничная трансляция не включается. Остальное разделено. (Ну да, в PTE участвует, что у страницы тоже есть ограничение, кто её видит, это в таком механизме является следствием самого наличия защиты. В принципе страничная трансляция спокойно может работать и без этого.)

m2l>Александр Фролов, Григорий Фролов. Защищенный режим процессоров Intel 80286/80386/80486. 5. Особенности процессоров I80386 и I80486. 5.1. Преобразование адресов


Что именно по этой ссылке ты имеешь в виду? Если внимательно читать, нигде не сказано, что GDT или LDT как-то влияет на страничную трансляцию.

Если это:

Вторая ступень — получение из логического адреса 32-разрядного линейного адреса. Линейный адрес берётся из глобальной или локальной таблицы дескрипторов (GDT или LDT) в зависимости от соответствующего бита селектора (бит 2).


то это просто криво написано. Линейный адрес получается сложением адреса селектора, полученным по соответствующему сегменту, и адреса, вычисленного в команде. Дальше это расписано со схемой.

m2l>* Сама идея одной GDT и многих LDT вполне себе живёт по сей день и в Windows и в Linux. Где ядро и драйверы работают в общем для всей остальной системы адресатном пространстве, а прикладные приложения в другой его части. Для 32-разрядных систем тема с пределом в 2-гигабайта на процесс (3-и при соответствующей настройке) — много LDT именно из-за того, что оставшиеся 2-а (1-н) — общее для всей системы адресатное пространство ядра (GDT).


Рядом прокомментировал, повторюсь: LDT процесса сейчас нужны в первую очередь для thread-local data.
(Хотя вот подумал — кто мешает держать их и в GDT?)
Кстати, в 64 битах и это не нужно, базовые адреса вместо этого в MSR процессора.

Вопрос: твой термин "адресатное пространство" чем-то отличается от "адресное"? Ни у кого кроме тебя я покамест такого слова не видел.

m2l>PS. ИМХО ты не совсем понимаешь всю гибкость защищенного режима. Разнесение адресации на GDT/LDT/PTE позволяет допустим отправлять в своп куски памяти с неиспользуемыми сейчас фрагментами PTE/LDT.


И это все делают на уровне отдельных страниц. С LDT никто не заморачивается.

m2l> Разнесение GDT/LDT позволяет делать общее для всех программ адресатное пространство, без дополнительных действий для его поддержания (для Windows и Linux в нём находится ядро, драйверы, DMA и всё что относится к ядру).


Это делается средствами страничной трансляции (она же paging, она же dynamic address translation).
Страницы, доступные только ядру (обычно это первый мегабайт и верхняя половина адресного пространства) защищены

m2l> Применение раздельных LDT позволяет делать для двух процессов общую область памяти, которая у каждого отображена в свои адреса. И таких фишек — очень много. AMD когда делала x64-86 не просто так сохранила большую часть аспектов этой работы для long mode — им просто сложно найти адекватную замену.


Только вот сам базовый адрес там "стёрт" к чертям. После этого ни о каком отображении общей памяти в свои адреса средствами собственно сегментации не может быть и речи. Том 3, Figure 5-2.
Re[8]: история персональной ВТ
Здравствуйте, m2l, Вы писали:

PD>>Для совместимости с PM-16, естественно, оставили LDT/GDT, и они теперь под 32 бита, но практически все ОС настраивают сегменты так, чтобы из база была 0, а лимит 4Г. То есть фактически "обнуляют" сегментный механизм от 80286 — он есть, но его преобразование есть тождественное преобразование.

m2l>Нет. Таблицы трансляции работают через таблицы GDT/LDT — они часть общего механизма.

[UPDATED:] я понял твой специфический подход. Ты в dynamic address translation включаешь как тот, что работал через сегментацию (к адресу прибавляется база сегмента из его селектора), так и тот, что работает через страничный механизм. В таком варианте у Intel в legacy mode (не в long) их два. В long mode остался только один, страничный. База сегмента там всегда 0, если это не FS или GS, которые используются для TLD.

Этот подход имеет право на существование, но он нетипичен. И, DAT через сегментный механизм не используется большинством ОС, они на уровне сегментов используют базу 0, о чём тебе PD всё время и толкует.

В остальном же см. оригинал, том 3, главы 4 и 5. Единственная принципиальная завязка страничного DAT у Intel на механизм защиты — что без защиты страничная трансляция не включается. Остальное разделено. (Ну да, в PTE участвует, что у страницы тоже есть ограничение, кто её видит, это в таком механизме является следствием самого наличия защиты. В принципе страничная трансляция спокойно может работать и без этого.)

m2l>* Сама идея одной GDT и многих LDT вполне себе живёт по сей день и в Windows и в Linux. Где ядро и драйверы работают в общем для всей остальной системы адресатном пространстве, а прикладные приложения в другой его части. Для 32-разрядных систем тема с пределом в 2-гигабайта на процесс (3-и при соответствующей настройке) — много LDT именно из-за того, что оставшиеся 2-а (1-н) — общее для всей системы адресатное пространство ядра (GDT).


Рядом прокомментировал, повторюсь: LDT процесса в современных ОС сейчас нужны в первую очередь для thread-local data.
(Хотя вот подумал — кто мешает держать их и в GDT?)
Кстати, в 64 битах и это не нужно, базовые адреса вместо этого в MSR процессора.

Вопрос: твой термин "адресатное пространство" чем-то отличается от "адресное"? Ни у кого кроме тебя я покамест такого слова не видел.

m2l>PS. ИМХО ты не совсем понимаешь всю гибкость защищенного режима. Разнесение адресации на GDT/LDT/PTE позволяет допустим отправлять в своп куски памяти с неиспользуемыми сейчас фрагментами PTE/LDT.


И это все делают на уровне отдельных страниц. С LDT никто не заморачивается.

m2l> Разнесение GDT/LDT позволяет делать общее для всех программ адресатное пространство, без дополнительных действий для его поддержания (для Windows и Linux в нём находится ядро, драйверы, DMA и всё что относится к ядру).


Это делается средствами страничной трансляции (paging DAT).
Страницы, доступные только ядру (обычно это первый мегабайт и верхняя половина адресного пространства) защищены

m2l> Применение раздельных LDT позволяет делать для двух процессов общую область памяти, которая у каждого отображена в свои адреса. И таких фишек — очень много. AMD когда делала x64-86 не просто так сохранила большую часть аспектов этой работы для long mode — им просто сложно найти адекватную замену.


Только вот сам базовый адрес там "стёрт" к чертям. После этого ни о каком отображении общей памяти в свои адреса средствами собственно сегментации не может быть и речи. Том 3, Figure 5-2.