Самомодифицирующийся код для трассировки? - PullRequest
3 голосов
/ 29 декабря 2010

Я ищу способ вставки хуков трассировки / логирования в какой-то очень чувствительный к производительности код драйвера.Этот материал регистрации всегда должен быть скомпилирован, но в большинстве случаев он ничего не делает (но очень быстро ничего не делает).

Нет ничего проще, чем просто иметь глобальное слово включения / выключения, делатьif(enabled){log()}.Однако, если возможно, я бы хотел избежать затрат на загрузку этого слова каждый раз, когда я нажимаю на один из моих крючков.Мне приходит в голову, что я мог бы потенциально использовать для этого самоизменяющийся код - то есть везде, где у меня есть вызов к моей функции трассировки, я перезаписываю переход с помощью NOP, когда хочу отключить хуки, и заменяю переход, когда хочучтобы включить их.

Быстрый гугл не обнаруживает никакого предшествующего уровня техники в этом - кто-нибудь делал это?Реально ли это, есть ли какие-нибудь основные камни преткновения, которые я не предвижу?

(Linux, x86_64)

Ответы [ 4 ]

4 голосов
/ 29 декабря 2010

Имеет ли значение, если ваш скомпилированный драйвер вдруг в два раза больше?

Создайте два пути кода - один с журналированием, другой без. Используйте глобальный указатель (и) функции, чтобы перейти в разделы, чувствительные к производительности, и перезаписать их соответствующим образом.

4 голосов
/ 29 декабря 2010

Да, этот метод был реализован в ядре Linux, для той же цели (отслеживание хуков).

См. статью LWN о метках перехода , чтобы узнать, как начать.

На самом деле нет никаких серьезных камней преткновения, но есть несколько второстепенных: многопоточные процессы (вам придется останавливать все другие потоки, пока вы включаете или отключаете код); некогерентный кеш инструкций (вам нужно убедиться, что I-кеш очищен на каждом ядре).

0 голосов
/ 24 января 2011

Я пишу не столько о проблеме, возможно ли это, но о том, получите ли вы что-нибудь значительное.

С одной стороны, вы не хотите проверять «включено ведение журнала» каждый раз, когда появляется возможность ведения журнала, а с другой - нужно проверять «включено ведение журнала» и перезаписывать код кодом да или без регистра , Или ваш водитель "помнит", что это был не последний раз, и поскольку в этот раз не запрашивается no, ничего не нужно делать?

Необходимая логика не кажется тривиальной по сравнению с тестированием каждый раз.

0 голосов
/ 29 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...