我正在尝试通过在内核中使用get_user_pages()函数来固定Linux进程页面。 (我正在使用Ubuntu 16.04,Linux-4.4.0)。
但是我不清楚,get_user_pages()如何固定过程页面,或者 pin 在功能描述中的含义。
我做了以下测试,以检查页面是否被固定。
1.一个称为aligned_alloc(0x1000,0x1000)的进程,用于分配4KB内存。
2.内核模块,它将通过ioctl()从进程接收虚拟地址。
3.在内核模块中接收到虚拟地址后,将使用该虚拟地址像这样调用get_user_pages(),
res = get_user_pages(current,current-> mm,vaddr,1,1,1,&page);
4.该过程休眠了几个小时,我需要检查状态。
通过上述步骤,在/ proc / pid / maps,/ proc / pid / smaps和/ proc / meminfo中,我找不到进程的虚拟地址的锁定(或锁定)。
我还检查了页面结构的ref_count以获取进程虚拟地址,在调用get_user_pages()之前和之后,ref_count是相同的(在我的测试案例中为3),如下所示。
[ 7159.432196] Before, page flag = ffff800004004c, count=3
[ 7159.432196] Pinned Got mmaped.
[ 7159.432197] After, page flags = ffff800004004c, count = 3
我错过了什么吗?
get_user_pages()如何固定进程页面?
我在How do "pinned" pages in Linux present (or actually "pin") themselves中找到了类似的问题,但没有答案。