免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1144 | 回复: 0
打印 上一主题 下一主题

linux内存管理之(二)--初始化篇 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-25 01:53 |只看该作者 |倒序浏览

                说到内存的初始化,我们不得不想到linux从硬件加电-POST-........等系列的流程,此处详细的步骤,请看       
M. Tim Jones的经典文章。
我们知道,当内核映像文件被引导程序加载到内存之后,会调用映像前的例程,那就是/arch/i386/boot/head.S这个汇编程序,这个例程会执行一些基本的硬件设置,并调用 ./arch/i386/boot/compressed/head.S 中的 startup_32 例程。此例程会设置一个基本的环境(堆栈等),并清除 Block Started by Symbol(BSS)。然后调用一个叫做 decompress_kernel 的 C 函数(在 ./arch/i386/boot/compressed/misc.c 中)来解压内核。
此时cpu仍然是运行在实模式下的,也就是说其寻址仅限于内存物理地址的前8M,再根据下表所列出的BIOS提供的物理地址映射地址:
Start                       End                   Type
0x00000000        0x0009ffff           Usable
0x000f0000        0x000fffff            Reserved
0x00100000        0x07feffff             Usable
0x07ff0000       0x07ff2fff            ACPI data
0x07ff3000       0x07ffffff            ACPI NVS
0xffff0000       0xffffffff            Reserved
当内核被解压到0x00100000处,即物理内存的2mb开始处,大约要占用3M的空间,按照下图这样来布局:

此时的内核要做两个阶段的工作:
1、建立有限的空间给其本身的代码以及数据段、最初的页表和128k的动态数据结构,虽然空间有限,但足够kernel去将自己安装到物理内存并初始化核心的数据结构。
2、有了上面的基础,kernel会去利用所有的可用的物理内存并适当的建立页表。
下面我们从源代码开始着手分析,这所有的过程:
/usr/src/linux-source-2.6.22/arch/i386/kernel/head.S这是将内核解压后所调用的入口处,是如何实现上述功能的?
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6303/showart_407084.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP