[ZLG-ARM] Linux系统启动过程详解

[复制链接]
1869|1
 楼主| reeper 发表于 2009-4-9 15:19 | 显示全部楼层 |阅读模式
1)BIOS自检<br />2)启动Grub/Lilo<br />3)加载内核<br />4)执行init进程<br />5)通过/etc/inittab文件进行初始化<br />6)登陆Linux<br /><br />1)BIOS自检<br />&nbsp;&nbsp;a)POST(Power&nbsp;On&nbsp;Self&nbsp;Test),对硬件进行检测<br />&nbsp;&nbsp;计算机在通电后首先由BIOS进行自检,即所谓的POST(Power&nbsp;On&nbsp;Self&nbsp;Test),对硬件进行检测<br />&nbsp;&nbsp;依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入'引导块'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在PC中,Linux是从BIOS中的地址0xFFFF0处开始的<br />&nbsp;&nbsp;BIOS的第一个步骤是加电自检(POST),对硬件进行检测<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二个步骤是进行本地设备的枚举和初始化<br />&nbsp;&nbsp;BIOS由两部分组成:&nbsp;POST代码和运行时服务<br />&nbsp;&nbsp;当POST完成后,它从内存中清理出来,但BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务<br />&nbsp;&nbsp;要引导一个操作系统,BIOS运行时会按照CMOS的设置的顺序来搜索处于活动状态并可引导的设备:软盘、CD-ROM、硬盘上的分区、网络上的某个设备、USB(通常Linux是从硬盘引导的<br />&nbsp;&nbsp;主引导记录MBR中包含主引导加载程序。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区))当MBR被加载到RAM中之后,BIOS会把控制权交给MBR<br /><br />&nbsp;&nbsp;b)提取MBR的信息<br />&nbsp;&nbsp;要看MBR的内容,请使用下面的命令<br />&nbsp;&nbsp;#从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中<br />&nbsp;&nbsp;[root@localhost&nbsp;pam.d]#&nbsp;dd&nbsp;if=/dev/sda&nbsp;of=mbr.bin&nbsp;bs=512&nbsp;count=1<br /><br />&nbsp;&nbsp;#以十六进制和ASCII码格式打印这个二进制文件的内容<br />&nbsp;&nbsp;[root@localhost&nbsp;pam.d]#&nbsp;od&nbsp;-xa&nbsp;mbr.bin<br />0000000&nbsp;48eb&nbsp;0090&nbsp;d08e&nbsp;00bc&nbsp;fb7c&nbsp;d88e&nbsp;b9fc&nbsp;0080<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;&nbsp;&nbsp;H&nbsp;dle&nbsp;nul&nbsp;&nbsp;so&nbsp;&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&lt&nbsp;nul&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;so&nbsp;&nbsp;&nbsp;X&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;9&nbsp;nul&nbsp;nul<br />0000020&nbsp;f48b&nbsp;00bf&nbsp;8e06&nbsp;f3c0&nbsp;a566&nbsp;2fea&nbsp;0006&nbsp;1000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;&nbsp;?&nbsp;nul&nbsp;ack&nbsp;&nbsp;so&nbsp;&nbsp;&nbsp;@&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;%&nbsp;&nbsp;&nbsp;j&nbsp;&nbsp;&nbsp;/&nbsp;ack&nbsp;nul&nbsp;nul&nbsp;dle<br /><br /><br />2)启动GRUB/Lilo<br />&nbsp;&nbsp;GRUB和LILO都是引导加载程序,它们会引导操作系统。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(即MBR:&nbsp;master&nbsp;boot&nbsp;record)<br /><br />3)加载内核<br />&nbsp;&nbsp;当内核映像被加载到内存后,内核阶段就加开始了<br />&nbsp;&nbsp;内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或bzImage(较大的压缩映像,大于512KB),它是提前使用zlib进行压缩的<br />&nbsp;&nbsp;在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以后使用,然后此例程会调用内核,并开始启动内核引导的过程<br />&nbsp;&nbsp;在GRUB命令中,我们可以使用initrd映像引导一个特定的内核,方法如下:<br />&nbsp;&nbsp;grub&gt&nbsp;kernel&nbsp;/bzImage-2.6.14.2<br />&nbsp;&nbsp;[Linux-bzImage,&nbsp;setup=0x1400,&nbsp;size=0x29672e]<br /><br />&nbsp;&nbsp;grub&gtinitrd&nbsp;/initrd-2.6.14.2.img<br />&nbsp;&nbsp;[Linux-initrd&nbsp;@&nbsp;0x5f13000,&nbsp;0xcc199&nbsp;bytes]<br /><br />&nbsp;&nbsp;grub&gt&nbsp;boot<br />&nbsp;&nbsp;Uncompressing&nbsp;Linux...&nbsp;Ok,&nbsp;booting&nbsp;the&nbsp;kernel.<br /><br />&nbsp;&nbsp;如果不知道要引导的内核的名称,只需使用/然后按下Tab键,就会显示内核和initrd映像列表<br /><br />&nbsp;&nbsp;对grub命令行进行加密<br />&nbsp;&nbsp;a)使用命令/sbin/grub-md5-crypt来产生grub使用的密码<br />&nbsp;&nbsp;[root@localhost&nbsp;pam.d]#&nbsp;/sbin/grub-md5-crypt<br />&nbsp;&nbsp;&nbsp;Password:<br />&nbsp;&nbsp;&nbsp;Retype&nbsp;password:<br />&nbsp;&nbsp;&nbsp;$1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1<br /><br />&nbsp;&nbsp;b)修改/etc/grub.conf加入password&nbsp;--md5&nbsp;$1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1&nbsp;一定要放在title之前<br />&nbsp;&nbsp;这样重启系统时在grub的启动grub菜单时,想再按e命令进行编辑时,必须先按p键后输入密码才成<br /><br />4)执行init进程<br />&nbsp;&nbsp;init进程是所有进程的起点,内核在完成内核引导后,即在本线程(进程)空间内加载init程序,它的进程号为1<br />&nbsp;&nbsp;init进程是所有进程的发起者和控制者<br />&nbsp;&nbsp;init进程有两个作用:<br />&nbsp;&nbsp;&nbsp;&nbsp;扮演终结父进程的角色:所有的孤儿进程都会被init进程接管<br />&nbsp;&nbsp;&nbsp;&nbsp;进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理,这个作用由/etc/inittab文件定义的<br />&nbsp;&nbsp;&nbsp;<br />5)通过/etc/inittab文件进行初始化<br />&nbsp;&nbsp;init进程的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等,对于RedHat来说,按以下顺序执行<br />&nbsp;&nbsp;a)执行/etc/rc.d/rc.sysinit(由init执行的第一个脚本)<br />&nbsp;&nbsp;&nbsp;&nbsp;此步可进行的工作有:<br />&nbsp;&nbsp;&nbsp;&nbsp;设置$PATH变量<br />&nbsp;&nbsp;&nbsp;&nbsp;配置网络<br />&nbsp;&nbsp;&nbsp;&nbsp;为虚拟内存启动交换<br />&nbsp;&nbsp;&nbsp;&nbsp;设置系统的主机名<br />&nbsp;&nbsp;&nbsp;&nbsp;检查root文件系统,以进行必要的修复<br />&nbsp;&nbsp;&nbsp;&nbsp;检查root文件系统的配额<br />&nbsp;&nbsp;&nbsp;&nbsp;为root文件系统打开用户和组的配额<br />&nbsp;&nbsp;&nbsp;&nbsp;以读/写的方式重新装载root文件系统<br />&nbsp;&nbsp;&nbsp;&nbsp;清除被装载的文件系统表/etc/matb<br />&nbsp;&nbsp;&nbsp;&nbsp;把root文件系统输入到mtab<br />&nbsp;&nbsp;&nbsp;&nbsp;使用系统为装入模块做准备<br />&nbsp;&nbsp;&nbsp;&nbsp;查找模块的相关文件<br />&nbsp;&nbsp;&nbsp;&nbsp;检查文件系统,以进行必要的修复<br />&nbsp;&nbsp;&nbsp;&nbsp;加载所有其他文件系统<br />&nbsp;&nbsp;&nbsp;&nbsp;清除几个/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin<br />&nbsp;&nbsp;&nbsp;&nbsp;删除UUCP的lock文件<br />&nbsp;&nbsp;&nbsp;&nbsp;删除过时的子系统文件<br />&nbsp;&nbsp;&nbsp;&nbsp;删除过时的pid文件<br />&nbsp;&nbsp;&nbsp;&nbsp;设置系统时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;打开交换<br />&nbsp;&nbsp;&nbsp;&nbsp;初始化串行端口<br />&nbsp;&nbsp;&nbsp;&nbsp;装入模块<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;b)执行/etc/rc.d/rcX.d[KS]<br />&nbsp;&nbsp;&nbsp;&nbsp;首先终止K开头的服务(用来关闭一个服务),然后启动S开头的服务(用来启动一个服务)<br />&nbsp;&nbsp;&nbsp;&nbsp;对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。<br />&nbsp;&nbsp;&nbsp;&nbsp;这些运行级别的下级子目录的命名方法上rcX.d,&nbsp;其中X就是代表运行级别的数字<br />&nbsp;&nbsp;&nbsp;&nbsp;在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接<br />&nbsp;&nbsp;&nbsp;&nbsp;链接的名称在K与S后有一个数字,表示执行顺序,数字小的先执行如K01tog-pegasus&nbsp;&nbsp;、&nbsp;S00microcode_ctl<br />&nbsp;&nbsp;&nbsp;&nbsp;对以K开头的脚本执行时系统会传递stop参数,而S开头的脚本系统会传递start参数<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;c)执行/etc/rc.d/rc.local<br />&nbsp;&nbsp;&nbsp;&nbsp;Redhat中运行模式2,3,5都把/etc/rc.d/rc.local作为初始化脚本中的最后一个文件,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登陆之前执行的命令<br /><br /><br />6)执行/bin/login<br />&nbsp;&nbsp;&nbsp;login程序会提示使用者需输入帐号与密码,接着编码并确认密码的正确性,若二者相合,则为使用者进行初始化环境,并将控制权交给shell,即等用户登录。<br />至此,Linux启动过程全部结束
zcying 发表于 2009-4-9 15:20 | 显示全部楼层

系统的问题有些复杂啊

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部