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

+------计算机系统启动流程----------------------------- --------------------+
|+-----------------+ +------------------+ +----------------+|
|| | | | | ||
|| 管理控制单元上电 |----->| cpu上电 |---->| BIOS引导 ||
|| | | | | ||
|+------------------+ +-------------------+ +-------+---------+|
| | |
| +-------<-------------------------<--------------+ |
| | |
| | |
|+---------+-------+ +------------------+ +----------------+|
|| | | | | ||
|| 加载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、

内核加载与linux的grub的更多相关文章

  1. Linux内核加载全流程

    无论是Linux还是Windows,在加电后的第一步都是先运行BIOS(Basic Input/Output System)程序——不知道是不是所以的电脑系统都是如此.BIOS保存在主板上的一个non ...

  2. bootm命令中地址参数,内核加载地址以及内核入口地址

    bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就 ...

  3. 基于TFTP方式加载启动Linux内核

            一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E63 ...

  4. Linux驱动之内核加载模块过程分析

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...

  5. Linux0.11内核--加载可执行二进制文件之3.exec

    最后剩下最核心的函数do_execve了,由于这里为了简单起见我不分析shell命令的情况, /* * 'do_execve()'函数执行一个新程序. */ //// execve()系统中断调用函数 ...

  6. Linux0.11内核--加载可执行二进制文件之1.copy_strings

    从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...

  7. 使用Windows安装的最高版本IE内核加载内嵌页(转载)

    客户端程序内嵌Webbrowser控件时,默认情况都是使用IE7兼容模式打开网页的.但是IE7有很多新的特性不支持,导致无法正常显示出来,所以需要强制使用高版本的IE内核来加载.渲染. void Ch ...

  8. 内核加载模块时提示usb_common: exports duplicate symbol of_usb_get_dr_mode

    1.分析: 既然符号重复了,那么说明有一个部分既被编译到内核中也被编译成模块了,因此在加载模块时,内核报符号重复的提示 2.解决 直接配置内核的某一部分编译成模块,例如笔者就直接将USB这一部分编译成 ...

  9. 内核加载模块时出现Unknown symbol等提示

    一.背景 1.更改了内核的配置,重新编译了内核 2.未重新编译内核模块 3.板子上只更新了内核,并未更新文件系统 二.分析 发现是在加载内核模块时出现Unknown symbol等信息,恰逢当时只更新 ...

随机推荐

  1. 新辰:4G时代怎样利用手机进行移动APP营销?

    未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的 ...

  2. 快照(Snapshot)

    一.定义: SNIA(存储网络行业协会)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像.快照可以是其所表示的数据的一个 ...

  3. jQuery插件开发方法

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧! 很多公司的 ...

  4. vs vsvim viemu vax 备忘

    使用gt和gT往返标签 gd:到达光标所在处函数或者变量的定义处. *:读取光标处的字符串,并且移动光标到它再次出现的地方. #:和上面的类似,但是是往反方向寻找. /text:从当前光标处开始搜索字 ...

  5. org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Internal Server Error 错误

    Solr报错: { "responseHeader": { "status": 500, "QTime": 11 }, "erro ...

  6. C++类的常成员函数

    让一个成员函数带上常量性是什么意思呢?通常的答案是,一个常成员函数不会更改其class对象.这是一种平凡的表述,而编译器实现的手法也相当平凡. 任何非静态成员函数其实都被编译器隐式插入了一个指针类型的 ...

  7. C++_基础_运算符重载2

    内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...

  8. A - 数塔

    A - 数塔 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  9. Fedora安装theano

    Fedora下安装theano Fedora下安装theano Theano的安装依赖很多包,有必须的,有可选的.此外,python版本必须大于2.6,请在shell直接键入python,如果小于2. ...

  10. MarkDown使用 (一)

    MarkDown的数学公式输入 MarkDown的数学公式输入 1.如何插入公式 LaTeX的数学公式有两种:行中公式和独立公式.行中公式放在文中与其它文字混编,独立公式单独成行. 行中公式可以用如下 ...