Форум: "KOL";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Внизнужна необычная обработка исключений для collapse Найти похожие ветки
← →
Владимир Кладов (2005-03-12 20:43) [0]кто-нибудь разбирался глубоко в обработке исключений на самом нижнем уровне? мне нужно вот что: научиться по исключению в обработчике вернуть управление на следующую команду. Команда, вызывающая исключение - некоторая 1-байтовая машинная инструкция, фиксированная, но любая. Хоть int 3 (не очень хорошо), а лучше например HLT ($F4 кажется). Для collapse надо, чтобы переход к выполнению P-кода занимал всего 1 байт, а не 5, иначе овчинка дороговата...
Т.е. на самом деле надо чтобы стек был в той же позиции, что и при исключении, и все регистры те же, но я мог бы смоделировать вызов некоторой подпрограммы, как если бы call сработал. Можно направить меня куда-нибудь, где ответ знают.
Другой вариант решения - "начать отладку" процесса, ловить событие соответствующее. Правда, в этой области я еще ничего не знаю, не знаю даже получится ли вообще процессу начать отладку самого себя...
← →
thaddy (2005-03-12 21:07) [1]Maybe a look at the X86 compiler core from Freepascal would help?
← →
thaddy (2005-03-13 04:50) [2]I only know that after a halt the only instructions that can re-enable the processor are an enabled interrupt, a debug exception $33 and the RESET, BINIT and INIT operands. Look at how FASM handles this in its exception examples. The author is very helpfull and knowledgable on this subject
← →
Владимир Кладов (2005-03-13 16:45) [3]в примерах для FASM ничего не нашел. Есть что-то для MASM32, но там используется SEH. В Delphi это не помогает, здесь на SEH накладывается куча мала всего. В итоге я могу проверить в обработчике EXCEPT, что действительно сработала "неверная" команда по некоторому адресу. Но никак не получается передвинуть Eip в CONTEXT-е (и даже непонятно точно, где этот самый контекст располагается, т.е. передвинуть можно, но эффекта это не дает). Финальный вопрос - как же все-таки заставить систему поверить, что действительно обработка завершена, и надо просто восстановить контекст, и продолжить выполнение со следующего байта. Уже второй день бьюсь, без результата :(
← →
thaddy (2005-03-13 17:28) [4]did you possibly overlook the caching mechanism? I mean wbinvd can write back the cache changes to memory which would restore proper state maybe? I didn't try this because I have no use for such lowlevel things. I suggest you contact Tomasz Grysztar. He maybe able to help.
← →
thaddy (2005-03-13 17:31) [5]did you possibly overlook the caching mechanism? I mean wbinvd can write back the cache changes to memory which would restore proper state maybe? I didn't try this because I have no use for such lowlevel things. I suggest you contact Tomasz Grysztar. He maybe able to help.
← →
Владимир Кладов (2005-03-13 19:59) [6]Все, я управился :)
procedure EmulatePCode;
asm
end;
var Collapse_OldHandler: Pointer;
procedure Collapse_Handler;
asm
mov edx, [esp+12] // edx = @ Context
mov ecx, [edx].TContext.Eip
cmp byte ptr [ecx], $F4
je @@collapse_F4
jmp dword ptr [Collapse_OldHandler]
@@collapse_F4:
{$IFDEF JUSTSKIP_PRIVILEGE}
inc dword ptr [edx].TContext.Eip
{$ELSE}
mov ecx, [edx].TContext.Eip
inc ecx
mov eax, dword ptr [edx].TContext._Esp
sub eax, 4
mov dword ptr [edx].TContext._Esp, eax
mov [eax], ecx
lea ecx, [EmulatePCode]
mov [edx].TContext.Eip, ecx
{$ENDIF}
xor eax, eax // "ïðîäîëæèòü"
end;
procedure InstallCollapse;
asm
xor eax, eax
mov edx, fs:[eax]
mov ecx, [edx+4]
mov [Collapse_OldHandler], ecx
lea ecx, [Collapse_Handler]
mov [edx+4], ecx
end;
This code allows to start emulating P-code each time when F4 occure in the code... Just from the next byte P-procedure header can start. No more 5-bytes <call EmulatePCode>, economy is about 4*N bytes, where N = number of Pascal (or Assembler) procedures/functions/methods rewritten to P-code. This method is not fast since exceptions are used, but if P-procedure is called from another P-procedure, the emulator itself can check if F4 code is there and in such case simulate <call EmulatePCode> as needed, so no exception will be in such case, only when P-procedure is called from the usual code...
← →
Владимир Кладов (2005-03-13 20:09) [7]Забыл добавить:
InstallCollapse должно быть вызвано как можно раньше, до первого try-finally/except и до первого возможного обращения к П-коду (возможно, даже некоторые процедуры из System будут перекроены на новый лад, так что может быть в initialization в system.pas придется тогда добавлять). Этим же манером возможно установить глобальный обработчик какого-либо типа ошибок. Например, вместо того, чтобы во всяком подозрительном месте отлавливать деление на 0 через свой собственный try-except, можно прямо в этом месте поправить делитель/делимое, и просто продолжить выполнение... И тогда отдельные try-except не нужны. И еще: Exception (класс такой) тоже не нужен, и err.pas не надо подключать, все сделано на уровне SEH, без того, что навершивает на SEH сама Delphi... Так что вооружайтесь.
Сейчас погляжу на часы, может еще обновление выложу...
← →
ECM © (2005-03-14 12:38) [8]Попробовал ... :) Вещь полезная !
Пара тонкостей, для тех кто захочет попробовать:
1) Обязательно нужна замена системных модулей (иначе не заработает)
2) Нужна коррекция модуля Windows.pas в части структуры _CONTEXT - поле Esp надо переименовать в _Esp (как Владимир и очевидно и поступил), либо заменить строки с _Esp на следующие:
mov eax, dword ptr [edx+$c4]//.TContext._Esp
sub eax, 4
mov dword ptr [edx+c4]{.TContext._Esp}, eax
... почему-то компилятор отказывается вычислять смещение с TContext.Esp, а упорно заменяет его на сам регистр ESP :(
← →
ECM © (2005-03-14 12:40) [9]З.Ы. пропустил $
mov dword ptr [edx+$c4]{.TContext._Esp}, eax
← →
Владимир Кладов (2005-03-14 15:02) [10]ничего подобного, замена системных модулей не требуется. Просто инициализация должна уже отработать когда вызывается Install. Иначе Delphi в инициализации ставит свою такую же замену (ну не совсем такую же, короче свой unwind). Если после инициализации, то заменяется Delph"овский unwind и все работает. Я еще опционально у себя добавил проверку, что еще Install не вызывался, так чтобы если 2 раза вызовут, ничего не испортить.
Проще скопировать труктуру, и код красивее получается, насчет _esp, Delphi действительно почему-то считает, что речь о регистре ESP а не о поле, хотя ему явно все написано. Дурной какой-то :)
← →
ECM © (2005-03-14 15:32) [11]>Владимир Кладов (14.03.05 15:02) [10]
>ничего подобного, замена системных модулей не требуется.
Действительно, первый раз (без замены) поставил Install первым
и все затиралось ... :)
Смотрю сейчас такой момент (пока ничего не нашел):
А есть возможность в Collapse_Handler добраться до кода исключения? (например для AV - $c0000005)
← →
Владимир Кладов (2005-03-14 17:42) [12]конечно, первый параметр - указатель на структуру TExceptionRecord. Мне нужен был только третий - указатель на TContext.
← →
ECM © (2005-03-14 18:07) [13]Владимир Кладов (14.03.05 17:42) [12]
конечно, первый параметр
Tnx - уже нашел ... :)
← →
Владимир Кладов (2005-03-22 20:46) [14]коллапс постепенно продвигается к реализации. Уже практически готов компилятор, на этот раз - не standalone, а для компиляции вставок на П-коде, написанных вручную и сгенеренных. Для генерации - первый кандидат: инициализация форм в MCK. MCK несложно доработать, чтобы он заодно и П-код генерил.
Это я к сведению, чтобы народ знал, чем я занимаюсь.
← →
thaddy (2005-03-24 06:53) [15]Vladimir,
I wish you luck with collapse, it is very promising...
Would it be possible to support sse,sse2, sse3 and Amd 3dNow flavors from collapse? ( to optimize media based on processor test, not for size)?
Thaddy
← →
Владимир Кладов (2005-03-24 18:59) [16]collapse is not an assembler or machine code. It is 2-stack P-machine with is own emulator (280..550 bytes of code). It just to make some things with much smaller code but not faster, otherwise very slow (but I hope this will not be determined by users in many cases).
← →
thaddy (2005-03-24 19:31) [17]Aha!, dot KOL .kol :)
← →
ECM © (2005-03-24 19:39) [18]Наверное еще бОльшие потери производительности получаться если в программе будет часть обычного и часть P-кода... :(
← →
ECM © (2005-03-24 19:55) [19]З.Ы. Я имел ввиду частое переключение между обычным и P-кодом...
← →
Владимир Кладов (2005-03-24 20:10) [20]оно так и будет. Но я рассчитываю, что потери будут незначительные. Во-первых большую часть работает API, и программа просто ждет когда отработает функция API или придет сообщение. Во-вторых в первую очередь будут П-кодироваться инициализация форм. Это сэкономит код, который затрачивается на эту нужную, но одноразовую процедуру, особенно на формах с большим количеством контролов и настроек. Заодно можно и создание окна в самом KOL.pas заП-кодировать, там большая скорость не требуется.
← →
Yhrik! (2005-03-30 06:47) [21]Мультиплатформа под Collapse, даже не планируется?
Идея-то хорошая
← →
Владимир Кладов (2005-03-30 17:14) [22]вообще-то если удастся (позже) сделать компилятор паскаль->П-код, то компилятор П-код->ассемблер уже есть, и подойдет и к free-pascal. Но все равно на платформе PC. Сейчас я сделал что MCK генерит П-код, это не сложнее чем генерить паскаль-код. А там посмотрю что получится.
← →
alexa (2005-03-31 04:24) [23]а то что получилось, гдето скачать можно?
← →
Владимир Кладов (2005-03-31 16:24) [24]нет еще но скоро будет. Я сейчас отладчик переделываю. Да, можно скачать версию standalone http://bonanzas.rinet.ru/collapse.zip, она не многим отличается.
← →
Владимир Кладов (2005-03-31 16:26) [25]http://bonanzas.rinet.ru/Collapse.zip
← →
DeimosX7 © (2005-04-18 11:23) [26]Кстати, для желающих получше понять обработку исключений рекоммендую посмотреть тут : http://wasm.ru/article.php?article=GordonExcept
не скажу, что что-то новое, но объяснено достаточно подробно..
← →
alexa (2005-04-27 04:45) [27]Уже что то получилось по collapse ? страсть как интересно.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.017 c