Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.014 c
5-1116963546
w666w
2005-05-24 23:39
2005.12.18
Как в TListItem отрисовать TSpinEdit?


2-1133761215
Nemiroff
2005-12-05 08:40
2005.12.18
Размеры окна при разворачивании


14-1132901183
Ega23
2005-11-25 09:46
2005.12.18
С днем рождения! 25 ноября


2-1133341792
kizam
2005-11-30 12:09
2005.12.18
TButton


1-1132324649
_Sergey_
2005-11-18 17:37
2005.12.18
Узнать размер файла, если известен путь к нему





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский