您的位置:首页 > 其它

内存管理API之memdup_user

2018-01-29 08:25 477 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: