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

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

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

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

PD>>Я с этим и не спорю, это верно. Вот только фактически все элементы LDT/GDT и в Windows, и в Linux настроены так, что база у низ 0, а лимит 4 Г. В принципе LDT и GDT могли бы иметь сегменты любого размера <4Гб и с базой от 0 до 4Г. В плоской же модели (flat) используется лишь вариант с 0 и 4 Г соответственно. Это и есть то, что я назвал обнулением. Конечно, LDT/GDT и сегментные регистры (Cs, DS...) никуда не делись, но поскольку каждый сегментный регистр показывает на элемент LDT/GDT с нулевой базой, то


m2l>Можно, я не буду запускать отладчик и делать дамп gdt/ldt, а просто спрошу — откуда ты это взял?


Нельзя. Запусти и посмотри.

m2l>GDT — указывает на PTE общие для всех процессов, LDT — указывает на таблицы PTE адресующие виртуальное адресатное пространство самого процесса.


LDT не может в принципе указывать на таблицы DAT. В x86 это так не работает.
LDT используется для двух вещей:
1. Селектор в таблице имеет указание разрядности исполняемой задачи (16 или 32).
2. FS и/или GS указывают на блок данных текущей нити, в котором или напрямую, или указатели на thread-local data.

Причём в 64-битном режиме по сути остаётся только второе.

PD>>Это, скажем так, не вполне верно. Кольца остались, конечно, вот только 4 кольца механизма LDT/GDT проецируются на 2 режима механизма User/Supervisor. А именно, 3 кольцо есть User, все остальное — Supervisor. Но поскольку реально кольца 1 и 2 не использовались никогда, это никого не беспокоило тоже никогда, и все считают, что 0 — это Supervisor, 3- это User, а про 1 и 2 никто и не вспоминает.


m2l>Ты путаешь два совершенно разных механизма. Двухбитный DPL дошел до наших с четырьмя уровнями защиты. И он задаётся дескрипторами GDT/LDT. Тот бит в PTE о котором устанавливает флаг, доступности страницы только для супервизора DPL=0. И он дополняет механику четырех колец защиты тем что запрещает "обратное чтение".


Верно. Но так как это в page table entry, никакой связи с GDT/LDT у него нет.

m2l>Я про это и говорю. Системная часть — адресуется через GDT, пользовательское адресатное пространство через LDT.


Нет, основные ОС это не используют. В них вся защита в механизме DAT по правам доступа к страницам.

PD>>А LDT вообще одна, я уже объяснил, как она используется.

m2l>Ага, особенно на многоядерных машинах LDT одна. Адресующая одни и те же таблицы PTE для всех адресатных пространств одновременно работающих процессов разом по твоему?

И ещё раз и ещё раз: LDT не адресует PTE! Разберись с матчастью.

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

PD>>Это уже чистая фантазия.
m2l>Исходный код выше. Любой отладчик ядра для Windows, благо в наше время с этим всё просто.

Ну вот и примени его...

m2l>Ты же сам блин ссылаешься, у тебя под рисунком про AWE написано !?! Обычный прикладной интерфейс, к примеру SQL Server умеет им пользоваться. — Ну твоя же ссылка, вот прямо твой рисунок, ну прочитай один абзац текста.

m2l>Та же 48-битная адресация — берешь 32-битную Windows и запускаешь в ней отдельные процессы жрущие память. Каждый по отдельности — не более 2 Гб (3 при настройке параметров загрузки). А все вмести — начнут свопится только когда физическая память закончится. Windows с помощью этой адресации 2 ГБ памяти каждого процесса раскидает и на 4 и на 24 и на 48 гигабайт физической памяти. Нет тут никаких отказов ни от каких моделей — это совершенно штатные вещи.

И всё это через DAT (в терминах Intel в их SDM — paging, том 3 глава 4), а не через сегментацию (она отдельно рассмотрена, глава 5).
Re[10]: история персональной ВТ
Здравствуйте, m2l, Вы писали:

PD>>Я с этим и не спорю, это верно. Вот только фактически все элементы LDT/GDT и в Windows, и в Linux настроены так, что база у низ 0, а лимит 4 Г. В принципе LDT и GDT могли бы иметь сегменты любого размера <4Гб и с базой от 0 до 4Г. В плоской же модели (flat) используется лишь вариант с 0 и 4 Г соответственно. Это и есть то, что я назвал обнулением. Конечно, LDT/GDT и сегментные регистры (Cs, DS...) никуда не делись, но поскольку каждый сегментный регистр показывает на элемент LDT/GDT с нулевой базой, то


m2l>Можно, я не буду запускать отладчик и делать дамп gdt/ldt, а просто спрошу — откуда ты это взял?


Нельзя. Запусти и посмотри.

m2l>GDT — указывает на PTE общие для всех процессов, LDT — указывает на таблицы PTE адресующие виртуальное адресатное пространство самого процесса.


LDT не может в принципе указывать на таблицы paging DAT. В x86 это так не работает.
LDT используется для двух вещей:
1. Селектор в таблице имеет указание разрядности исполняемой задачи (16 или 32, 32 или 64).
2. FS и/или GS указывают на блок данных текущей нити, в котором или напрямую, или указатели на thread-local data.

Причём в 64-битном режиме остаётся только первое.

PD>>Это, скажем так, не вполне верно. Кольца остались, конечно, вот только 4 кольца механизма LDT/GDT проецируются на 2 режима механизма User/Supervisor. А именно, 3 кольцо есть User, все остальное — Supervisor. Но поскольку реально кольца 1 и 2 не использовались никогда, это никого не беспокоило тоже никогда, и все считают, что 0 — это Supervisor, 3- это User, а про 1 и 2 никто и не вспоминает.


m2l>Ты путаешь два совершенно разных механизма. Двухбитный DPL дошел до наших с четырьмя уровнями защиты. И он задаётся дескрипторами GDT/LDT. Тот бит в PTE о котором устанавливает флаг, доступности страницы только для супервизора DPL=0. И он дополняет механику четырех колец защиты тем что запрещает "обратное чтение".


Верно. Но так как это в page table entry, никакой связи с GDT/LDT у него нет.

m2l>Я про это и говорю. Системная часть — адресуется через GDT, пользовательское адресатное пространство через LDT.


Нет, основные ОС это не используют. В них вся защита в механизме paging DAT по правам доступа к страницам.

PD>>А LDT вообще одна, я уже объяснил, как она используется.

m2l>Ага, особенно на многоядерных машинах LDT одна. Адресующая одни и те же таблицы PTE для всех адресатных пространств одновременно работающих процессов разом по твоему?

И ещё раз и ещё раз: LDT не адресует PTE! Разберись с матчастью.

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

PD>>Это уже чистая фантазия.
m2l>Исходный код выше. Любой отладчик ядра для Windows, благо в наше время с этим всё просто.

Ну вот и примени его...

m2l>Ты же сам блин ссылаешься, у тебя под рисунком про AWE написано !?! Обычный прикладной интерфейс, к примеру SQL Server умеет им пользоваться. — Ну твоя же ссылка, вот прямо твой рисунок, ну прочитай один абзац текста.

m2l>Та же 48-битная адресация — берешь 32-битную Windows и запускаешь в ней отдельные процессы жрущие память. Каждый по отдельности — не более 2 Гб (3 при настройке параметров загрузки). А все вмести — начнут свопится только когда физическая память закончится. Windows с помощью этой адресации 2 ГБ памяти каждого процесса раскидает и на 4 и на 24 и на 48 гигабайт физической памяти. Нет тут никаких отказов ни от каких моделей — это совершенно штатные вещи.

И всё это через paging DAT (Intel SDM — том 3 глава 4), а не через сегментацию (она отдельно рассмотрена, глава 5).