内存管理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; }
相关文章推荐
- 内存管理API之get_user_pages
- 内存管理API之__get_free_pages
- Missing access checks in put_user/get_user kernel API (CVE-2013-6282)
- Missing access checks in put_user/get_user kernel API (CVE-2013-6282)
- WINDOWS-API:取得当前用户账户名-GetUserName
- 【API】GetUserNameEx 函数使用
- 内存管理API之free_pages_exact
- 内存管理API之get_vm_area_size
- QQ登录成功后,没有调用- (void)getUserInfoResponse:(APIResponse *)response方法
- 内存管理API之__get_vm_area
- copy_to_user的实现以及get_user_pages/kmap_atomic/kmalloc
- 内存管理API之get_zeroed_page
- 内存管理API之memdup_user
- 内存管理API之mempool_alloc_pages和mempool_free_pages
- Missing access checks in put_user/get_user kernel API (CVE-2013-6282)
- 澄清一个get_user_pages的事实
- get_user_pages的意义
- 内存管理API之alloc_pages_exact
- linux 内存管理之kmalloc、vmalloc、malloc、get_gree_pages的区别
- 澄清一个get_user_pages的事实