Ядерная обработка исключений

Тема в разделе "WASM.WIN32", создана пользователем solvitz, 13 янв 2012.

  1. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Где можно прочитать или расскажите кто-нибудь, что именно происходит в ядре с момента генерации исключения процессором и до передачи управления на KiUserExceptionDispatcher. Обычно рассмотрение этого вопроса идет только с момента передачи управления в Ring-3. А меня в частности интересует какие функции ядра используется.
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    А что именно вас интересует ?
     
  3. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Что за обработчик цепляет система в IDT и что он делает? Где происходит переход в UserMode? Что передается из ядра в UserMode по стеку?
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    KiTrapXX вектора. В общем они формируют т-фрейм(состояние камня на момент исключения) сохраняют в стек, после этого размаскируются прерывания и выполняется общая для всех векторов обработка исключений в KiDispatchException(). Между тем каждый вектор некоторые свои действия выполняет, например вызывает менеджер памяти или обслуживает NPX.
    KiDispatchException() выполняет обработку в зависимости от мода, для юзермода настраивает стек(контекст и инфу про фолт). Т-фрейм загружается в процессор при возврате из ISR обратным сохранению образом, тоесть извлекаются регистры из фрейма(он на дне стека), Ss:Esp, Cs:Eip & EFlags в последнюю очередь восстанавливаются аппаратно(Iret). В KiDispatchException() соответственно настраивается контекст(заменяется адрес инструкции на которой возник фолт на KiUserXcptDisp..() etc).
    Там всё довольно прозрачно сделано и опенсурсно.
     
  5. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Как обнаружить KiDispatchException? Где она примерно располагается? Я так понимаю функция не экспортируется? У меня WinXP SP3.
     
  6. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Да и по какому принципу назначаются вектора? По виду исключения?(#UD, #BP, #GP ...)
     
  7. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    в ворках есть все
    *совсем разленились %
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    solvitz
    У каждого исключения свой вектор. Вектора фиксированы, ядро их загружает во все IDT при запуске.

    Думаю вам пока дизасм не нужен, в дизасме сложно вначале будет разобраться. Это всё есть в сурсах. Процедура не экспортируется.

    Три модуля есть - trap.asm & kimacro.inc, это непосредственно т-процессинг, там вектора и базовые макро. exceptn.c - надстройка, которая вызывает пользовательский или ядерный диспетчер.
     
  9. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    А почему во все? IDT вроде же всего одна.

    И еще вопрос, можно ли перезаписать дескриптор шлюза в IDT чтобы переход осуществлялся на нужную мне процедуру. Допустим я хочу поставить новый обработчик на int3 (#BP), возможно ли такое?
     
  10. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    в каждой core (без HT) свой IDTR и значит может быть свое значение IDT
    стало любопытно - на практике бывают они разные?
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    solvitz
    У каждого процессора свои дескрипторные таблицы. Камни изолированы друг от друга.

    У меня P4 с двумя ядрами(HT). Работает как два процессора, на каждом своя IDT, GDT etc.

    Да, но это не делается простой загрузкой нового шлюза. ISR должна формировать т-фрейм, а он меняется в версиях. Посему необходимо каким то образом его сформировать.
     
  12. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Значит загружаю в Syser программу из одной команды:
    Код (Text):
    1. ud2
    Начинаю трейсить после исключения (#UD) выпадаю в KiUserExceptionDispatcher.NTDLL.DLL. Почему это происходит? Я же по идее должен выйти на первую команду _KiTrap06. Как мне тогда сделать, чтобы я вышел на _KiTrap06?
     
  13. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    > bpint 6
     
  14. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Malfoy
    Спасибо за помощь! Я делал вот так, но бряк не ставился:
    >idt 6
    >bpm [addr] r
    Писало: "Invalid access type!"
    Буду разбираться.
     
  15. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    solvitz
    Сиська свои ловушки ставит, нельзя ставить брейки на ловушки, будет бсодить.