您的位置:首页 > 其它

内存管理API之get_user_pages_fast

2018-01-18 08:21 477 查看
int get_user_pages_fast(unsigned long start, int nr_pages, int write,struct page **pages) 和get_user_pages 具有相同的作用.
其源码分析如下:

int get_user_pages_fast(unsigned long start, int nr_pages, int write,
struct page **pages)
{
unsigned long addr, len, end;
int nr = 0, ret = 0;
#需要映射其实地址需要page size 对齐
start &= PAGE_MASK;
addr = start;
#需要映射的长度
len = (unsigned long) nr_pages << PAGE_SHIFT;
end = start + len;
#如果这段地址不能读/写 ,则返回错误
if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ,
(void __user *)start, len)))
return 0;

if (gup_fast_permitted(start, nr_pages, write)) {
local_irq_disable();
gup_pgd_range(addr, end, write, pages, &nr);
local_irq_enable();
ret = nr;
}

if (nr < nr_pages) {
/* Try to get the remaining pages with get_user_pages */
start += nr << PAGE_SHIFT;
pages += nr;
#get_user_pages_unlocked->__get_user_pages_unlocked->__get_user_pages_locked来映射,而__get_user_pages_locked来映射 这个函数前面
#已经分析过了
ret = get_user_pages_unlocked(start, nr_pages - nr, pages,
write ? FOLL_WRITE : 0);

/* Have to be a bit careful with return values */
if (nr > 0) {
if (ret < 0)
ret = nr;
else
ret += nr;
}
}

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: