2

Я пытаюсь использовать bcc-tools для отслеживания пользовательского процесса, используя uprobe, но некоторые функции принимают аргументы с плавающей запятой. Согласно ABI x86_64, эти значения обычно передаются в регистрах xmm.

Функции eBPF в bcc принимают аргумент struct pt_regs * и в этом я могу получить доступ (копия?) большинство "обычных" регистров, но не регистры xmm.

Есть ли способ сделать это? Или это то, что упустили из виду при разработке eBPF

1 ответ1

0

TL; DR Это не проблема с BPF, ни uprobes, ни kprobes не могут получить доступ к регистрам AVX, таким как регистры xmm.


Программы uprobe фактически загружаются в ядро как программы kprobe (то есть BPF_PROG_TYPE_KPROBE).

В отличие от большинства программ BPF, программы kprobe имеют доступ к неизмененному, неограниченному контекстному аргументу в точке подключения. Я имею в виду, что аргумент программ BPF часто является зеркалом реального объекта, заданного в точке подключения, с доступом, переписанным верификатором. Например, несколько BPF-программ принимают в качестве аргумента struct __sk_buff , которая на самом деле является зеркалом sk_buff (см. Этот другой ответ StackOverflow для более подробной информации). Программа kprobe, напротив, имеет доступ к необработанному объекту struct pt_regs (поле convert_ctx_access для struct bpf_verifier_ops равно нулю).

Из этого можно сделать вывод, что kprobes (которые получают struct pt_regs) не имеют доступа к регистрам AVX. Так что это ограничение kprobes, а не BPF. Одной из причин этого может быть просто низкая поддержка регистров AVX в ядре. Пожалуйста, смотрите этот ответ StackOverflow для получения дополнительной информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .