zoukankan      html  css  js  c++  java
  • 内核加载与linux的grub

      计算机系统的启动是一个复杂的过程,启动过程大致可以分为以下几个阶段:

    +------计算机系统启动流程----------------------------- --------------------+
    |+-------1----------+      +-------2-----------+     +-------3---------+|
    ||                  |      |                   |     |                 ||
    ||  管理控制单元上电  |----->|       cpu上电      |---->|    BIOS引导     ||
    ||                  |      |                   |     |                 ||
    |+------------------+      +-------------------+     +-------+---------+|
    |                                                            |          |
    |           +-------<-------------------------<--------------+          |
    |           |                                                           |
    |           |                                                           |
    |+-------4--+-------+      +-------5-----------+     +-------6---------+|
    ||                  |      |                   |     |                 ||
    ||    加载OS内核     |----->| 系统软硬件初始化    |---->|    启动init进程  ||
    ||                  |      |                   |     |                 ||
    |+------------------+      +-------------------+     +-----------------+|
    +-----------------------------------------------------------------------+

     其中最开始的2个阶段是属于机械物理过程,最后2个阶段主要是按照一定的顺序来执行软件程序,这几个阶段都较为直观简单,中间的2个阶段从BIOS开始到系统执行内核启动函数start_kernel()结束。

      那么先来说说bios,计算机基本输入输出系统,通俗点讲是保存在ROM的一组程序,计算机系统上电后cpu执行的第一个程序就是bios程序,这里有一个问题:

    在系统上电的一瞬间,内存、cpu相关的一些寄存器都是空白的,bios程序是如何开始执行的呢?

      从系统体系的角度看,既然bios不能由软件来触发执行,那么只能由硬件逻辑来实现。Intel 80x86 系列的cpu分为实模式和保护模式,实际上是,在cpu上电的一瞬间即进入实模式运行,同时硬件逻辑将cpu的cs寄存器和ip寄存器设置为:0xFFFF-0x0000,计算机体系将bios程序的入口写死在这个地址上,同时cpu在实模式下的地址即为绝对地址,cpu根据cs+ip找到了bios程序的入口的物理地址,load第一条bios指令到cpu开始执行。bios程序主要干两件事情:硬件检测和配置、加载os 的内核。注意bios程序是不会直接去加载os 内核的,那么:

    bios程序为什么不直接加载os 内核, os内核是由谁来加载的呢?

      从硬件设计的角度考虑,如果将内核加载的细节固化在硬件中,那么内核的设计和安装必须严格遵循这一套硬件逻辑,这无疑很大程度上限制了软件的灵活性,另外将内核加载细节固化在bios中,也增加了bios程序的复杂度。因此在bios和内核之间,增加了bootloader软件模块,内核的加载由内核对应的bootloader实现,bios不直接加载内核,bios启动bootloader程序,由bootloader程序来加载内核,对于linux 内核,其bootloader程序就是我们熟知的grub。那么:

    bios如果找到bootloader,bios找到bootloader加载到内存后,在执行bootloader前要做哪些初始化?

      接下来以linux os为依据,其他类型的os过程类似,linux kernel的bootloader为所熟知的grub程序(0.93 version),grub 一般会随 linux os一起安装。grub的引导分成了几个阶段:stage1、stage1.5、stage2,软件层面上对应于几个独立的软件模块,stage1的代码文件,是源码目录下stage1/stage1.S,汇编后便成了一个512字节的img,被写在硬盘的0面0道1扇区,作为硬盘的主引导扇区,主引导扇区=主引导记录 MBR+磁盘分区表 DPT。Stage1作为grub引导的开始,并且Stage1被放在磁盘的固定位置0面0道1扇区,因此在硬件逻辑实现上bios例程启动grub引导的过程是:bios通过raw read读0面0道1扇区的512字节到内存,至此bios引导结束,控制权交给grub 并开始grub 引导。

    grub的引导流程?

      grub(.93version)的大致引导过程:stage1--->start--->stage1.5--->stage2--->OS kernel。

      

    待续~~~~

    参考资料: 

    1、http://www.linuxsir.org/bbs/thread170348.html?pageon=2

    2、

  • 相关阅读:
    深入理解HTTP协议及原理分析
    如何提高php应用的性能?
    PHP的网站主要攻击方式有哪些?
    五种常见的 PHP 设计模式
    排序算法之插入排序类
    排序算法之交换排序类
    Redis之Zset
    Redis之Set
    Redis之List
    Redis之Hash
  • 原文地址:https://www.cnblogs.com/VincentXu/p/3654174.html
Copyright © 2011-2022 走看看