Как получить доступ к регистрам xmm в программе eBPF - PullRequest
0 голосов
/ 16 января 2019

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

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

Есть ли способ сделать это? Или это что-то упущено в дизайне eBPF

1 Ответ

0 голосов
/ 17 января 2019

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 равно null ).

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

...