_WNDPROC-CODE и APIEXEC

14 messages Options
Embed this post
Permalink
Yuriy Zhilovets

_WNDPROC-CODE и APIEXEC

Reply Threaded More More options
Print post
Permalink
Добрый день всем!

Есть ли в машинном коде _WNDRPOC-CODE и APIEXEC специфичные для Виндов вещи?

Ю. Жиловец



Andrey Cherezov

Re: _WNDPROC-CODE и APIEXEC

Reply Threaded More More options
Print post
Permalink
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 16.04.2007 21:38:
> Есть ли в машинном коде _WNDRPOC-CODE и APIEXEC специфичные для Виндов вещи?
>  
Да, "паскалевское соглашение о связях": эти функции, как и Windows,
считают, что параметры
снимает со стека вызываемый. В то время как по сишной традиции (и Unix)
- вызывающий.
Сравни DLL-CALL и SO-CALL в ac/lib/ns/*-xt.f

И еще в наших API-CALL специфичные для SPF вещи: они заботятся о
сохранении регистров
(соблюдая досовую традицию), а на деле, оказывается, этого не требуется.
Т.е. работает
способ "параметры N>R api-addr EXECUTE" безо всяких оберток. Может быть
не с любыми
DLL/SO работает - но мне не встречались таковые исключения.


Yuriy Zhilovets

Re: _WNDPROC-CODE и APIEXEC

Reply Threaded More More options
Print post
Permalink
Andrey Cherezov пишет:

То есть я могу для вызова Forth -> SO делать просто параметры N>R
api-addr EXECUTE
И чистить потом стек возвратов.

А как действовать в обратную сторону, т.е. давать внешним функциям адрес
форт-Слова?

Юра



Yuriy Zhilovets

Границы сегмента

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets
Добрый день всем!

Как узнать адреса начала и конца сегмента форта (в ЦК) ?

Ю. Жиловец



Andrey Cherezov

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 17.04.2007 21:40:
> Как узнать адреса начала и конца сегмента форта (в ЦК) ?
>  
Наверное отсюда:
src\tsave.f
Там же ты сам в авторах ;)


Andrey Cherezov

Re: _WNDPROC-CODE и APIEXEC

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 17.04.2007 20:46:
> То есть я могу для вызова Forth -> SO делать просто параметры N>R
> api-addr EXECUTE
> И чистить потом стек возвратов.
>  
Да. В C-EXEC в ~ac/lib/ns/ns.f делается так, и это работает.
> А как действовать в обратную сторону, т.е. давать внешним функциям адрес
> форт-Слова?
>  
А вот тут все-таки нужен WNDPROC/CALLBACK, т.к. мы должны и сохранять
регистры
вызвавшего процесса, и инициализировать форт-окружение.

Пример работы с колбэками в юниксовом стиле вызовов см. в
~ac/lib/lin/xml/expat.f
(либа отлажена прошлым летом для XMPP/Jabber-клиента eChat, рабочая).


Yuriy Zhilovets

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
In reply to this post by Andrey Cherezov
Andrey Cherezov пишет:

>Наверное отсюда:
>src\tsave.f
>Там же ты сам в авторах ;)
>  
>
Да я там только сохранение ресурсов писал. А в остальном понять ничего
не могу :-(
ELF гораздо логичнее и проще PE.
Зато могу сформулировать: написание документации есть акт любви к людям :-)

Ю. Жиловец



Andrey Cherezov

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 19.04.2007 19:43:
> Да я там только сохранение ресурсов писал. А в остальном понять ничего не могу :-(
> ELF гораздо логичнее и проще PE.
> Зато могу сформулировать: написание документации есть акт любви к людям :-)
>  
Кстати, PE сейчас очень хорошо документирован ;) И на мой взгляд
достаточно прост.
SAVE - в исходном варианте (SPF3) всего 20 строк кода (хорошо
документированного ;).
Если ELF еще проще, то интересно, какой размер будет у ELF-SAVE :)


Yuriy Zhilovets

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
Andrey Cherezov пишет:

>SAVE - в исходном варианте (SPF3) всего 20 строк кода (хорошо
>документированного ;).
>  
>
Это же просто копирование готового файла, а не формирование его с нуля.
Поэтому о сложности формата это ничего не говорит.

Еще пара вопросов:

1) В начале spf.f написано:
\ Начало двоичного образа Форт-системы
\ в начале команда CALL подпрограммы инициализации.
\ Возврата из подпрограммы не будет - адрес на стеке
\ возвратов может использоваться для fixups.

Эти самые fixups где-то реально используются?

2) При формировании образа в ЦК выводится адрес начала: 0x524000
А с какого адреса реально грузится система при запуске?
Почему эти адреса различаются?

Ю. Жиловец


Andrey Cherezov

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 20.04.2007 18:54:
> Это же просто копирование готового файла, а не формирование его с нуля.
> Поэтому о сложности формата это ничего не говорит.
>  
Да, формирование "с нуля" длиннее, но ненамного сложнее.
Прилагаю программу формирования spf-stub - того PE-заголовка, который, с
мелкими модификациями, кочует с версии в версию spf3..spf4.
> \ Возврата из подпрограммы не будет - адрес на стеке
> \ возвратов может использоваться для fixups.
>
> Эти самые fixups где-то реально используются?
>  
По-моему, нет.
> 2) При формировании образа в ЦК выводится адрес начала: 0x524000
> А с какого адреса реально грузится система при запуске?
> Почему эти адреса различаются?
>  
Системы бывают разные... Обычно сама система виртуально расположена "во
второй половине" адресного пространства, т.е. >0x80000000,
запускаемая программа с 0x400000, её dll, стеки и хипы между этими двумя
областями. Младшие адреса тоже резервируются системой
(размер этой области сильно зависит от версии винды). Иногда между ею и
0x400000 система тоже может выделять место под хип и т.п.

Почему различаются 0x400000 и 0x524000? Потому что ЦК компилирует новую
систему после себя. И без relocations записывает.
И соответственно грузится с адреса 0x5... вместо 0x4... - системе по
барабану, лишь бы не занято было.
Исходное число 0x400000 - это пережиток от Win95, там первые 0x400000
чем-то большим заняты. А в WinNT можно и на 0x200000 (например)
загружать, по-моему.
Старые SPF'ы грузились с 0x490000, но по мере самокомпиляции съезжали в
старшие адреса вплоть до полученного тобой адреса.

В Windows CE и в Unix планировка адресного пространства иная.
WinCE и WinNT в этом различаются намного сильнее, чем Win95 и WinNT.


SPF-STUB.rar (3K) Download Attachment
Yuriy Zhilovets

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
Andrey Cherezov пишет:

> запускаемая программа с 0x400000

Тогда такой вопрос: откуда берется место под расширение словаря? Этой
секции дается большой виртуальный размер?
Если да, то сколько? В заголовке PE я этого не нашел.
Хватает ли стека (возвратов), который дает ОС, или его надо расширять
дополнительно?
Где выделяется обычный стек?

Ю. Жиловец



yGREK Heretix

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets

> Зато могу сформулировать: написание документации есть акт любви к
> людям :-)

Было бы замечательной реализацией этого акта собрать воедино все те
тайные знания про границы сегментоа, стеки итп и сложить куда-то в
docs :)

--
ygrek


attachment0 (187 bytes) Download Attachment
Yuriy Zhilovets

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
ygrek пишет:

>Было бы замечательной реализацией этого акта собрать воедино все те
>тайные знания про границы сегментоа, стеки итп и сложить куда-то в
>docs :)
>  
>
Намек понял.

Ю. Жиловец



Andrey Cherezov

Re: Границы сегмента

Reply Threaded More More options
Print post
Permalink
In reply to this post by yGREK Heretix
Добрый день, ygrek!

Ваше сообщение от 21.04.2007 20:23:
>> Зато могу сформулировать: написание документации есть акт любви к
>> людям :-)
>>    
> Было бы замечательной реализацией этого акта собрать воедино все те
> тайные знания про границы сегментоа, стеки итп и сложить куда-то в
> docs :)
>  

"Совершенномудрый [...] постоянно стремится к тому, чтобы у народа не было
знаний и страстей, а имеющие знание не смели бы действовать.
Осуществление недеяния всегда приносит спокойствие."

Представьте, что все узнают, как записывать сегменты в EXE, и начнут сами
клепать бинарники кто во что горазд. "Ужос" :)