Вызов внешних функций из виртуальной машины
От: nen777w  
Дата: 15.12.08 13:32
Оценка:
Озадачился тут вопросом. Как происходит вызов внешних функций из виртуальной машины Java или C# или ещё чего то.
Ситуация мне видится так.
При инициализаци виртуальной машины и передачи байткода в неё происходит инициализация некоторой таблицы внешних функций, состоящей из указателя на функцию общего вида типа:
typedef void (*lpfn_general)(void);

и какого то описателя. Описывающего к какому виду эту функцию нужно привести внтури кода виртуальной машины выполняющей вызов внешней функции.

Остается непонятно одно, как это привидение в виртуальной машины происходит?
Если например описатель функции будет некий enum типа такого который используется в MFC в картах сообщений. Т.е.

enum fn_type {
  fnt_Rv_Pv //void (*fn)(void)
 ,fnt_Rv_Pi //void (*fn)(int)
 ,fnt_Ri_Pui //int (*fn)(unsigned int)
};


то это приведёт к тому что мы упрёмся в невозможность описать все возможные варианты и понтяно что это решение тупиковое. Как же тогда записывается описатель функции и происходит привидение в динамике, если конечно я правильно представил что вызов таких функций происходит через таблицы?

Спасибо.
Re: Вызов внешних функций из виртуальной машины
От: Clinch  
Дата: 15.12.08 14:13
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Озадачился тут вопросом. Как происходит вызов внешних функций из виртуальной машины Java или C# или ещё чего то.

N>Ситуация мне видится так.
N>При инициализаци виртуальной машины и передачи байткода в неё происходит инициализация некоторой таблицы внешних функций, состоящей из указателя на функцию общего вида типа:
N>
N>typedef void (*lpfn_general)(void);
N>

N>и какого то описателя. Описывающего к какому виду эту функцию нужно привести внтури кода виртуальной машины выполняющей вызов внешней функции.

N>Остается непонятно одно, как это привидение в виртуальной машины происходит?

N>Если например описатель функции будет некий enum типа такого который используется в MFC в картах сообщений. Т.е.

N>
N>enum fn_type {
N>  fnt_Rv_Pv //void (*fn)(void)
N> ,fnt_Rv_Pi //void (*fn)(int)
N> ,fnt_Ri_Pui //int (*fn)(unsigned int)
N>};
N>


N>то это приведёт к тому что мы упрёмся в невозможность описать все возможные варианты и понтяно что это решение тупиковое. Как же тогда записывается описатель функции и происходит привидение в динамике, если конечно я правильно представил что вызов таких функций происходит через таблицы?


N>Спасибо.


зачем далеко ходить, посмотрите связку С — Java vm ?
Re[2]: Вызов внешних функций из виртуальной машины
От: nen777w  
Дата: 15.12.08 15:16
Оценка:
C>зачем далеко ходить, посмотрите связку С — Java vm ?
Очень долго и неудобно рыться в исходниках JVM не зная проекта и где искать. Это крайняя мера.
Я надеялся получить общий приём/подход не выходящий за границы языка С.
Re: Вызов внешних функций из виртуальной машины
От: Ovl Россия  
Дата: 15.12.08 16:13
Оценка:
чаще список аргументов отделен от вызова.

то есть:
1) сохраняем список аргументов (в списке, в стеке, в выделенной памяти)
2) созраняем имя функции (например там же)
3) делаем "системное прерывание"

в ответ внешняя функция самы вытаскивает аргументы, которые её передали.
если используется переходник, то он располагает аргументы в стеке как нужно и делает naked call конечной функции.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.