分类: LINUX
2011-03-24 13:00:39
实际mem_mep 内容分析: (转载请注名出处)
环境 2.6.29 arm 128M no hole , 1 node ,only normal zone
phy addr start =>0x20000000
struct page 32byte ,下面图中2行一个struct page
System.map: => c0349ec8 B mem_map
0xc0349ec8 的地方内存如下:
20349ec8: c03c0000 00000000 00000000 00000000
找到 mem_map 在 0xc03c0000
/**********************************************************************/
203c0000: 00040000 00000000 ffffffff 00000002 这段order=2 (4x4k) 0x4000
被放到了buddy 中,是free的
203c0010: 00000000 00000000 c0323010 c0323010
203c0020: 00000000 00000000 ffffffff 00000002
203c0030: 00000000 00000000 00100100 00200200
203c0040: 00000000 00000000 ffffffff 00000000
203c0050: 00000000 00000000 00100100 00200200
203c0060: 00000000 00000000 ffffffff 00000002
203c0070: 00000000 00000000 00100100 00200200
/**********************************************************************/
203c0080: 00000400 00000001 ffffffff 00000000 0x4000放kernel 1级表16K
flag=0x400表示PG_reserved
203c0090: 00000000 00000000 c03c0098 c03c0098
203c00a0: 00000400 00000001 ffffffff 00000000
203c00b0: 00000000 00000000 c03c00b8 c03c00b8
203c00c0: 00000400 00000001 ffffffff 00000000
203c00d0: 00000000 00000000 c03c00d8 c03c00d8
203c00e0: 00000400 00000001 ffffffff 00000000
203c00f0: 00000000 00000000 c03c00f8 c03c00f8
/**********************************************************************/
203c0100: 00000000 00000000 ffffffff 00000002 这部分是free 的
对应到0xc0008000
203c0110: 00000000 00000000 c0322f90 c03c0138 的地址开始的page
......
......
......
203c0280: 00000000 00000000 ffffffff 00000002
203c0290: 00000000 00000000 c03c0278 c04aefd8
203c02a0: 00080008 00000002 00000000 00000000
203c02b0: c77a6369 000000f7 00100100 00200200
...... 这部分不是free的也不是
...... reserved的,根据kernel 被加到pageoffset +0x8000
...... 那么0xc0008000+kernel_size
...... 这段应该全是reserved 的,现在不是这样,
...... 为什么的原因可见vmlinux.lds.S.
...... text : { /* Real text segment*/
...... _text = .; /* Text and read-only data*/
...... 这个section 前面部分是init ,系统起来后就没用了
...... ,也被free 掉做系统可分配内存了
...... 查下System.map 中c0029000 T _text,
...... 0x29000 转换成 mem_map 的偏移为0x520
...... 所有0xc0008000开始到0xc0029000部分
...... 是可分配内存,0xc029000之后是kernel保留
203c0500: 00080008 00000002 00000000 00000000 所以可以从0x203c0520
203c0510: c77a6339 0000010b 00100100 00200200 开始又变成reserved了
,见0x203c0520 开始段
具体释放init section 部分的函数见: kernel_init =>do_basic_setup
=>do_initcalls call过之后被
init_post =>free_initmem
过河拆桥了
/**********************************************************************/
203c0520: 00000400 00000001 ffffffff 00000000 kernel image 保留,
203c0530: 00000000 00000000 c03c0538 c03c0538 据System.map :
...... c03bea50 B _end
...... 偏移0x3bea50 按页对齐到3BE000
...... 然后3BE000/4096 * 32=77c0
...... kernel image 结束
......
......
203c77c0: 00000400 00000001 ffffffff 00000000
203c77d0: 00000000 00000000 c03c77d8 c03c77d8
/**********************************************************************/
203c77e0: 00040000 00000000 ffffffff 00000000 这单独一页
203c77f0: 00000000 00000000 c0322fb8 c0322fb8 就是传说中bootmem init
时node_bootmem_map 的那1页,
(128M/4096/8=4096byte正好占1page),
mem_init 时也被 过河拆桥了
,具体位置bootmem_init_node=>
find_bootmap_pfn 算出的
/**********************************************************************/
203c7800: 00000400 00000001 ffffffff 00000000 这段也是保留的,占263page
203c7810: 00000000 00000000 c03c7818 c03c7818 主要用于 mem_map,
...... usemap(blockpage flag) ,wait_table ,zero_page等
...... 其中mem_map 在0xc03c0000,
...... 算下来起始page 就在0x7800
...... ,就是这段的0x203c7800,128M ram
...... 的 strcut page 占了 1M , 也就是256页
...... 剩下7 个page 其他部分用
......
203c98e0: 00000400 00000001 ffffffff 00000000 vector的物理保留页,不固定
203c98f0: 00000000 00000000 c03c98f8 c03c98f8
通过vectors = alloc_bootmem_low_pages(PAGE_SIZE);
分配, printk 出来pfn 地址在0x204C1,
phyaddr =0x204C1000 ,算出在mem_map
offset 0x9820 ,看下下面面这块:
203c9820: 00000400 00000001 ffffffff 00000000 flag=0x400果然保留,没骗人
203c9830: 00000000 00000000 c03c9838 c03c9838
/**********************************************************************/
203c9920: 00000000 00000000 ffffffff 00000002 又是free page开始,
203c9930: 00000000 00000000 00100100 00200200 下面就是系统动态内存
......
......
......
203ca000: 00040000 00000000 ffffffff 00000008 挂在buddy 系统free area
203ca010: 00000000 00000000 c0323118 c03fa018 order 8上的首页,接下来
...... 256个连续page是free的
......
......
......
......
......
203cbfe0: 00000000 00000000 ffffffff 00000000
203cbff0: 00000000 00000000 c03cbff8 c03cbff8 连续256个free page结束
203cc000: 00040000 00000000 ffffffff 00000009 order9开始page=>根据c000
203cc010: 00000000 00000000 c0323144 c03fc018 offset 算出 0x20600000,
查看0x20600000处是全ff,free是全ff???
(看下sdram上电后,default 内存是0xff 还是00???)
看下initrd 的部分,根据bootm 启动 intrd 到20800000算出
在mem_map offset 0x10000:
/**********************************************************************/
203d0000: 00040000 00000000 ffffffff 00000009 order 9的 free page,
203d0010: 00000000 00000000 c04b8018 c0323144 因为 populate_rootfs =>
unpack_to_rootfs =>
之后被free_initrd回收了,深入可以看下intrd解析
free page过程=>ClearPageReserved(page); => init_page_count(page); =>
__free_page(page); (flag 没有reserved,count =0 )
一般来讲 struct page 中:
flag 没有reserved 标志,然后count =0 的 就是free page,
疑问:
在某个时间点上,除了free page ,是否还有 其他那些page 的内容,可以认为是
没有用,(比如说可以当free page用 ,只是kernel 还没来得及处理)