Маркеры ядра были статическим механизмом поддержки инструментирования ядра для исходного кода ядра Linux , позволяя специальным инструментам, таким как LTTng [1] или SystemTap [2], отслеживать информацию , предоставленную этими точками зондирования. Маркеры ядра объявлялись в коде ядра однострочными выражениями в форме:
trace_mark ( имя , строка_формата , ...);
Где name — уникальное имя маркера, а format_string описывает типы остальных аргументов.
Маркер может быть включен или выключен в зависимости от того, подключен ли к нему зонд или нет. Код, который хочет подключиться к точке трассировки, сначала вызывает:
int marker_probe_register ( const char * name , const char * format_string , marker_probe_func * probe , void * pdata );
для регистрации обратного вызова зонда с точкой маркера ( pdata — это частное значение данных, которое код хочет передать зонду ) . Позже зонд включается и выключается с помощью:
int marker_arm ( const char * name ); int marker_disarm ( const char * name );
Использование маркеров имеет незначительные накладные расходы, отчасти благодаря Immediate Values [ 3], другому механизму поддержки, который встраивает переключатели в код, которые можно динамически включать и выключать, не используя ссылку на память и, таким образом, экономя строки кэша. [4]
Первоначальным мотивом создания этой статической инфраструктуры инструментирования были большие накладные расходы на производительность, вызванные предшествующим динамическим механизмом инструментирования Kprobe , который зависит от точек останова . Статическое инструментирование также может легче пережить изменения исходного кода, поскольку маркеры находятся в исходном коде.
Kernel Markers в основном состояли из макроса предварительной обработки C , который добавлял в инструментированную функцию ветвь по вызову функции . При этом ни настройка стека , ни вызов функции не выполняются, когда инструментирование не включено. Идентифицируя ветвь, выполняющую настройку стека и вызов функции как (используя встроенный gcc ), компилятору дается подсказка расположить инструкции трассировки вдали от строк кэша, задействованных в стандартном выполнении ядра. [5]unlikely
expect()
Были выявлены два недостатка маркеров ядра [5], которые привели к их замене на Tracepoints :
Набор исправлений, реализующий их, был объединен в версию 2.6.24, [6], которая была выпущена 24 января 2008 года. Для решения проблем, связанных с маркерами ядра, Матье Деснойе, их изначальный автор, реализовал более простую и более типобезопасную версию статических точек зондирования под названием Tracepoints . Набор исправлений, реализующий Tracepoints, был объединен в версию 2.6.28, [7], которая была выпущена 25 декабря 2008 года. Начиная с этого момента, маркеры ядра постепенно удалялись из исходников ядра и в конечном итоге были полностью удалены в ядре Linux 2.6.32, [8] [9], которое было выпущено 3 декабря 2009 года.