Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3363382
  • 博文数量: 258
  • 博客积分: 9440
  • 博客等级: 少将
  • 技术积分: 6998
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-03 10:28
个人简介

-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu

文章分类

全部博文(258)

文章存档

2016年(1)

2015年(4)

2014年(16)

2013年(22)

2012年(41)

2011年(59)

2010年(40)

2009年(75)

分类: LINUX

2010-08-12 22:41:43

从linux-2.4内核开始,在建立临时页表的时候,一般的教科书都说是映射了8M的物理内存,但是为什么是映射8M呢?当时网上有资料说,8M足够了,但为什么就足够了,一直没有彻底搞清楚,今天又重新分析这部分的代码(linux-2.6.24)。 先看下面内存布局图:
在建立临时页表时到底映射多大的内存取决于以下几个方面:
(1)保护模式下内核的尺寸: 毫无疑问内核代码必须被映射
(2)临时页表所占的空间尺寸: 假设临时页表映射整个4G的线性地址空间,那么:
 页面个数 = 4G/4k = 1M个页面
 每个页面对应一个页表项,占4个字节,那么总共占有4M的空间
(3)bootmem allocator是用来在真正的页表建立好之前用于内存管理的,他用一个位图表来管理整个内存,
每一bit代表一个页框,假设有4G的物理内存,那么1M个页面共占有空间 = 1M/8 = 128K。
(4)由于对齐占有的空间(可以忽略,感觉k的数量级吧)
综合上述几个方面,需要映射的物理内存大约等于:
    保护模式内核尺寸 + 临时页表占用空间尺寸 + bootmem allocator位图表尺寸 =
   现在内核大约4M          最大4M                 128K               = 8M + 128K
 
在linux内核的head_32.S中下面代码:
 movl $(pg0 - __PAGE_OFFSET), %edi
 movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
 movl $0x007, %eax   /* 0x007 = PRESENT+RW+USER */
10:
 leal 0x007(%edi),%ecx   /* Create PDE entry */
 movl %ecx,(%edx)   /* Store identity PDE entry */
 movl %ecx,page_pde_offset(%edx)  /* Store kernel PDE entry */
 addl $4,%edx
 movl $1024, %ecx
11:
 stosl
 addl $0x1000,%eax
 loop 11b
 /* End condition: we must map up to and including INIT_MAP_BEYOND_END */
 /* bytes beyond the end of our own page tables; the +0x007 is the attribute bits */
 leal (INIT_MAP_BEYOND_END+0x007)(%edi),%ebp
 cmpl %ebp,%eax
 jb 10b
 movl %edi,(init_pg_tables_end - __PAGE_OFFSET)
 
红字部分与映射内存有关:
INIT_MAP_BEYOND_END =
         BOOTBITMAP_SIZE + (PAGE_TABLE_SIZE + ALLOCATOR_SLOP)*PAGE_SIZE_asm
       = 128K            + (4K              +     4         )*4K
       = 128K            + 16M + 4K
所以是映射了8M物理内存, 即10:之后的代码执行了两次,这完全满足前面分析的需要映射的物理内存的大小。
 

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

liujunwei12342012-06-26 18:27:19

wangzhen11aaa: BOOTBITMAP_SIZE + (PAGE_TABLE_SIZE + ALLOCATOR_SLOP)*PAGE_SIZE_asm
       = 128K            + (4K              +     4         )*4K
       = 128K   .....
多谢提醒啊,是16M才对,不过目前内核已经没有ALLOCATOR_SLOP。

wangzhen11aaa2012-06-24 12:51:44

BOOTBITMAP_SIZE + (PAGE_TABLE_SIZE + ALLOCATOR_SLOP)*PAGE_SIZE_asm
       = 128K            + (4K              +     4         )*4K
       = 128K            + 4M + 4K
4k * 4k = 4 M不解啊。