кто нибудь может объяснить механизм работы Windows'a с LDT и GDT? (Global Descriptor Table, Local Descriptor Table) содержимое таблицы LDT - дескрипторы сегментов, содержимое GDT кроме всего прочего - дескрипторы сегментов в которых содержатся LDT. возникает вопрос, каким образом это все взаимодействует. то есть вот поток загрузился и откуда то получает свой LDT? В LDT какого рода сегменты описаны, сегменты кода например или сегменты данных или и то и другое? Кроме того используются селекторы, как их приминять я вроде бы понял, но общего смысла и взаимодействия все равно не понял! Например на этом рисунке видно как происходит преобразование адреса в физический адрес, На рисунке понятно как все происходит. Но это всего лишь маленькая часть всего механизма, описание которого я пока что не нашел! Также не понятно начиная скажем с самого начала - поток загрузился на исполнение, Понятно что процессор начинает исполнять исполняемый код этого потока один за другим, но если посмотреть более глубоко, то все размыто. где например хранятся (см рисунок) Каталоги таблицы при преобразовании в физический адрес?
Итак, приступим Local Descriptor Table Windows не использует. Для запуска ядра достаточно создать две записи в GDT: код на 0 кольце и данные на 0 кольце. Собственно 0 - не используется, 1 - код, 2 - данные. Для запуска приложений нада чтобы окромя етих 2 записей есчё 2 - для кода и данных 3 кольца(запись 3-4). Собственно на них ссылаются селекторы 0x0008 - code kernel, 0x0010 - data kernel, 0x001A - code user, 0x0023 - data user. Теперь поговорим о страничке. В CR3 записывается физический адрес директории страниц. Каждая запись в директории страниц указывает на физический адрес таблицы страниц. Ну и уже в записях таблицы страниц хранится запись об физическом адресе нужной нам страницы. Если к этому адресу добавить смещение - получим нужный нам адрес. Я понимаю что с этого краткого объяснения у тебя появилось больше вопросов чем ответов по этому пишы если чего в личку, с удовольствием отвечу.
Старт потока это не самое начало. Это, так сказать, кульминация. Перед этим происходит много подготовительной работы. Веделение памяти, настройка этих самых таблиц и многое другое.
Про gdt, ldt, аппаратные pte, можно почитать цикл статей broken sword'а (есть на этом сайте), gloomy aka петр косых, раздел "менеджер памяти и процессы", про программные пте описано в статье Great'а "Управление памятью в виндоус хп"(а этом сайте) физические страницы на которых будут размещатся каталоги и таблицы заранее неизвестны, а вот проецируются они на диапазон 0хc0000000 - 0xc03fffff виртуальных адресов я бы порекомендовал слить wrk, скомпилить ядро, поставить все это дело на вм и использовать windbg для отладки, и смотреть в сторону структур _KPCR, _KPRCB, _EPROCESS, _ETHREAD, _KPROCESS, _KTHREAD, отлаживать поток холостого хода KiIdleLoop, смотреть как в нем происходит диспетчеризация и переключение потоков, а также процедуры планировщика типа KiReadyThread(), KiSwapThread(), KiExitDispatcher() до которых сам я еще не добрался