(2)打造简单OS-开机BIOS初始化与MBR操作系统引导详解
================大概了解即可===============
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操作系统引导详解的更多相关文章
- linux系统开机自动挂载光驱 和 fstab文件详解
Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 607 https://xiexianbin.cn/lin ...
- Vue实例初始化的选项配置对象详解
Vue实例初始化的选项配置对象详解 1. Vue实例的的data对象 介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据.也是Vue的核心属性. 它是Vue绑定 ...
- BIOS+MBR操作系统引导方式
1. 主引导记录(Master Boot Record,缩写:MBR) 主引导记录又叫做主引导扇区,是计算机开机后启动操作系统时所必须要读取的硬盘首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)= ...
- [转载] CentOS系统开机自动挂载光驱 和 fstab文件详解
参考 http://blog.itpub.net/12272958/viewspace-676977/ 一.开机自动挂载光驱 1.按习惯,root用户,在/media目录下建立目录cdrom——mkd ...
- Java的初始化块及执行过程详解
问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...
- 打造简单OS-总目录
1-汇编写入引导区,虚拟机启动步骤 (了解即可) 2-开机BIOS初始化与MBR操作系统引导详解 (了解即可) 3-MBR引导区转移加载简单程序(突破512限制)(了解即可) 4-loader硬盘加载 ...
- (4.1)打造简单OS-小实验[图形显示]
主要是实现<简单打造OS>第四小节说到的一个图形界面的实验项目 1.mbr boot.inc ;------------- loader和kernel ---------- LOADER_ ...
- 使用Vs2005打造简单分页浏览器(1)原创
原文:使用Vs2005打造简单分页浏览器(1)原创 使用Vs2005打造简单分页浏览器(1)原创1引言2功能3实现过程以及关键点4总结5不足之处6其他7 代码下载 1 引言很早就有搞一个浏览器的 ...
- 纯手工打造简单分布式爬虫(Python)
前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...
随机推荐
- java -jar 参数前后位置说明
springboot项目启动的时候可以直接使用java -jar xxx.jar这样.下面说说参数的一些讲究 1.-DpropName=propValue的形式携带,要放在-jar参数前面 eg:ja ...
- java封装数据类型——Byte
Byte 是基本类型byte的封装类型.与Integer类似,Byte也提供了很多相同的方法,如 decode.toString.intValue.floatValue等,而且很多方法还是直接类型转换 ...
- Linux下如何挂载文件,并设置开机自动挂载
首先保证服务端安装了 查看是否安装命令: nfsstat yum install nfs-utils 安装nfs-utils 192.168.50.85(服务端)192.168.50.83(客户端) ...
- gradle上传jar包到maven公共仓库
首先这里说的中央仓库 是指的 https://issues.sonatype.org/ 而不是maven私服. 其次是使用gradle上传jar包,maven上传,网上有很多教程,这里不做赘述. 首选 ...
- c# 属性成员
- python编码和解码
一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的是高 ...
- 工程代码不编译src的java目录下的xml文件问题及解决
IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉.如果使用的是Eclipse,Eclip ...
- 常见错误 RuntimeError: expected type torch.FloatTensor but got torch.cuda.FloatTensor
https://www.jianshu.com/p/0be7a375bdbe https://blog.csdn.net/qq_38410428/article/details/82973895 计算 ...
- HTTP 状态码(常见及分析)
首先得明白状态码的几个大类: 状态码 响应类别 出现原因 1XX 信息性状态码(Informational) 服务器正在处理请求 2XX 成功状态码(Success) 请求已正常处理完毕 3XX 重定 ...
- 19 Jquery 属性
从 jQuery 1.6 开始, .prop()方法 方法返回 property 的值,而 .attr() 方法返回 attributes 的值. 例如, selectedIndex, tagName ...