linux系统启动详解(整理)

启动第一步--加载BIOS
    当你打开计算机电源,计算机会首先加载BIOS信息;BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。BIOS信息中会包含已设定的启动顺序(从硬盘、软盘、光驱、U盘启动等)。(BIOS加电自检,会自行执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件包括内存进行检)


启动第二步--读取MBR
    从BIOS中设置的第一个启动设备中读取MBR(如第一启动项是硬盘,则从该硬盘上读取MBR)。硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)(即硬盘上第0磁道第0柱面的第1个扇区)被称为MBR,即主引导记录(Master Boot Record),它的大小是512字节,里面却存放了446字节内容为启动引导代码(即bootloader,如linux的grub,lilo,windows的ntldr等),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。

    最初的446字节是主boot loader,它里面就包含有可执行代码以及错误消息文本(此处MBR中存放的446字节的boot loader主要是grub文件中的stage1文件)。接下来的64字节是分区表,其中包含有四个分区的各自的记录(一个分区占16字节)。MBR通过特殊数字0xAA55。0x55AA同时也是MBR有效的校验确认。
    第一阶段的boot loader(即stage1文件)的工作是寻找并加载第二阶段boot loader(即stage1.5 、stage2、menu.lst等文件)。它通过分析分区表,找出激活分区来完成这个任务。当找到一个活动分区时,它会扫描分区表中的其他分区,以确保它们都不是活动的。确认完毕后,激活分区的启动记录从设备中被读到RAM,并被执行。
    系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是第一阶段的Boot Loader。


启动第三步--Boot Loader
    在第一阶段bootloader中stage1文件的引导下,第二阶段的bootloader文件(stage1.5、stage2、menu.lst)被加载到内存中执行。bootloader的启动中我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。Boot Loader有若干种,以Grub为例来讲解,系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。

/*************************************************************************/

启动linux的菜单项

menu.list内容:
title           Ubuntu, kernel 2.6.20-16-generic   // 指定此菜单项的名称,既在grub列表里的名称
root          (hd0,1)     //指定启动分区,注意,编号从0开始:比如第一块硬盘的第一个分 区应该是(hd0,0)。启动分区的编号可以使用fdisk -l查询,但是需要root权限
kernel     /boot/vmlinuz-2.6.20-16-generic root=UUID=3f784cd9-516f-4808-a601-b19356f6bdea ro quiet splash locale=zh_CN vga=0x318  //指定启动的内核的绝对路径和名称,后边跟参数,一般来说root参数就是你的根文件系统,一定要有的,可以像范例中使用. uuit表示,也可以直接使用/dev/sda2或者/dev/hda1这样的表示。其实有root和kernel两行就可以启动linux了。
initrd      /boot/initrd.img-2.6.20-16-generic  //指定系统启动访问真正的根文件系统前,访问的ramdisk映象。
quiet
savedefault    //如果选择了这个启动项,那么下次启动时就用此项作为默认项。


启动Windows的菜单项
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/hda1
title           Microsoft Windows XP Professional
root            (hd0,0)
savedefault
makeactive
chainloader     +1
略解:
title,root,savedefault同上。
makeactive:使此分区成为活动分区,Windows必须从活动分区启动,而且NT内核的启动分区一般应该为第一个主分区。
chainloader +1:告诉grub不要自己加载此操作系统,而使用这个分区上的加载器,比如ntldr。
/***************************************************************************/


启动第四步--加载内核
    根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。


启动第五步--用户层init依据inittab文件来设定运行等级
    内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
关于/etc/inittab文件的学问,其实还有很多


启动第六步--init进程执行rc.sysinit
    在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件.


启动第七步--启动内核模块
    具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。


启动第八步--执行不同运行级别的脚本程序
    根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。


启动第九步--执行/etc/rc.d/rc.local
    你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。


启动第十步--执行/bin/login程序,进入登录状态
此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了.




/***************************************************************分界线***************************************************************************************/

小知识:GRUB阶段的boot loaders

     能正常工作的grub应该包 括一下文件:stage1、stage2、*stage1_5、menu.lst。 
  其中stage1要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要用fdisk标记成可启动的)的启动扇区。 stage1的主要的也是唯一的作用就是找到你存放在硬盘上某个地方的stage2文件,来完成后续的工作。 
  stage2文件可以存在某个特定的文件系统中,比如你分了一个linux分区,在上面创建一个ext2文件系统,然后把这个文件拷贝到这个 分区的某个目录下。也可以把stage2直接存放在硬盘的某个位置,也就是未分区的某个地方。不过,好像没有多少人会这么做吧。 
  因为stage1的容量有限(主引导记录MBR和启动扇区的大小只能够是512字节),所以它对文件系统是无法识别的,那如果你把 stage2存放在ext2或者fat格式的文件系统上,它如何来找到这个文件呢?这就要用到上面提到的那些stage1_5的文件了,它们负责解释文件 系统。你的stage2放在什么格式的文件系统上,就要调用对应的那个stage1_5文件。比如,你把stage2存放在ext2格式的文件系统上,就 需要e2fs_stage1_5;stage2存放在fat格式的文件系统上,就需要fat_stage1_5了,stage1.5可以安装在 mbr 之后的位置。 

接下来是简单开机过程 (bootloader角度分析)
①按下电源后,计算机自检(POST),如果硬件设备(CPU、内存、硬盘、光驱、各种卡)都没有问题,BIOS会检查各个硬盘的MBR,看有没 有可以执行的代码,如果你把grub安装到第一个硬盘的MBR上,那BIOS就会找到它,然后把控制权交个这段代码(其实就是512字节大小的 stage1)。 
②stage1根据安装时提供的信息,如stage2在什么地方,需不需要加载文件系统的对应的stage1_5文件等,找 
到stage2文件,并把控制权交给stage2。 
③stage2会需要特定位置的grub配置文件menu.lst文件(此文件是/boot/gurb/gurb.conf的链接文件),如 果找到,就分析其中的内容,形成操作系统选择菜单(Grub管它叫Menu Interface),如果没有找到menu.lst或者这个文件的格式、内容有错误,那就显示grub的命令行提示符。 
④当你选择了菜单中相应的条目,或者输入了相关的命令,就可以看是引导系统了。比如引导linux的话,stage2会负责将vmlinuz 和initrd(如果有的话)装载到内存,并把控制权交给vmlinuz。 
⑤linux的内容完成对硬件的初始化,并把控制权交给init程序,完成后续的工作了。 


以上内容参考各位大牛文章整理后所得,在此深表感谢!如有错误烦请告知。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值