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

Discussion in 'WASM.BEGINNERS' started by yerhikus, Nov 5, 2008.

  1. yerhikus

    yerhikus New Member

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

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

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

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

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

    Blog Posts:
    0
    Joined:
    Dec 6, 2006
    Messages:
    302
    Location:
    г. Харьков
    Итак, приступим:)
    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 Павел

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    rudik
    Коммент: по дефолту не использует. Но может. См. ZwSetLdtEntries.
     
  5. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    а не 0х1b?

    или ZwSetInformationProcess
     
  6. rudik

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

    Blog Posts:
    0
    Joined:
    Dec 6, 2006
    Messages:
    302
    Location:
    г. Харьков
    Freeman
    0x18+3 = 0x1b, тупанул, ошибка принимается, спасибо.
     
  7. defaultplayer

    defaultplayer New Member

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


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

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