Синхронизация Linux через Ядро & amp; Пространство пользователя

Я пишу модуль ядра для специальной камеры, работающий через V4L2 для обработки переноса кадров в код пользовательского пространства. Затем я делаю много пользовательского пространства в приложении.

Время здесь очень важно, поэтому я много профилирую производительность std::chrono::steady_clock что-то для отслеживания времени, но я дошел до того, что мне нужно также собрать данные о времени со стороны ядра, чтобы я мог проанализировать весь путь от аппаратного прерывания через V4L DQBuf до пространства пользователя …

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

Ubuntu 12.04 LTS

5

Решение

На самом низком уровне находятся rdtsc а также rdtscp инструкции, если вы используете процессор x86 / x86-64. Это должно обеспечить минимальные издержки, максимально возможное разрешение на границе ядра / пространства пользователя.

тем не мение, Есть вещи, о которых нужно беспокоиться. Вы должны убедиться, что вы выполняете на одном ядре / процессоре, процесс не переключается из контекста и частота не меняется при каждом вызове. Если процессор поддерживает инвариант TSC, (constant_tsc в /proc/cpuinfoэто немного более надежно для процессоров / ядер и частот.

Это должно обеспечить примерно наносекундную точность.

1

Другие решения

Существует множество утилит уровня ядра, которые могут получить трассировки, связанные с синхронизацией. Например, ptrace, ftrace, LTTng, Kprobes, Проверьте эту ссылку для получения дополнительной информации.
http://elinux.org/Kernel_Trace_Systems

0

По вопросам рекламы [email protected]