__get_user_pages_locked()为锁页处理函数,主要核心思想就是调用**__get_user_pages** 函数对为虚拟内存分配对应的物理内存: /* * Please note that this function, unlike __get_user_pages will not * return 0 for nr_pages > 0 without FOLL_NOWAIT */ static __always_inline long __get_user_...
struct page **pages, struct vm_area_struct **vmas) 用于将用户空间的页映射到内存,并返回它们页结构的指针,即get_user_pages的第四个形参struct page **pages 其源码分析如下: long get_user_pages(unsigned long start, unsigned long nr_pages, unsigned int gup_flags, struct page **pages, struct...
在最新的2.6.29内核中,对get_user_pages做了一个改善,主要就是颗粒问题,以前的实现中,在get_user_pages之后才可以处理诸如“本进程已经死亡”的信息,这样的话就做了很多无用功,这在古老的系统问题不大,但是现在都是大并发大负载的系统,任何处理都要很大的付出,因此在目前的情况下,必须改善一些情况。试想一种情...
gup的作用就是get_page(),释放的方法是put_page()。所以它能保证页面不被释放,但它不能保证进程的...
get_user_pages_fast() 会增加PAGE的计数,所以此PAGE不会被换出的。最简单的情况是try_to_unmap()...
在最新的2.6.29内核中,对get_user_pages做了一个改善,主要就是颗粒问题,以前的实现中,在get_user_pages之后才可以处理诸如“本进程已经死亡”的信息,这样的话就做了很多无用功,这在古老的系统问题不大,但是现在都是大并发大负载的系统,任何处理都要很大的付出,因此在目前的情况下,必须改善一些情况。试想一种情...
get_user_pages_fast 是 iov_iter_get_ pages 的简化版本: 这里的“user”(与“kernel”相对)指的是将虚拟页转换为对物理页的引用。 为了得到 struct pages,get_user_pages_fast 完全按照 CPU 操作,但在软件中:它遍历页表以收集所有物理页,将结果存储在 struct pages 里。我们的例子中是一个 128KiB 的缓冲...
该漏洞是内核函数get_user_pages(mm/gup.c)在处理COW(copy-on-write)过程中,由条件竞争引发未授权进程向只读内存区域写入数据导致的。 2.1 主要数据结构说明 get_user_pages被用来通过虚拟地址查询页面获取物理页面,主要代码如框2.1所示: 框2.1:__get_user_pages ...
2.2 alloc_pages 2.3 /proc/sys/vm/compact_memory 2.4 huge page 3. NUMA Balancing引起的页迁移 4. Page migration究竟是怎么做的? 5. 如何规避页迁移 5.1 mlock可以吗? 5.2 GUP(get_user_page)可以吗? 5.3 使用huge page? 对于用户空间的应用程序,我们通常根本不关心page的物理存放位置,因为我们用的是虚...
get_user_pages和follow_page如果在一个巨型的页面上运行,将返回往常一样的头页或尾页(就像他们在hugetlbfs上做的一样)。大多数gup用户只关心实际的物理属性页的地址和它的临时固定在I/O之后释放是完整的,所以他们不会注意到页面是巨型的。但 如果有任何驱动程序会在尾部的页面结构上损坏 page(用于检查page->mappi...