在Linux内核中,
mapping
中有一个名为struct page
的字段。当该字段是文件的缓冲区高速缓存时,该字段可以表示支持该页面的文件。它也可能是设备支持的页面swap
。
我的问题是
匿名内存页的设备
mapping
是什么?这也是一些特殊设备(例如交换设备)吗?谢谢!
仅供参考,我正在阅读 Linux 5.13。
->mapping
的 struct page
字段实际上可以指向三个不同的事物,奇怪的是,其中两个不是 struct address_space
(尽管字段的类型不同)。这在 include/linux/page-flags.h
的评论中进行了解释:
在映射到用户虚拟内存区域的匿名页面上,映射到用户空间时,并且
page->mapping
- 指向其
anon_vma
,而不是struct address_space
; 设置PAGE_MAPPING_ANON
位来区分它。请参阅rmap.h
。在VM_MERGEABLE
- 区域的匿名页面上,如果启用
CONFIG_KSM
,PAGE_MAPPING_MOVABLE
位可以与PAGE_MAPPING_ANON
一起设置 少量;然后page->mapping
指向的不是anon_vma
,而是一个私有的 KSM 与该合并页面关联的结构。请参阅ksm.h
。PAGE_MAPPING_KSM
- 不带
当页面是匿名的
PAGE_MAPPING_ANON
用于非 lru 可移动 页,然后page->mapping
指向struct address_space
。
page->mapping
指向其anon_vma
,而不是
struct address_space
。因此,指针本身的值不是
NULL
,但是尝试使用诸如
page_mapping(page)
之类的函数来获取它,你将得到一个 NULL
。要获得 VMA,需要首先进行一些检查(包括首先检查并删除嵌入到 ->mapping
中的标志)。请参阅功能
page_get_anon_vma(page)
或 page_lock_anon_vma_read(page)
。