Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395973
  • 博文数量: 53
  • 博客积分: 1910
  • 博客等级: 中尉
  • 技术积分: 1130
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-10 14:56
文章分类

全部博文(53)

文章存档

2013年(1)

2012年(17)

2011年(33)

2010年(2)

分类: 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 还没来得及处理)

 

阅读(1789) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~