Маркер ядра

Маркеры ядра были статическим механизмом поддержки инструментирования ядра для исходного кода ядра 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]unlikelyexpect()

Были выявлены два недостатка маркеров ядра [5], которые привели к их замене на Tracepoints :

  • Проверка типа была ограничена скалярными типами, поскольку API основано на строках формата. Это могло быть проблематично, если указатели должны быть разыменованы кодом трассировки.
  • Маркеры «скрывают» инструментацию в исходном коде, не сохраняя глобального реестра инструментации. Это затрудняет соглашения о пространстве имен и отслеживание модификации инструментации, если не отслеживается все дерево ядра.

Набор исправлений, реализующий их, был объединен в версию 2.6.24, [6], которая была выпущена 24 января 2008 года. Для решения проблем, связанных с маркерами ядра, Матье Деснойе, их изначальный автор, реализовал более простую и более типобезопасную версию статических точек зондирования под названием Tracepoints . Набор исправлений, реализующий Tracepoints, был объединен в версию 2.6.28, [7], которая была выпущена 25 декабря 2008 года. Начиная с этого момента, маркеры ядра постепенно удалялись из исходников ядра и в конечном итоге были полностью удалены в ядре Linux 2.6.32, [8] [9], которое было выпущено 3 декабря 2009 года.

Смотрите также

Ссылки

  1. ^ Точки трассировки и маркеры Архивировано 23 сентября 2009 г. на Wayback Machine , LTTng's Tracing Wiki
  2. ^ Использование маркеров, SystemTap Wiki
  3. ^ Матье Денуайе, [патч 08/10] Немедленная ценность - Документация [ постоянная мертвая ссылка ‍ ]
  4. ^ Матье Денуайе, [патч 7/8] Непосредственные ценности - Документация [ постоянная мертвая ссылка ‍ ]
  5. ^ ab Матье Деснуайе, Отслеживание операционных систем с низким уровнем воздействия, докторская диссертация, Департамент информатики и логики, Политехническая школа Монреаля, Университет Монреаля, декабрь 2009 г.
  6. ^ Linux 2.6.24 Changelog, Linux Kernel Newbies
  7. ^ Linux 2.6.28 Changelog, Linux Kernel Newbies
  8. ^ Linux 2.6.32 Changelog, Linux Kernel Newbies
  9. ^ Кристоф Хеллвиг, fc537766 Архивировано 15.04.2013 в archive.today трассировка: Удалить маркеры, Linux git tree Торвальдса
  • Джонатан Корбет, Ядерные маркеры , LWN.net, 2007
  • Матье Денуайе, Использование маркеров ядра Linux , Документация ядра Linux , 2008 г.
  • Джонатан Корбет, Трассировка: нет недостатка в вариантах , LWN.net, 2008
Получено с "https://en.wikipedia.org/w/index.php?title=Kernel_marker&oldid=1199021575"