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