================大概了解即可===============

1、BIOS的工作:

我们的计算机在开机之前,它是一个纯硬件的机器,但是从按下开机按钮的那一刻起,ROM上的固化程序就开始为操作系统这个重要的软件进行初始化工作,初始化工作完成以后,将操作系统内核加载到内存中,操作系统就会帮助我们管理各种硬件资源,带给了用户良好的体验。我们普通用户通常都不关心,在电脑启动时具体都做了什么,但是作为一个IT行业的从业人员或者即将作为一名IT行业的从业人员,尤其是作为一个搞技术开发的从业人员,对于计算机是如何启动的有必要了解一二。

(1)、纯硬件检测与BIOS初始化阶段:

首先,在我们按下开机按钮的时候,供电系统向计算机主板和其他硬件设备供电。刚开机时电压不太稳定(但是会快速稳定下来),所以计算机主控芯片组会向CPU发出并保持一个RESET重置信号,让CPU自动恢复到初始状态,当主控芯片组检测到稳定供电后,便撤去RESET信号,此时程序计数器初始化置为FFFF:0H(硬件芯片初始化地址,和软件没关系),CPU开始从FFFF:0H处执行指令,这个地址只有一条指令jmp START,FFFF:0H是BIOS(Basic Input Output System) ROM的起始地址,但不是有效指令开始地址,jmp指令跳转的START是真正进行BIOS程序起始地址(如图)。

(2)BIOS进行显卡、CPU检测并设置BIOS: 

           系统BIOS启动后,进行一系列硬件检测与程序初始化:先检测关键设备电路,如果设备异常则发出警报并死机。然后进行显卡检测,调用显卡BIOS的代码(C000:0H处),初始化显卡,如果显卡不正常则黑屏(不正常不能显示,所以黑屏),正常则屏幕显示显卡信息,并返回系统BIOS接着进行检测其它设备是否正常。其它设备不正常则等待处理,正常则屏幕显示系统BIOS信息。接着检测CPU,如果出错则蓝屏死机,正常则进行BIOS设置检测,如果需要设置BIOS则先进行BIOS设置,然后退出BIOS设置界面进行标准硬件设备检测,如果不需要设置BIOS则直接进行标准硬件设备检测(如图)。

(3)其它设备检测更新与CPU控制权限转交: 

           在完成BIOS设置之后,需要进行两步操作,①检测是否存在即插即用设备,如果存在则为即插即用设备分配资源,不存在则直接进行系统BIOS清屏;②检测是否存在硬件设备的更新,如果存在硬件更新,存放于CMOS之中的系统硬件信息就需要进行修改,进行ESCD(Extended System Configuration Data)更新(ESCD是系统BIOS与操作系统进行硬件配置信息交换的一种手段),更新完毕先要把BIOS提供的中断例程的入口地址登记在中断向量表中,然后进入指定启动项(BIOS设置中设置的优先启动顺序:软盘、硬盘、U盘或光盘)。

假设是硬盘启动,系统BIOS读取硬盘0盘面0磁道1扇区的MBR(主引导记录)到内存中指定区域(具体是BIOS提供的int 19中断例程加载MBR到RAM的0X00007C00H开始处),设置程序计数器到指定区域(EIP=0X00007C00),然后CPU开始执行MBR的指令(即CPU使用权交由MBR来掌控)。

(4)MBR的工作: 

         MBR会先检查硬盘分区表,然后根据硬盘分区表找到硬盘上的引导分区,将引导分区的首扇区(boot loader)内容调入内存,boot loader中的ntdlr(Windows引导程序)启动mini-file system divers以便能识别NEFS和FAT32的文件系统的硬盘分区。或者grub(Linux引导程序)启动vmlinuz-version和initrd-version.img(eg:Centos5.5中的/boot/vmlinuz-2.6.18-194.el5和/boot/initrd-2.6.18-194.el5.img)。便完成MBR的引导过程。

注:/boot/vmlinuz-2.6.18-194.el5 和/boot/initrd-2.6.18-194.el5.img分别是Linux内核文件与initrd文件(boot loader initialized RAM disk),具体介绍可参考:Linux2.6 内核的 Initrd 机制解析

2、MBR与boot sector的关系:

在最开始接触MBR和boot sector、boot loader、grub、ntdlr这些概念的时候,脑子是一片混乱,直到我做了一个实验(即后面要提到的的三系统引导实验)之后才彻底搞清楚:

在安装系统的一个磁盘上有多个分区,第一个分区是主分区(从1柱面开始),主分区之前有一个柱面,其第一个扇区是MBR(0面0道1扇区),之后便是各个分区,每个分区的第一个扇区都是一个boot sector(存放引导加载程序“boot loader”)。而MBR是0面0道1扇区即首个boot sector中存放的boot loader,只不过广义的MBR中不仅仅有引导记录。在安装Linux时如果需要为/boot分区分配一些空间,/boot是用来存放操作系统内核的启动文件与配置文件,而grub是Linux系统的引导程序,在/boot/grub/grub.conf中记录着grub的基本配置信息。ntldr是windows上的boot loader。

总的来说: 

①广义MBR(512Byte)和boot sector都是一个扇区,boot sector是每个分区的第一个扇区,而MBR是磁盘的第一个扇区。 

②boot loader和狭义MBR(446Byte)是引导加载程序,负责加载系统内核、提供引导选项或转交引导权限给其它boot loader(关于这三种功能我们稍后一一会遇到)。Linux的grub和Windows的ntldr都是boot loader的具体程序。

关系如下所示(这是先装了一个Windows7再装了一个Redhat后的MBR与boot loader情况,Linux的grub改写了原本直接引导Windwos的MBR,将Linux的grub写到了MBR里,所以MBR可以直接引导Linux,当然也有可以间接通过/dev/sda3中的grub来引导):

上面已经提到了boot loader的三种情况:①直接引导kernel、②转交其它boot loader来引导,③提供菜单选项(选择1还是2,即选择双系统的Windows7还是Redhat)。

原文地址:

https://blog.csdn.net/Apollon_krj/article/details/77869770

(2)打造简单OS-开机BIOS初始化与MBR操作系统引导详解的更多相关文章

  1. linux系统开机自动挂载光驱 和 fstab文件详解

    Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 607 https://xiexianbin.cn/lin ...

  2. Vue实例初始化的选项配置对象详解

    Vue实例初始化的选项配置对象详解 1. Vue实例的的data对象 介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据.也是Vue的核心属性. 它是Vue绑定 ...

  3. BIOS+MBR操作系统引导方式

    1. 主引导记录(Master Boot Record,缩写:MBR) 主引导记录又叫做主引导扇区,是计算机开机后启动操作系统时所必须要读取的硬盘首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)= ...

  4. [转载] CentOS系统开机自动挂载光驱 和 fstab文件详解

    参考 http://blog.itpub.net/12272958/viewspace-676977/ 一.开机自动挂载光驱 1.按习惯,root用户,在/media目录下建立目录cdrom——mkd ...

  5. Java的初始化块及执行过程详解

    问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...

  6. 打造简单OS-总目录

    1-汇编写入引导区,虚拟机启动步骤 (了解即可) 2-开机BIOS初始化与MBR操作系统引导详解 (了解即可) 3-MBR引导区转移加载简单程序(突破512限制)(了解即可) 4-loader硬盘加载 ...

  7. (4.1)打造简单OS-小实验[图形显示]

    主要是实现<简单打造OS>第四小节说到的一个图形界面的实验项目 1.mbr boot.inc ;------------- loader和kernel ---------- LOADER_ ...

  8. 使用Vs2005打造简单分页浏览器(1)原创

    原文:使用Vs2005打造简单分页浏览器(1)原创 使用Vs2005打造简单分页浏览器(1)原创1引言2功能3实现过程以及关键点4总结5不足之处6其他7 代码下载 1    引言很早就有搞一个浏览器的 ...

  9. 纯手工打造简单分布式爬虫(Python)

    前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...

随机推荐

  1. Oracle触发器编译错误及解决方案

    错误 TRIGGER **** 编译错误 错误:PLS-00103: 出现符号 "END"在需要下列之一时:        ( begin case declare exit    ...

  2. Python、PyCharm、Django框架安装

    一.下载Python环境 1.1 下载Python环境,以下网址: https://www.python.org/downloads/release/python-373/ 下载安装包: 1.2点击安 ...

  3. Intellij的Terminal框里输入npm无效

    Intellij的Terminal框里输入npm无效,解决办法: 1.安装node.js的时候选择全部安装: 2.在intellij的file->settings->Tools->T ...

  4. linux命令管道符

    linux多命令 ; 多个命令互相不影响 a && b  a命令执行成功才执行b命令 a || b a成功不执行b  a失败执行b ifconfig && echo & ...

  5. MongoDB的基础概念

    1.MongoDB和传统数据库的概念区别 database       database        数据库table           collection    数据库表/集合row      ...

  6. KVM虚拟化——简介

    KVM 基于内核的虚拟机KVM(Kernel-Based Virtual Machine)是2007年问世的开源虚拟化解决方案.KVM需要两个条件: ①硬件支持全虚拟化 ②操作系统为Linux KVM ...

  7. Windows server 2012 利用ntdsutil工具实现AD角色转移及删除域控方法

    场景1:主域控制器与辅助域控制器运行正常,相互间可以实现AD复制功能.需要把辅助域控制器提升为主域控制器 ,把主域控制器降级为普通成员服务器:这种场景一般应用到原主域控制器进行系统升级(先转移域角色, ...

  8. PowerMockito单元测试中的Invalid use of argument matchers问题详解

    首先,简单说说PowerMockito进行单元测试的三部曲: 打桩,即为非测试目标方法设置返回值,这些返回值在测试目标方法中被使用.执行测试,调用测试目标方法.验证测试结果,如测试方法是否被执行,测试 ...

  9. 【数组模拟-小顶堆的插入构造/遍历】PAT-L2-012.-关于堆的判断--数组模拟

    L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ar ...

  10. NodeJS开发博客(二) 接入数据库

    1. mysql 数据库下载网址:https://dev.mysql.com/downloads/mysql/ 账号是 root 密码是 a1************ 网站账号是邮箱,密码是 Aa1* ...