Маркер ядра - Kernel marker

Маркеры ядра были статическим механизмом поддержки инструментария ядра для Ядро Linux исходный код, позволяющий использовать специальные инструменты, такие как LTTng[1] или же SystemTap[2] к след информация, предоставляемая этими точками исследования. Маркеры ядра были объявлены в коде ядра однострочными формами:

trace_mark(имя, format_string, ...);

Где имя - уникальное имя маркера, и format_string описывает типы остальных аргументов.

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

int marker_probe_register(const char *имя, const char *format_string, marker_probe_func *зонд, пустота *pdata);

зарегистрировать свой зонд обратный вызов с точкой маркера (pdata - это значение частных данных, которое код хочет передать в зонд). Позже зонд включается и выключается с помощью:

int marker_arm(const char *имя);int marker_disarm(const char *имя);

Использование маркеров приводит к незначительным накладным расходам, отчасти благодаря Ближайшие значения,[3] другой механизм поддержки, который встраивает в код переключатели, которые можно динамически включать и выключать без использования ссылки на память и, таким образом, сохранения строк кэша.[4]

Первоначальной мотивацией для создания этой статической инструментальной инфраструктуры были большие накладные расходы на производительность, вызванные предшествующим механизмом динамических инструментов. Kprobe механизм, который зависит от контрольные точки. Статические инструменты также могут легче пережить изменения исходного кода, поскольку маркеры находятся в исходном коде.

Маркеры ядра состояли из C предварительная обработка макрос который добавил, в инструментированной функции, ветвь над вызов функции. Тем самым ни куча установка и вызов функции не выполняются, когда инструментарий не включен. Идентифицировав ветвь, выполняющую настройку стека и вызов функции, как вряд ли (с использованием gcc встроенный ожидать()) дается подсказка компилятор расположить инструкции по трассировке подальше от строки кеша участвует в стандартном исполнении ядра.[5]

Выявлены два недостатка Kernel Markers[5] что привело к его замене на Точки трассировки:

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

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

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

Рекомендации

  1. ^ Точки трассировки и маркеры В архиве 2009-09-23 на Wayback Machine, Вики по трассировке LTTng
  2. ^ Использование маркеров, SystemTap Wiki
  3. ^ Матье Деснуайе, [patch 08/10] Immediate Value - Documentation[постоянная мертвая ссылка ]
  4. ^ Матье Деснуайе, [патч 7/8] Немедленные ценности - Документация[постоянная мертвая ссылка ]
  5. ^ а б Матье Деснуайе, Трассировка операционной системы с низким уровнем воздействия, Докторская диссертация, Департамент информатики и логики, Политехническая школа Монреаля, Университет Монреаля, декабрь 2009 г.
  6. ^ Журнал изменений Linux 2.6.24, Новички в ядре Linux
  7. ^ Журнал изменений Linux 2.6.28, Новички в ядре Linux
  8. ^ Журнал изменений Linux 2.6.32, Новички в ядре Linux
  9. ^ Кристоф Хеллвиг, fc537766 В архиве 2013-04-15 в Archive.today трассировка: удаление маркеров, дерево git Торвальдса для Linux

внешняя ссылка