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;
}内存管理API之get_user_pages_fast
最新推荐文章于 2026-06-14 13:49:18 发布
本文详细解析了get_user_pages_fast函数的实现原理及其与get_user_pages的关系。该函数用于快速获取用户空间页面,通过映射用户地址空间到内核地址空间来提高效率。


3397

被折叠的 条评论
为什么被折叠?



