2009-07-07 1 views
1

Я читал несколько статей о сети относительно Vtable thunks, и я где-то читал, что thunks можно использовать для вызова/вызова процедур.Использование v-table thunks для вызова процедур цепочки

Возможно ли это?

Кто-нибудь знает, как это работает, также я не могу найти хороший ресурс, объясняющий thunks. Любые предложения для этого?

+0

Не могли бы вы прояснить свой вопрос? На данный момент, вместе с вашими комментариями, это выглядит так: «Расскажите мне обо всем, что связано с thunks», что немного ... широкое. – peterchen

ответ

3

Реализация сырого сундука в стиле v-table thunks - последнее средство. Скорее всего, все, что вам нужно для достижения, может быть достигнуто с помощью функции обертки, и это будет гораздо менее болезненным.

В общем, преобразователь выполняет следующие функции:

  1. Исправить входные параметры (например, преобразовывать в другой формат)
  2. вызовов реальное осуществление
  3. Очистка шаг 1/исправить выходные параметры

чтобы увидеть пример того, как это работает, давайте обратимся к нашему хорошему другу Raymond Chen и его обсуждение регулировочных санков:

http://blogs.msdn.com/oldnewthing/archive/2004/02/06/68695.aspx

преобразователь он использовал следующим образом:

[thunk]:CSample::QueryInterface`adjustor{4}': 
    sub  DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl) 
    jmp  CSample::QueryInterface 

Как он описывает, у вас есть класс, который реализует те же методы через несколько интерфейсов, поэтому он имеет несколько V-таблиц. (Если вы не знаете COM, все, что вам нужно знать, это то, что он напрямую работает с v-таблицами, поэтому указатель на определенный интерфейс должен содержать указатели на все методы этого интерфейса в порядке.)

Если вы реализуете два интерфейса с различными методами в определенном слоте, вам нужно несколько v-таблиц. Но вы только пишете перекрывающиеся методы один раз, так что метод должен иметь возможность работать с обоими «этими» указателями.Для этого компилятор генерирует метод, необходимый для исправления, и вызывает исходную реализацию.

Таким образом, это делает преобразователь следующие шаги:

  1. Исправить входные параметры, а именно скрытый «это» указатель, в первой строке.
  2. Вызовите реальную реализацию во второй строке.
  3. Cleanup: нет необходимости (см ниже)

Это где jmp инструкция поставляется в норме, если вы должны были вызвать функцию с помощью call, он вернется к вам, и вы должны были бы. ret обратно к вашему абоненту. Поскольку нет никакой очистки, компилятор делает оптимизацию, где он перемещает выполнение прямо к реальной реализации, и давайте возвращаем оператор реальной реализации к вашим вызывающим абонентам. Это только оптимизация, а не фундаментальная часть thunking. Например, 16/32-битные thunks преобразуют входные/выходные параметры между 16 и 32 битами по мере необходимости, поэтому он не может пропустить этап очистки; он должен быть call, а не jmp.

Мораль этой истории: если вам нужно что-то сделать, например, оптимизацию jmp, которую вы не можете написать непосредственно на C++ или на другом языке высокого уровня по выбору, продолжайте и напишите язык ассемблера , В противном случае просто напишите обертку и сделайте это.

Честно говоря, похоже, что вы просите оптимизацию производительности, и большую часть времени (1) компилятор лучше оптимизирует, чем мы думаем, и (2) он не даст вам такого большого улучшения как ты думаешь.

0

Ну, вы читаете, что thunks - это решение, и теперь вы ищете проблему для решения?

Thunks, как правило, являются короткими функциями «пересылки», которые обеспечивают незначительные - обычно жестко закодированные - корректировки.

Наконечники VTable очень хорошо объясняются в wikipedia на данный момент. Они используют общий шаблон: генерируют небольшую функцию, чтобы избежать вычисления/дополнительной работы во время выполнения.

Другим мест, которые я видел б/у санков:

ассоциирования дескриптора окна с объектом окна: для каждого окна, чтобы быть подклассов, небольшой преобразователь генерируется на лета, которая вызывает оконную процедуру с объектом ссылка, то затем используется в качестве оконной процедуры.

Delay Загрузка DLL: thunk гарантирует, что DLL загружается при первой вызове функции.

Ловушка вызова COM-интерфейса: thunks обеспечивают точку впрыска для диагностики и переходят к реальному методу.

+0

Не могли бы вы указать мне ресурсы/ссылки, которые могут показать пример, выполняющий все это с помощью thunks, если они есть? – anand

+0

Для оконных процедур см. Раздел ATL по адресу http://web.archive.org/web/20051125022758/www.rpi.edu/~pudeyo/articles/wndproc/ (ATL использует thunks для достижения этого.) – Tadmas

Смежные вопросы