假设我在用户空间的缓冲区中调用了get_user_pages
。我知道这实际上将“破坏”所有页面以确保它们存在于RAM中。
但是,这是否保证它们将留在RAM中而不被交换出去?
这是我在4.19.69内核上尝试过的一些代码的快速示例:
down_read(¤t->mm->mmap_sem);
rc = get_user_pages(
start, //start virtual address
1, //number of pages
FOLL_WRITE, //flags, see FOLL_* in mm.h
&p, //destination page* array
NULL //destination vma* array (unneeded)
);
up_read(¤t->mm->mmap_sem);
if (rc <= 0) {
printk(KERN_ERR "Could not get user page :(\n");
return rc;
}
printk(KERN_INFO "Page is %sreserved\n", PageReserved(p) ? "" : "not ");
根据dmesg
消息,该页面未标记为保留。假设我开始向该(物理)页面进行DMA传输。这是否意味着在DMA硬件运行时Linux可能会将其换出到磁盘上?如果是这样,保证页面保持原样的正确方法是什么?
答案 0 :(得分:1)
get_user_pages()有一个指向comment的get_user_pages_remote()。后者的文档says:
get_user_pages_remote()-将用户页面固定在内存中
因此,除非您用例如取消固定它们,否则它们不会被交换。 put_user_pages()。