Механихм работы LDT & GDT

Тема в разделе "WASM.BEGINNERS", создана пользователем yerhikus, 5 ноя 2008.

  1. yerhikus

    yerhikus New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2008
    Сообщения:
    1
    кто нибудь может объяснить механизм работы Windows'a с LDT и GDT? (Global Descriptor Table, Local Descriptor Table)
    содержимое таблицы LDT - дескрипторы сегментов, содержимое GDT кроме всего прочего - дескрипторы сегментов в которых содержатся LDT. возникает вопрос, каким образом это все взаимодействует. то есть вот поток загрузился и откуда то получает свой LDT?
    В LDT какого рода сегменты описаны, сегменты кода например или сегменты данных или и то и другое? Кроме того используются селекторы,
    как их приминять я вроде бы понял, но общего смысла и взаимодействия все равно не понял!

    Например на этом рисунке видно как происходит преобразование адреса в физический адрес,
    [​IMG]

    На рисунке понятно как все происходит. Но это всего лишь маленькая часть всего механизма, описание которого я пока что не нашел!

    Также не понятно начиная скажем с самого начала - поток загрузился на исполнение,
    Понятно что процессор начинает исполнять исполняемый код этого потока один за другим, но если посмотреть более глубоко, то все размыто.
    где например хранятся (см рисунок) Каталоги таблицы при преобразовании в физический адрес?
     
  2. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Итак, приступим:)
    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 записывается физический адрес директории страниц. Каждая запись в директории страниц указывает на физический адрес таблицы страниц. Ну и уже в записях таблицы страниц хранится запись об физическом адресе нужной нам страницы. Если к этому адресу добавить смещение - получим нужный нам адрес.
    Я понимаю что с этого краткого объяснения у тебя появилось больше вопросов чем ответов по этому пишы если чего в личку, с удовольствием отвечу.
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Старт потока это не самое начало. Это, так сказать, кульминация. Перед этим происходит много подготовительной работы. Веделение памяти, настройка этих самых таблиц и многое другое.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rudik
    Коммент: по дефолту не использует. Но может. См. ZwSetLdtEntries.
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а не 0х1b?

    или ZwSetInformationProcess
     
  6. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Freeman
    0x18+3 = 0x1b, тупанул, ошибка принимается, спасибо.
     
  7. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Про gdt, ldt, аппаратные pte, можно почитать цикл статей broken sword'а (есть на этом сайте), gloomy aka петр косых, раздел "менеджер памяти и процессы", про программные пте описано в статье Great'а "Управление памятью в виндоус хп"(а этом сайте)


    физические страницы на которых будут размещатся каталоги и таблицы заранее неизвестны, а вот проецируются они на диапазон 0хc0000000 - 0xc03fffff виртуальных адресов

    я бы порекомендовал слить wrk, скомпилить ядро, поставить все это дело на вм и использовать windbg для отладки, и смотреть в сторону структур _KPCR, _KPRCB, _EPROCESS, _ETHREAD, _KPROCESS, _KTHREAD, отлаживать поток холостого хода KiIdleLoop, смотреть как в нем происходит диспетчеризация и переключение потоков, а также процедуры планировщика типа KiReadyThread(), KiSwapThread(), KiExitDispatcher() до которых сам я еще не добрался