剖析Linux系统启动的后台全过程

热度29票  浏览35次 【共0条评论】【我要评论 时间:2009年8月12日 00:27
私募社区 - 私募股权投资知识学习网 - www.simu001.cn!Z&Edfx f2i

  其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。私募社区 - 私募股权投资知识学习网 - www.simu001.cna:b_D,E$P z7l

1U@l:iT2m2Q*R0  那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?私募社区 - 私募股权投资知识学习网 - www.simu001.cnq9]$~S#GU9j wR6h

%Hi @s bc%y^0  0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用 misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。私募社区 - 私募股权投资知识学习网 - www.simu001.cnY imx$N+qH+D1h

私募社区 - 私募股权投资知识学习网 - www.simu001.cn.w1A2er)Ol.V)?V

  当CPU跳到0x100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数,start_kernel ()中调用了一系列初始化函数,以完成kernel本身的设置。私募社区 - 私募股权投资知识学习网 - www.simu001.cnh9~9tm+b:~Z9d#Y5X

[KE^u~ ['],d ]0  start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。私募社区 - 私募股权投资知识学习网 - www.simu001.cn} `3^9N8b/VFp@

私募社区 - 私募股权投资知识学习网 - www.simu001.cnw[ YC2S:G+i

  在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。

{U gZ;a0
顶:2 踩:2
对本文中的事件或人物打分:
当前平均分:-0.7 (10次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.29 (7次打分)
【已经有8人表态】
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】

网络资源