Маркеры ядра
Маркеры ядра представляли собой статический механизм поддержки инструментов ядра для исходного кода ядра Linux , позволяющий использовать специальные инструменты, такие как LTTng. [1] или SystemTap [2] для отслеживания информации, предоставляемой этими точками зондирования. Маркеры ядра были объявлены в коде ядра однострочниками вида:
trace_mark(name, format_string, ...);
Где 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 , который зависит от точек останова . Статическое инструментирование также может легче пережить изменения исходного кода, поскольку маркеры находятся в исходном коде.
Маркеры ядра по существу состояли из C предварительной обработки макроса , который добавлял в инструментированную функцию ветвь к вызову функции . При этом ни настройка стека , ни вызов функции не выполняются, если инструментирование не включено. Определив ветку, выполняющую настройку стека, и
вызов функции как unlikely
(используя gcc встроенный expect()
дается подсказка ), компилятору расположить инструкции трассировки подальше от строк кэша, участвующих в стандартном выполнении ядра. [5]
Были выявлены два недостатка маркеров ядра. [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 года.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Точки трассировки и маркеры. Архивировано 23 сентября 2009 г. на Wayback Machine , Tracing Wiki LTTng.
- ^ Использование маркеров , SystemTap Wiki
- ^ Матье Деснуайе, [обновление 10 августа] Непосредственное значение — Документация [ постоянная мертвая ссылка ]
- ^ Матье Деснуайе, [обновление 7/8] Непосредственные значения — Документация [ постоянная мертвая ссылка ]
- ^ Перейти обратно: а б Матье Деснуайе, «Отслеживание операционных систем с низким уровнем воздействия» , докторская диссертация, факультет компьютерной инженерии и разработки программного обеспечения, Политехническая школа Монреаля, Монреальский университет, декабрь 2009 г.
- ^ Linux 2.6.24 Список изменений , Новички в ядре Linux
- ^ Журнал изменений Linux 2.6.28 , Новички в ядре Linux
- ^ Журнал изменений Linux 2.6.32 , Новички в ядре Linux
- ^ Кристоф Хеллвиг, fc537766. Архивировано 15 апреля 2013 г., трассировка archive.today : удаление маркеров, git-дерево Торвальдса в Linux.
Внешние ссылки
[ редактировать ]- Джонатан Корбет, Маркеры ядра , LWN.net, 2007 г.
- Матье Денуайе, Использование маркеров ядра Linux , по ядру Linux , 2008 г. Документация
- Джонатан Корбет, Отслеживание: недостатка в вариантах нет , LWN.net, 2008 г.