Как получить доступ к регистрам 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 для получения дополнительной информации.

Другие вопросы по тегам