linux运行vst,Linux启动流程

Linux系统的启动流程大致可以分为以下几个步骤:

POST(加电自检)--> 系统引导(grub,efi)--> 启动内核 --> 初始化系统 --> 打印登录提示符

下面详细介绍下每个步骤的情况:1、BIOS启动

BIOS(Basic Input / Output System),又叫基本输入输出系统,这是一段程序,永久性的记录在主板上的ROM中,ROM中的内容一但写入则无法更改,所以上面的内容是只读的。现在高级了一点,用闪存代替了ROM,可以对BIOS程序进行升级。BIOS包括这几个内容:

● 自诊断程序                       #通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化

● CMOS设置程序                #引导过程中,通过特殊热键启动,进行设置后,存入CMOS RAM中

● 系统自动装载程序             #在系统自检成功后,将磁盘相对0道0扇区上的引导程序装入内存使其运行

● 主要I/O驱动程序              #BIOS和硬件直接打交道,需要加载I/O驱动程序

●中断服务    #主要用来在程序软件与微机硬件之间实现衔接

这些程序的具体执行过程如下:

1) 按下电源开关,电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了,它便撤去RESET信号,CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。

2)系统BIOS的启动代码首先进行POST(Power-On Self Test,加电后自检)。POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型;在正常情况下,POST过程进行得非常快,几乎无法感觉到它的存在。POST结束之后就会调用其它代码来进行更完整的硬件检测。

3)接下来系统BIOS将查找显卡的BIOS。前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡。此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

4)查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。

5)接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM,并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。

6)内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口和软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。

7) 标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备。每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。

8)到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。

9)接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。

10) ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序比较其放置MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。在确定之后,将该引导设备的MBR内容读入到0x7C00的位置,并再次判断其最后两位,当检测正确之后,进行阶段1(stage1)的引导。

加载了MBR后,就开始了系统的引导过程,系统的引导过程分2个阶段:stage1,stage2。主要的引导工作有stage2完成。其实在stage1和stage2之间还有一个stage1_5,stage1_5,是进入stage2的一个桥梁。先介绍一下MBR,MBR是Master Boot Record的缩写,位于硬盘的0柱面0磁道1扇区上,总大小512字节,一共由3部分组成:

● 1~446(字节): bootloader                  # 引导加载器,是一段程序

●   之后的64(字节):partation table#分区表

●  最后2(字节):5A#表示bootloader和分区表是否有效的标记位(MBR 以两个特殊数字的字节(0xAA55)结束。这个数字会用来进行 MBR 的有效性检查。)

5165bf9da6816b0b8319d73681af72ed.png

2、grub的stage1阶段

stage1部分占用了446字节,其代码文件是源码目录下stage1/stage1.S文件,汇编后生成一个512字节的boot.img,被写在硬盘的0柱面0磁道1扇区中,作为硬盘的MBR。stage1的工作很简单,就是加载0柱面0磁道2扇区上的512字节到0×8000(通过调用 BIOS INIT13中断完成),然后跳转到0×8000执行。 在0柱面0磁道2扇区上的512字节内容为stage1/start.S文件汇编后生成。该扇区上的内容的作用是加载stage1.5,并将控制权转交。

3、加载stage1.5 阶段

Stage1.5作用很单一,但是非常关键。它的主要功用就是构造一个boot分区系统对应的文件系统,这样可以通过文件系统的路径(/boot/grub/)寻找stage2过程需要的core.img,进而加载到内存中开始执行。

Stage1.5存在于0柱面磁道3扇区开始的地方,并一直延续十几k字节的区域,具体的大小与相应的文件系统的大小有关(文中涉及到了0柱面0磁道1-3+x扇区,这部分扇区为保留扇区,BIOS不会放置任何数据。Stage1.5过程被构建成多种不同类型,但是功能类似。e2fs_stage1_5(针对ext2fs,可引导ext2和ext3文件系统)、fat_stage1_5(针对fat文件系统,可引导fat32和fat16)、ffs_stage1_5、jfs_stage1_5、minix_stage1_5、reiserfs_stage1_5、vstafs_stage1_5和xfs_stage1_5,这些文件被称为stage1.5过程,这些文件每个至少都在11k以上(stage1.5支持的文件系统位于/boot/grub目录下,以stage1_5结尾的文件)。[root@baby-CentOS grub]# pwd

/boot/grub

[root@baby-CentOS grub]# ll

total 280

-rw-r--r--. 1 root root     63 May 29 16:23 device.map

-rw-r--r--. 1 root root  13380 May 29 16:23 e2fs_stage1_5

-rw-r--r--. 1 root root  12620 May 29 16:23 fat_stage1_5

-rw-r--r--. 1 root root  11748 May 29 16:23 ffs_stage1_5

-rw-------. 1 root root    769 May 29 16:43 grub.conf

-rw-r--r--. 1 root root  11756 May 29 16:23 iso9660_stage1_5

-rw-r--r--. 1 root root  13268 May 29 16:23 jfs_stage1_5

lrwxrwxrwx. 1 root root     11 May 29 16:23 menu.lst -> ./grub.conf

-rw-r--r--. 1 root root  11956 May 29 16:23 minix_stage1_5

-rw-r--r--. 1 root root  14412 May 29 16:23 reiserfs_stage1_5

-rw-r--r--. 1 root root   1341 Nov 15  2010 splash.xpm.gz

-rw-r--r--. 1 root root    512 May 29 16:23 stage1

-rw-r--r--. 1 root root 126100 May 29 16:23 stage2

-rw-r--r--. 1 root root  12024 May 29 16:23 ufs2_stage1_5

-rw-r--r--. 1 root root  11364 May 29 16:23 vstafs_stage1_5

-rw-r--r--. 1 root root  13964 May 29 16:23 xfs_stage1_5

除此之外还有两个比较特殊的文件,分别为nbgrub和pxegrub,这两个文件主要是在网络引导时使用,只是格式不同而已,他们很类似与stage2,只是需要建立网络来获取配置文件。 Stage1.5(0柱面0磁道3扇区开始,一直延续十几k字节)这中的内容是在安装grub时,安装程序通过判断/boot的文件系统类型,然后将这个文件系统安装至Stage1.5中。加载了stage1.5之后,引导程序就有了识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行,将控制权移交给stage2。

4、加载stage2阶段

stage2被载入内存之后,就会去解析grub的配置文件/boot/grub/grub.conf,然后根据配置文件中的指定,装载内核和initramfs。来看下grub.conf文件内容:default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.32-431.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=9d0bc805-83e7-4721-a22e-d78719566d51 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-431.el6.x86_64.img

default      #默认选择哪一个title

timeout     #菜单显示的超时时长

splashp_w_picpath=/path/to/some_p_w_picpath_file      #grub背景图片;此图片只能为14bits色,xpm格式,gzip压缩;

hiddenmenu               #是否隐藏菜单

title TILTE STRING       #菜单中的标题(每一个title为一个内核与其相应的配置数据)

root                             #指定根目录,(hd0,0)以第一块硬盘,第一个分区(/boot)为根目录

kernel                          #指定内核位置,后面为启动内核的参数

initrd                            #指定initrd位置

再来介绍一下initramfs,由于内核加载之后需要驱动所有的硬件,而这些驱动程序的模块就存放在initramfs中,它就是一个虚拟的根文件系统。由于linux内核需要支持不同类型的硬件架构,但是不可能把每一种硬件的驱动都集成到内核中,所以在安装操作系统时,安装程序会去判断当前机器的硬件类型,然后将对应的驱动模块放到initramfs中(安装程序集成了当前市场上绝大部分硬件的驱动模块),然后在加载内核时,随内核一起被加载至内存中。下面是initramfs中的内容(通过cpio解压得到),和根目录下的文件内容差不多:[root@baby-CentOS abc]# ls

bin        emergency  initqueue-finished     lib     pre-trigger  sys      var

cmdline      etc       initqueue-settled     lib64   pre-udev     sysroot

dev          init       initqueue-timeout    mount   proc         tmp

dracut-004-335.el6  initqueue  initramfs-2.6.32-431.el6.x86_64.img  pre-pivot  sbin         usr

在initramfs中也有init程序,所以内核的启动被分成两个阶段:先执行initramfs中的init脚本,这时内核的控制权交给了init文件,这个脚本完成的主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

5、运行/sbin/init完成系统初始化

/sbin/init启动之后,会先调用/etc/init/rcS.conf,这个文件内容不多,来看一下:start on startup

stop on runlevel

task

# Note: there can be no previous runlevel here, if we have one it's bad

# information (we enter rc1 not rcS for maintenance).  Run /etc/rc.d/rc

# without information so that it defaults to previous=N runlevel=S.

console output

pre-start script

for t in $(cat /proc/cmdline); do

case $t in

emergency)

start rcS-emergency

break

;;

esac

done

end script

exec /etc/rc.d/rc.sysinit                                 #执行/etc/rc.d/rc.sysinit

post-stop script

if [ "$UPSTART_EVENTS" = "startup" ]; then     #判断系统的启动级别

[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)

[ -z "$runlevel" ] && runlevel="3"

for t in $(cat /proc/cmdline); do

case $t in

-s|single|S|s) runlevel="S" ;;

[1-9])       runlevel="$t" ;;

esac

done

exec telinit $runlevel

fi

end script

这个脚本会先调用/etc/rc.d/rc.sysinit来完成系统的进一步初始化,/etc/rc.d/rc.sysinit对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。rc.sysinit所做的事情(不同的Linux发行版,该文件可能有些差异)如下:

(1)获取网络环境与主机类型。首先会读取网络环境设置文件”/etc/sysconfig/network”,获取主机名称与默认网关等网络环境。

(2)测试与载入内存设备/proc及usb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。

(3)决定是否启动SELinux。

(4)接口设备的检测与即插即用(pnp)参数的测试。

(5)用户自定义模块的加载。用户可以再”/etc/sysconfig/modules/*.modules”加入自定义的模块,此时会加载到系统中。

(6)加载核心的相关设置。按”/etc/sysctl.conf”这个文件的设置值配置功能。

(7)设置系统时间(clock)。

(8)设置终端的控制台的字形。

(9)设置raid及LVM等硬盘功能。

(10)检验磁盘文件系统(fsck)。

(11)进行磁盘配额quota的转换。

(12)重新以读写模式载入系统磁盘。

(13)启动quota功能。

(14)启动系统随机数设备(产生随机数功能)。

(15)清楚启动过程中的临时文件。

(16)将启动信息加载到”/var/log/dmesg”文件中。

当/etc/rc.d/rc.sysinit执行完后,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,因此便会执行下面的脚本。

/sbin/init执行完/etc/rc.d/rc.sysinit,会接着通过/etc/inittab文件判断系统的运行级别,然后调用/etc/rc.d/rc脚本,启动或者关闭/etc/rc.d/rc*.d(*=0~6)目录下的服务,如果运行级别是3,则对应的目录是/etc/rc.d/rc3.d。这些目录下的文件都是以S或K开头的软链接文件,均指向/etc/init.d目录下的服务启动脚本,S表示需要被开启的服务,K表示需要关闭的服务,S或K后面的数字表示优先级别,数字越小越优先启动或关闭。

完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。tty1,tty2,tty3…这表示在运行等级1,2,3,4的时候,都会执行”/sbin/mingetty”,而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。除了这6个之外还会执行”/etc/X11/prefdm-nodaemon”这个主要启动X-Window。

至此,系统就启动完毕了。

参阅:

1)http://www.yunweipai.com/archives/782.html

2)http://wenku.baidu.com/link?url=0Qi2fJ8xsPeSgV_nQ0s0HqqAfz2FAhNcyDE6imM7g89aKzZxHi9EQckJJ05-nbhF2jh9MBCFxazzDwKTpgZ9aUTADq9ekqkSQllSZqQsV3a

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值