Как получить доступ к регистрам xmm в программе eBPF
Я пытаюсь использовать bcc-tools для отслеживания пользовательского процесса, используя uprobe, но некоторые функции принимают аргументы с плавающей запятой. Согласно ABI x86_64, эти значения обычно передаются в регистрах xmm.
Функции eBPF в ОЦК занимает struct pt_regs *
аргумент и в том, что я могу получить доступ (копию?) к большинству "обычных" регистров, но не к регистрам xmm.
Есть ли способ сделать это? Или это то, что упустили из виду при разработке eBPF
1 ответ
TL;DR Это не проблема с BPF, ни uprobes, ни kprobes не могут получить доступ к регистрам AVX, таким как регистры xmm.
Программы uprobe фактически загружаются в ядре как программы kprobe (т.е. BPF_PROG_TYPE_KPROBE
).
В отличие от большинства программ BPF, программы kprobe имеют доступ к неизмененному, неограниченному контекстному аргументу в точке подключения. Я имею в виду, что аргумент программ BPF часто является зеркалом реального объекта, заданного в точке подключения, с доступом, переписанным верификатором. Например, несколько программ BPF занимают struct __sk_buff
в качестве аргумента, который на самом деле является зеркалом sk_buff
(см. этот другой ответ Stackru для более подробной информации). Программа kprobe, напротив, имеет доступ к сырому struct pt_regs
объект (convert_ctx_access
поле struct bpf_verifier_ops
является нулевым).
Из этого можно сделать вывод, что kprobes (которые получают struct pt_regs
) не имеют доступа к регистрам AVX. Так что это ограничение kprobes, а не BPF. Одной из причин этого может быть просто низкая поддержка регистров AVX в ядре. Пожалуйста, смотрите этот ответ Stackru для получения дополнительной информации.