内存管理API之__probe_kernel_read/__probe_kernel_write

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux内核中,使用regmap_reg_range函数需要按照以下步骤进行: 1. 定义regmap对象:首先需要定义一个regmap对象,用于表示寄存器映射。这个对象通常在设备的probe函数中进行初始化,可以使用regmap_init_mmio或regmap_init_i2c等函数进行初始化。 2. 调用regmap_reg_range函数:调用regmap_reg_range函数可以查找指定地址范围内的寄存器,并返回这些寄存器的地址和大小信息。函数原型如下: ``` int regmap_reg_range(struct regmap *map, unsigned int reg, unsigned int count, unsigned int *start_reg, unsigned int *regs, size_t *sizes, const struct regmap_access_table *table); ``` 参数说明: - map:表示寄存器映射对象,即前面定义的regmap对象。 - reg:表示要查找的地址范围的起始地址。 - count:表示要查找的地址范围内的寄存器数量。 - start_reg:返回值,表示查找到的第一个寄存器的地址。 - regs:返回值,表示查找到的所有寄存器的地址。 - sizes:返回值,表示查找到的所有寄存器的大小。 - table:表示寄存器访问表,用于指定寄存器的访问权限,可以为NULL。 函数返回值表示操作是否成功,如果返回负数,则表示操作失败。 3. 使用返回的寄存器地址和大小信息:调用regmap_reg_range函数后,可以使用返回的寄存器地址和大小信息访问硬件寄存器。例如,可以使用regmap_read或regmap_write等函数读写指定地址的寄存器。 总的来说,使用regmap_reg_range函数需要先定义一个regmap对象,然后调用函数查找指定地址范围内的寄存器,并使用返回的寄存器地址和大小信息访问硬件寄存器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值