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