基于 msm-5.4
一、概述
1. 简介
/proc/buddyinfo 节点包含当前伙伴系统的简要信息,而 /proc/pagetypeinfo 则包含了当前伙伴系统详细信息,包括每个迁移类型和每个链表的成员数量等。
迁移类型最小的单位是页块,在Arm64架构中,页块的默认大小是4M. 但需注意,页块的大小和普通巨页有关,当配置了 CONFIG_HUGETLB_PAGE 时,页块的order大小等于 HUGE_PAGE_ORDER, 通常是9,否则,页块的order是10.
#ifdef CONFIG_HUGETLB_PAGE #define pageblock_order HUGETLB_PAGE_ORDER //9 #else #define pageblock_order (MAX_ORDER-1) //11-1=10 #endif /* CONFIG_HUGETLB_PAGE */
2. 打印格式-buddyinfo
# cat /proc/buddyinfo Node 0, zone Normal 40832 27860 12069 3974 423 88 37 0 0 0 0
注:打印函数见 frag_show_print()
3. 打印格式-pagetypeinfo
# cat /proc/pagetypeinfo Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone Normal, type Unmovable 35624 25526 9745 3158 30 55 30 0 0 0 0 Node 0, zone Normal, type Movable 4125 2277 2182 773 352 33 7 0 0 0 0 Node 0, zone Normal, type Reclaimable 8 39 124 41 41 0 0 0 0 0 0 Node 0, zone Normal, type CMA 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone Normal, type HighAtomic 67 18 18 2 0 0 0 0 0 0 0 Node 0, zone Normal, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Movable Reclaimable CMA HighAtomic Isolate Node 0, zone Normal 1293 2113 31 36 1 0 Number of mixed blocks Unmovable Movable Reclaimable CMA HighAtomic Isolate Node 0, zone Normal 82 524 16 0 1 0
上面打印可分四部分:
(1) 打印 pageblock_order 和 pageblock_nr_pages 的值, 打印函数 pagetypeinfo_show()。
(2) 打印的是 zone->free_area[order]->free_list[MIGRATE_TYPES] 链表上元素的个数,是个二维矩阵了,实现函数是 pagetypeinfo_showfree_print()。
(3) 打印的是以 pageblock_nr_pages 为步长,遍历每个zone的所有pfn, 从 mem_section->usage->pageblock_flags 拿到其对应的迁移类型,记录的是这种迁移类型对应的页块(单位4M)的个数。打印函数是 pagetypeinfo_showblockcount_print()
(4) 依赖 CONFIG_PAGE_OWNER, 若没有配置则什么也不打印。遍历zone span的所有pages, 剔除没有对应实际物理内存的page、剔除本zone的page、剔除PageBuddy(page)成立的page、剔除PageReserved(page)成立的page后, 根据拓展数据中 page_owner->gfp_mask 得到的page的迁移类型和page所在的pageblock(单位4M)的迁移类型不相等时,则将pageblock对应的迁移类型计数加1,若pageblock对应的迁移类型是 MIGRATE_CMA 则加在 MIGRATE_MOVABLE 上。打印函数是 pagetypeinfo_showmixedcount_print()
ChatGPT: 该函数可能遍历内存中的页面块,并统计每个迁移类型中包含其他类型页面的页面块数量。这有助于了解内存管理策略(如页面迁移和回收)的效果。
二、打印实现
/* kernel_init_freeable --> ~ */ void __init init_mm_internals(void) //mm/vmstat.c { ... proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); }
1. buddyinfo
static void frag_show_print(struct seq_file *m, pg_data_t *pgdat, struct zone *zone) //mm/vmstat.c { int order; seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name); for (order = 0; order < MAX_ORDER; ++order) seq_printf(m, "%6lu ", zone->free_area[order].nr_free); seq_putc(m, '\n'); }
2. pagetypeinfo
static int pagetypeinfo_show(struct seq_file *m, void *arg) //mm/vmstat.c { pg_data_t *pgdat = (pg_data_t *)arg; /* 打印第(1)部分内容 */ seq_printf(m, "Page block order: %d\n", pageblock_order); //(MAX_ORDER-1)=10 seq_printf(m, "Pages per block: %lu\n", pageblock_nr_pages); //(1UL << pageblock_order)=1<<10 seq_putc(m, '\n'); /* 打印第(2)部分内容 */ pagetypeinfo_showfree(m, pgdat); /* 打印第(3)部分内容 */ pagetypeinfo_showblockcount(m, pgdat); /* 打印第(4)部分内容 */ pagetypeinfo_showmixedcount(m, pgdat); return 0; }
标签:Node,zone,32,pagetypeinfo,内存,proc,order,pageblock From: https://www.cnblogs.com/hellokitty2/p/18383588