Jump to content

Маркеры ядра

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

См. также

[ редактировать ]
  1. ^ Точки трассировки и маркеры. Архивировано 23 сентября 2009 г. на Wayback Machine , Tracing Wiki LTTng.
  2. ^ Использование маркеров , SystemTap Wiki
  3. ^ Матье Деснуайе, [обновление 10 августа] Непосредственное значение — Документация [ постоянная мертвая ссылка ]
  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. Архивировано 15 апреля 2013 г., трассировка archive.today : удаление маркеров, git-дерево Торвальдса в Linux.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 65a948f51b6bcf3448a2442419a53a54__1706194080
URL1:https://arc.ask3.ru/arc/aa/65/54/65a948f51b6bcf3448a2442419a53a54.html
Заголовок, (Title) документа по адресу, URL1:
Kernel marker - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)