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

Сообщение Re[8]: история персональной ВТ от 20.01.2022 9:30

Изменено 20.01.2022 9:57 Pavel Dvorkin

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

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

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

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

CS16:OFF32 -> LDT/GDT -> OFS32

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



PD>>Кстати, кое-что от PM-16 утеряли. Вместо 4 колец реально осталось 2 — User/Supervisor, там один лишь бит в PTE. Но это никого не огорчило — колец 1 и 2 никогда реально и не было. Как, впрочем, и задач в смысле 80286 с их переключением средствами самого процессора с переключением LDT. И сама идея иметь одну GDT и много LDT под каждую задачу тоже нигде не использовалась — в Windows 3.x все задачи Windows сидели в одной LDT и переключались средствами Windows, а не процессора.

m2l>Нет.
m2l>* Бит в PTE определяет кому страница принадлежит — программе или операционной системе, это немного другой механизм. Разделения на 4-ре кольца (в современных, учитывая SMM можно считать что и больше) так и осталось.
m2l>* Байка о двух режимах идет от Windows NT, которая изначально разрабатывалась ещё под процессоры DEC и Alpha — а в одном из них защищенный режим (его не Intel придумал, а сделал аналог уже существовавших решений) был ограничен как-раз двумя уровнями. Отсюда и взялась эта унификация, когда всю систему уложили в 0 и 3 кольца. И то, спроектировано ядро так, что те-же драйверы устройств, изначально можно было вынести в ring 1 или ring 2. Эти элементы микроядра небыли использованы по большей мере из-за падения производительности.

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


m2l>* Сама идея одной GDT и многих LDT вполне себе живёт по сей день и в Windows и в Linux. Где ядро и драйверы работают в общем для всей остальной системы адресатном пространстве, а прикладные приложения в другой его части.


Бог с тобой. Тут ты просто не разбираешься. Все в одном АП. Старшая часть (от 0x80000000 стандартно) отводится ядру, младшая — пользовательской части

https://royallib.com/read/russinovich_mark/1vnutrennee_ustroystvo_Windows_gl_1_4.html#0

см. рис 1.4

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


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


Это уже чистая фантазия.

m2l>Насчет Windows 3.x ничего не скажу — не знаю.


PD>>Более того. В какой-то момент в 2000-е годы хотели вообще LDT/GDT исключить. Но тут оказалось, что без них нельзя сделать виртуальные машины — каждой нужно свое пространство. В общем, нашлось им в конце концов применение.

m2l>На них завязано переключение задач. Я не знаю кто хотел отказаться и т.д. Но ты по ходу что-то с чем-то путаешь.


PD>>Источников сколько хочешь.


PD>>https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D1%89%D0%B8%D1%89%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC

PD>>https://ru.wikipedia.org/wiki/Intel_80386
m2l>Там нет ни слова об отказе от GDT/LDT, их использования для виртуальных машин или ещё-чем то подобном. Наоборот, описывается как они используются для трансляции адресов.

m2l>PS. ИМХО ты не совсем понимаешь всю гибкость защищенного режима. Разнесение адресации на GDT/LDT/PTE позволяет допустим отправлять в своп куски памяти с неиспользуемыми сейчас фрагментами PTE/LDT. Разнесение GDT/LDT позволяет делать общее для всех программ адресатное пространство, без дополнительных действий для его поддержания (для Windows и Linux в нём находится ядро, драйверы, DMA и всё что относится к ядру). Применение раздельных LDT позволяет делать для двух процессов общую область памяти, которая у каждого отображена в свои адреса. И таких фишек — очень много. AMD когда делала x64-86 не просто так сохранила большую часть аспектов этой работы для long mode — им просто сложно найти адекватную замену.


Все верно. Позволяет. Более того, он позволяет адресовать до 2^48 в 32-битном процессоре, разумеется, при отказе от flat-модели. Просто потому что SEG16:OFFS32 — это 48 бит.
Вот только пока речи не идет о виртуальных машинах, все эти возможности не используются. Ни несколько LDT (все дескрипторы в одной LDT и все настроены на flat), ни переключение задач в смысле 80286 (это вообще, кажется, нигде не использовалось, а переключение проессов идет через CR3 страничного механизма.
Re[8]: история персональной ВТ
Здравствуйте, m2l, Вы писали:

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

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

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

CS16:OFF32 -> LDT/GDT -> OFS32

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



PD>>Кстати, кое-что от PM-16 утеряли. Вместо 4 колец реально осталось 2 — User/Supervisor, там один лишь бит в PTE. Но это никого не огорчило — колец 1 и 2 никогда реально и не было. Как, впрочем, и задач в смысле 80286 с их переключением средствами самого процессора с переключением LDT. И сама идея иметь одну GDT и много LDT под каждую задачу тоже нигде не использовалась — в Windows 3.x все задачи Windows сидели в одной LDT и переключались средствами Windows, а не процессора.

m2l>Нет.
m2l>* Бит в PTE определяет кому страница принадлежит — программе или операционной системе, это немного другой механизм. Разделения на 4-ре кольца (в современных, учитывая SMM можно считать что и больше) так и осталось.
m2l>* Байка о двух режимах идет от Windows NT, которая изначально разрабатывалась ещё под процессоры DEC и Alpha — а в одном из них защищенный режим (его не Intel придумал, а сделал аналог уже существовавших решений) был ограничен как-раз двумя уровнями. Отсюда и взялась эта унификация, когда всю систему уложили в 0 и 3 кольца. И то, спроектировано ядро так, что те-же драйверы устройств, изначально можно было вынести в ring 1 или ring 2. Эти элементы микроядра небыли использованы по большей мере из-за падения производительности.

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


m2l>* Сама идея одной GDT и многих LDT вполне себе живёт по сей день и в Windows и в Linux. Где ядро и драйверы работают в общем для всей остальной системы адресатном пространстве, а прикладные приложения в другой его части.


Бог с тобой. Тут ты просто не разбираешься. Все в одном АП. Старшая часть (от 0x80000000 стандартно) отводится ядру, младшая — пользовательской части

https://royallib.com/read/russinovich_mark/1vnutrennee_ustroystvo_Windows_gl_1_4.html#0

см. рис 1.4

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


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


Это уже чистая фантазия.

m2l>Насчет Windows 3.x ничего не скажу — не знаю.


PD>>Более того. В какой-то момент в 2000-е годы хотели вообще LDT/GDT исключить. Но тут оказалось, что без них нельзя сделать виртуальные машины — каждой нужно свое пространство. В общем, нашлось им в конце концов применение.

m2l>На них завязано переключение задач. Я не знаю кто хотел отказаться и т.д. Но ты по ходу что-то с чем-то путаешь.


PD>>Источников сколько хочешь.


PD>>https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D1%89%D0%B8%D1%89%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC

PD>>https://ru.wikipedia.org/wiki/Intel_80386
m2l>Там нет ни слова об отказе от GDT/LDT, их использования для виртуальных машин или ещё-чем то подобном. Наоборот, описывается как они используются для трансляции адресов.

m2l>PS. ИМХО ты не совсем понимаешь всю гибкость защищенного режима. Разнесение адресации на GDT/LDT/PTE позволяет допустим отправлять в своп куски памяти с неиспользуемыми сейчас фрагментами PTE/LDT. Разнесение GDT/LDT позволяет делать общее для всех программ адресатное пространство, без дополнительных действий для его поддержания (для Windows и Linux в нём находится ядро, драйверы, DMA и всё что относится к ядру). Применение раздельных LDT позволяет делать для двух процессов общую область памяти, которая у каждого отображена в свои адреса. И таких фишек — очень много. AMD когда делала x64-86 не просто так сохранила большую часть аспектов этой работы для long mode — им просто сложно найти адекватную замену.


Все верно. Позволяет. Более того, он позволяет адресовать до 2^48 в 32-битном процессоре, разумеется, при отказе от flat-модели. Просто потому что SEG16:OFFS32 — это 48 бит.
Вот только пока речи не идет о виртуальных машинах, все эти возможности не используются. Ни несколько LDT (все дескрипторы в одной LDT и все настроены на flat), ни переключение задач в смысле 80286 (это вообще, кажется, нигде не использовалось, а переключение процессов идет через CR3 страничного механизма.