我正在尝试为安卓内核4.9打补丁以支持`probe_read_{user, kernel}`和`probe_read_{user, kernel}`辅助函数。在进行回退时,我参考了另一个添加`bpf_probe_read_str`辅助函数的补丁作为例子。尽管我已经对内核进行了补丁处理以添加这些辅助函数,并且运行了`bpftrace --info`,但新添加的辅助函数并没有显示出来,只有字符串辅助函数显示出来了。
bpftrace输出:
```
系统
操作系统:Linux 4.9.337-g4fcceb75c5cd #1 SMP PREEMPT 周六 5月18日 17:26:12 EEST 2024
架构:aarch64
构建
版本:v0.19.1
LLVM:14.0.6
不安全的探针:是
bfd:否
libdw (DWARF支持):否
libbpf:未能找到有效的内核BTF
内核辅助函数
probe_read:是
probe_read_str:是
probe_read_user:否
probe_read_user_str:否
probe_read_kernel:否
probe_read_kernel_str:否
get_current_cgroup_id:否
send_signal:否
override_return:否
get_boot_ns:否
dpath:否
skboutput:否
get_tai_ns:否
get_func_ip:否
内核特性
指令限制:-1
循环支持:否
btf:否
模块btf:否
映射批处理:否
uprobe引用计数(取决于构建:bcc bpf_attach_uprobe引用计数):否
映射类型
hash:是
percpu hash:是
array:是
percpu array:是
stack_trace:是
perf_event_array:是
ringbuf:否
探针类型
kprobe:是
tracepoint:是
perf_event:是
kfunc:否
kprobe_multi:否
raw_tp_special:否
iter:否
```
`probe_read_{user, kernel}`和`probe_read_{user, kernel}`的补丁:
```
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
index cc5ba47062e8..48762ecbfd66 100644
--- a/include/linux/uaccess.h
+++ b/include/linux/uaccess.h
@@ -88,6 +88,7 @@ static inline unsigned long __copy_from_user_nocache(void *to,
* happens, handle that and return -EFAULT.
*/
extern long probe_kernel_read(void *dst, const void *src, size_t size);
+extern long probe_kernel_read_strict(void *dst, const void *src, size_t size);
extern long __probe_kernel_read(void *dst, const void *src, size_t size);
/*
@@ -126,6 +127,8 @@ extern long notrace probe_user_write(void __user *dst, const void *src, size_t s
extern long notrace __probe_user_write(void __user *dst, const void *src, size_t size);
extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count);
+long strncpy_from_unsafe_strict(char *dst, const void *unsafe_addr,
+ long count);
extern long strncpy_from_unsafe_user(char *dst, const void __user *unsafe_addr,
long count);
extern long strnlen_unsafe_user(const void __user *unsafe_addr, long count);
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 67d7d771a944..d1036b0ba1fa 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -552,6 +552,11 @@ enum bpf_func_id {
*/
BPF_FUNC_get_socket_uid,
+ BPF_FUNC_probe_read_user,
+ BPF_FUNC_probe_read_kernel,
+ BPF_FUNC_probe_read_user_str,
+ BPF_FUNC_probe_read_kernel_str,
+
__BPF_FUNC_MAX_ID,
};
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 83b20092b84c..e872ab1fb235 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -85,44 +85,6 @@ BPF_CALL_
我通过不是这样做,而是检查指针是否在用户空间内,并使用适当的方法来读取它来修复它。