long __probe_kernel_read(void *dst, const void *src, size_t size) 用于安全的在非原子环境下从用户空间copy
数据到kernel空间。
其源码分析如下:
26 long __probe_kernel_read(void *dst, const void *src, size_t size)
27 {
28 long ret;
#在kernel 一般通过get_fs 和set_fs来改变kernel对内核地址的检查方式,一般情况下只有两个值USER_DS和KERNEL_DS
29 mm_segment_t old_fs = get_fs();
30
31 set_fs(KERNEL_DS);
#这个函数和pagefault_enable 配合使用,在这两个之间的操作会禁止产生缺页行文
32 pagefault_disable();
#从用户空间copy数据到kernel space
33 ret = __copy_from_user_inatomic(dst,
34 (__force const void __user *)src, size);
35 pagefault_enable();
#回复kernel 原本对地址空间的检查规则
36 set_fs(old_fs);
37
38 return ret ? -EFAULT : 0;
39 }
与之向对应的是往用户空间写数据
long __probe_kernel_write(void *dst, const void *src, size_t size)
55 {
56 long ret;
57 mm_segment_t old_fs = get_fs();
58
59 set_fs(KERNEL_DS);
60 pagefault_disable();
61 ret = __copy_to_user_inatomic((__force void __user *)dst, src, size);
62 pagefault_enable();
63 set_fs(old_fs);
64
65 return ret ? -EFAULT : 0;
66 }
这两个函数的实现类似,区别是一个copy_from_use,一个是copy_to_use
内存管理API之__probe_kernel_read/__probe_kernel_write
最新推荐文章于 2024-04-28 17:44:23 发布