• 系统启动流程


    将系统自检(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
  • 相关阅读:
    源代码的下载和翻译
    Git使用入门
    搭建Andriod开发环境
    Andriod系统移植与驱动开发概述
    直观打印二叉树
    深度优先遍历图(DFS)
    《UNIX网络编程 卷1 套接字联网API》(第三版)阅读笔记----2018.5.22
    C/C++
    实现具有getMin功能的栈
    用两个栈来模拟一个队列
  • 原文地址:https://www.cnblogs.com/zmdsg/p/7327822.html
Copyright © 2020-2023  润新知