系统中的每个物理页面都有一个与之关联的结构页面,以跟踪我们目前使用该页面的内容。 请注意,我们无法跟踪哪些任务正在使用页面,但如果它是页面缓存页面,则rmap结构可以告诉我们谁正在映射它。
struct页面中的对象以双字块组织,以便允许我们在struct page的部分上使用原子双字操作。 这目前仅供竹节使用,但这种安排允许在flags / mapping和lru list指针上使用原子双字操作。
struct page结构体内容如下,定义在include/linux/mm_types.h文件中
struct page {
/* First double word block 第一个双字块 */
unsigned long flags; /*原子标志,有些可能是异步更新的 */
struct address_space *mapping; /* 如果低位清除,则指向inode address_space或NULL。
如果页面映射为匿名内存,则设置低位,并指向anon_vma对象:请参阅下面的PAGE_MAPPING_ANON。*/
/* Second double word 第二个双字 */
struct {
union {
pgoff_t index; /* 在映射中的偏移 */
void *freelist; /* slub / slob第一个自由对象 */
bool pfmemalloc; /* If set by the page allocator, ALLOC_NO_WATERMARKS was set and the low watermark was not
* met implying that the system is under some pressure. The caller should try ensure this page is only used to
* free other pages.
* 如果由页面分配器设置,则设置ALLOC_NO_WATERMARKS并且不满足低水印,这意味着系统处于某种压力下。