系统启动流程

将系统自检(BIOS)需要用到的指令,映射进CPU可以查找的线性地址空间(ROM),用来检查硬件是否正常。

                                          内核空间                        用户空间

POST---->BIOS(启动顺序)------>MBR(BootLoader,446B)找到启动分区------>Kernel(探测硬件,装载驱动)------initrd----->(ROOTFS)------>init进程/sbin/init

详解启动过程:

bootloader(MBR):由OS安装程序提供,但不属于任何OS,win8系统以后,安装windows OS,会将bootloader锁死,不能再安装其他OS,除非清掉MBR,这样就无法引导

win8了。(linux可以引导其他OS)

linux常见bootloader:

    LILO:linux Loader(不支持8G以上的分区)

    GROB:GRand Unified Bootloader  

         分为2个阶段,阶段1:位于MBR。阶段1的作用是引导阶段2;阶段2:引导OS,位于跟内核同分区中,/boot/grub/目录

     

    

init要完成的工作:

运行级别:启动的服务不同,级别不同

   0  关机

   1 单用户模式(类似于windows 安全模式),直接以root用户切入,不需要用户名和密码

   2 多用户模式,不启用NFS模式

   3 多用户模式,文本模式

   4  保留

   5  多用户模式,图形界面

   6  重启

  $cat /etc/inittab  命令修改

Kernel作用:文件管理、进程管理、内存管理、网络管理、安全功能、驱动程序

内核设计风格:

      单内核:一个内核安装所有(linux)

           模块化设计:

                 .ko(kernel object)内核专用模块,核心:很小

       .so():外部so模块(内核模块)

                  内核模块:/lib/modules/“内核版本号命令的目录”/   如:/lib/modules/2.6.32/  (作用:减少内核的体积)

                   备注:能够做成内核模块的不仅仅是驱动程序,还有其他的,如:文件系统、加密功能、进程管理的扩展功能

      [root@localhost ~]# ls /lib/modules/2.6.32-358.el6.x86_64/kernel/
      arch crypto drivers fs kernel lib mm net sound

           核心:可以动态加载各种外围内核模块: 当内核识别到一个外围硬件,如:显卡,那么内核的核心会取固定的位置,装载进核心即可,这样内核就可以操作硬件了。 

                  /boot/vmlinuz-2.6.32-358.el6.x86_64

                  初始化时,加载的内核,只是核心本身。

      微内核:需要哪个子系统,取装载就可以。一个子系统,坏了。不影响全局。(实现复杂)(windows,solaris 支持线程)

备注:

1)按启动顺序读取硬盘设备的MBR,如果第一个硬盘MBR无BootLoader,则读第2个硬盘。但如果第一个硬盘

有MBR,但BootLoader损坏,则不会读取第2个硬盘设备。

2)Kernel装载前提:BootLoader识别Kernel所在分区

3)有些目录无法挂载成一个分区,这些目录是与根目录(/)自身完成初始化相关的目录。由于其他目录都是通过根目录才能访问,因此根所在的

分区,通常就是kernel 能够完成进入用户空间的最核心的位置。根所在的分区,叫rootfs(根文件系统),由此把某个分区与/进行了关联关系(挂载)

那么根所在的分区,就是启动OS的入口。系统启动需要的文件在/sbin /bin下,所以这些目录不能独立分区。

取哪找根:由kernel完成,kernel必须装载根目录。然后才能进入用户空间。kernel怎么知道根存在哪个分区?需要指定

4)根文件系统存在与要给硬盘上,假设OS安装包,没有为内核提供此硬盘的驱动程序?那么内核不能访问这个硬盘设备,就无法装载根,这样就无法访问

根下的文件,同样访问不了/lib/modules目录,这样意味着装载不了驱动。这样就有个问题:要想访问根,就需要装载驱动。要想装载驱动,就必须访问根。这样

就矛盾了。(内核要驱动此硬盘,而驱动程序就在硬盘上)解决方法:

    OS安装程序,知道内核有没有硬盘的驱动程序,如果没有,在安装最后一步,会通过脚本动态搜集内核要访问硬盘需要哪些内核模块,并动态生成这个文件(

此文件存在于:1)RHEL5存在ramdisk中,文件名叫initrd,2)RHEL6存在于ramfs,文件名叫initramfs中),这个文件就是虚根,包括:/bin /sbin /lib等,系统启动后,会切换根。将虚根中的/proc /sys /dev 3个目录拷贝到新根。

根切换命令:chroot

#mkdir /test/virroot -pv  #创建虚根

#mkdir /test/virroot/bin

#cp /bin/bash /test/virroot/bin/

拷贝/bin/bash所依赖的库拷贝到虚根中

#ldd /bin/bash   #查看可执行程序所依赖的共享库

#mkdir /test/virroot/lib

#cp 依赖的库文件 /test/virroot/lib

#chroot /test/virroot/   切换根

111
原文地址:https://www.cnblogs.com/zmdsg/p/7327822.html