深入剖析Linux系统启动流程和系统初始化

一 Linux系统启动流程

POST --> BIOS (Boot Sequence) --> MBR(bootloader)
-> Kernel (CentOS5: initrd, CentOS6: initramfs)
-> /sbin/init (CentOS5:/etc/inittab, CentOS6:
/etc/inittab, /etc/init/*.conf)

wKiom1MT_EzDv83cAAHhezFxcTU247.jpg


二 启动详解

   (1)POST自检


POST自检:第一步就是CPU加电然后寻址,而CPU寻址所需的代码指令
来自于ROM->硬件厂商制作(内存分为ROM+RAM),关于CPU如何找到
指令代码的?硬件的设计的思想就是:CPU懂的去特定的位置去寻找
代码,而代码得存贮者ROM就应该在特定的位置。与此同时POST自检
还会检测内存,主板,显卡,声卡,网卡等I/O设备,等一切没有
问题POST自检完成!将工作移交给BIOS去处理


   (2)BIOS

BIOS:(Boot Sequence)加载可选择的启动设备->固件厂商制造
Bios中存放着各种I/O设备的信息参数、系统时间、启动寻找顺序
所以必须要检测Bios是否正常。之后会去加载第一个硬盘设备


(3)MBR

MBR:硬盘的主引导记录,存在于0磁道第0扇区,共512字节。其中Bootloader占据
446字节,分区表占据64字节,magic num占据2字节。MBR将加载Bootloader去开始
后边的工作


  (4)Bootloader


Bootloader(内核加载器)位于第0磁道第0扇区的446字节是最前边
的446字节哦!Bootloader的工作机制:bootloader可以访问文件系
统,而内核则作为文件而存在。所以bootloader可以访问内核文件,
深入的说bootloader访问内核文件时,是将内核文件Vmlinz所在的
整个分区当作根去访问的,如访问/Vmlinz  而根"/"本身的存在位置
是由内核文件自己决定。(因为每个文件必须要有一个自己的起始路径)
能理解这种逻辑吗?
现代我们常用的内核加载器是grub(Grand Unified Bootloader)
以此grub来加载内核。加载内核之前grub所做的工作

     第一步  1) grub将内核文件Vmlinz 和 grub自己加载到了/boot上,

      同时也在/boot上存放了所有模块的驱动程序xxx.img文件

      用ll /boot 查看

wKioL1MUKsLTYuQPAAHKwWdhXbs538.jpg         2) 接下来让我们查看grub目录中存放的是什么

wKioL1MULNSxn_nzAAI1Ktd09FM261.jpg

       grub目录中存放着grub.conf自身配置文件,device.map磁盘映射图(映射分区/boot和/根分区)

       你会看到有stage1 stage2  还有各种stage1.5

1st stage: 位于MBR中,为了引导2nd stage
1.5 stage: 位于boot基本磁盘分区中,为识别
内核文件所在的文件系统提供文件系统识别扩展(因为我们上边
提到过grub只能识别基本的文件系统,而内核文件不可能没有高
级的文件系统,所以需要赋予grub能识别内核高级文件系统的扩
展功能)
2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序


           3)查看grub.conf文件内容和 device.map文件内容

wKiom1MUOZWDn292AALgsk3fdKA712.jpg

wKiom1MUOpDgpEoDAABzt_BwQLo398.jpg


第二步 1) 上边我们已经提到grub目录中存放着device.map磁盘映射分区,接下来我们去查看

                    映射的根分区/(内核真正挂载的分区)中的各种模块所在的路径

wKiom1MUNajx5f-9AAFmaftdg3o773.jpg

            2)接下来查看路径下的各个模块.ko文件

wKioL1MUNi_TNra3AAHLlsTwZqE523.jpg

   (5)Kernerl

Linux属于单核系统:Kernel+各种外围模块组成
通过grub加载内核后,内核开始自我解压并工作
通过虚拟根文件系统initrfs 调用init工作



    (6)/sbin/init  以CentOS6为例


/sbin/init程序被内核第一个所调用,所以init的PID号为1
init调用其配置文件/etc/inittable 和启动脚本/etc/init/rcS.conf
从而启动各个子进程

    /etc/inittablewKiom1MUSZzj8bavAALL9u08ygU106.jpg


  /etc/rc.d 目录中存放着123456运行级别的目录

wKioL1MUTR7iX5TuAAHUrgjU_7Y206.jpg

  以rc3.d为例,目录中存放着进程, 进程运行级别 ,进程状态(K为开启、S为关闭)――>

 init就是控制进程是K还是S得总管 (当系统在1 2 3 4 5 6 之间切换时由父进程fork而来的

 子进程就会在K与S之间切换状态)

wKioL1MUTU-RuymlAASZ5GGsW3M491.jpg

 PS:以上为个人理解的Linix启动和初始化流程,如果有问题请各位大神细心指点    




绳命是如此的精彩~



你可能感兴趣的:(初始化,linux启动流程)