内存管理API之memdup_user

void *memdup_user(const void __user *src, size_t len)的作用是从copy user space的从src开始长度为len的一段内存到kernel space
其源码分析如下:
void *memdup_user(const void __user *src, size_t len)
{
	void *p;

	/*
	 * Always use GFP_KERNEL, since copy_from_user() can sleep and
	 * cause pagefault, which makes it pointless to use GFP_NOFS
	 * or GFP_ATOMIC.
	 */
	 #由于copy_from_user 可能睡眠,因此kernel space中申请内存是用的是GFP_KERNEL
	p = kmalloc_track_caller(len, GFP_KERNEL);
	#p为null的话,表示申请内存失败,直接返回no memcpy
	if (!p)
		return ERR_PTR(-ENOMEM);
	#申请到内存后通过copy_from_user 将用户空间指针src中的内容copy到内核空间指针p中,如果copy出错的话,释放
	#掉内核指针p,并返回EFAULT
	if (copy_from_user(p, src, len)) {
		kfree(p);
		return ERR_PTR(-EFAULT);
	}
	#正常情况下p不为null,且已经包含从用户指针中的内容
	return p;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值