当前位置:网站首页>操作系统之bios
操作系统之bios
2020-11-09 07:30:00 【osc_veyfyz58】
操作系统之bios、mbr
系统上电之后发生了什么
bios是每个芯片出场的每个厂家写死在rom中的一段代码,这段代码在系统一开始上电之后首先运行的代码,负责检查电脑硬件是否存在问题,确认没有任何问题之后,会去内存中找到主引导扇区mbr,将主引导扇区加载至0c7c00的地址(这一部分后面会具体解释),mbr会负责将处于磁盘中的操作系统加载进来,然后将控制权交给操作系统,至此,控制权交给操作系统。
bios相关内容
bios的代码是一开始便写好的,放在rom里面,所以,cpu一开始应该找到rom中bios的地址,然后加载至cpu中进行执行,这部分是怎么实现的呢?
首先,最初的操作系统是8086系统,后面的操作系统都兼容了8086,所以在一开始的实模式下都类似于8086系统,所以接下来我们讨论8086系统。
8086是16位的cpu,但是有20根地址总线,所以,采用基址+偏移量的方式寻址,使寻址空间增加到2^20,也就是1M的空间(高16位左移4位,加上低16位)。
所以,一开始的rom放在哪里决定了后面的系统一开始上电的时候去哪个地址寻址。
由于不同的计算机厂商生产的计算机所带的外设不一样,因此,这段程序大小也限机型的不同而不一样,如果厂商A的rom大小有1K,厂商B的rom大小有2K,那么程序员开始地址就会不一致,为了方便程序员,决定将rom的代码放在1M的最后面,这样程序员使用的时候就可以从0开始写代码,那么问题又来了,将BIOS这段程序放在1M内存的顶部,如果这段程序大小为1K,那么应当从0xFFC00开始放。如果这段程序的大小为2K,那 么应当从0xFF800开始放,对于CPU而言,到底是应当从0xFFC00开始执行还是应当从0xFF800开始执行呢?
为了解决这个问题,8086规 定,CPU均从0xFFFF0处开始执行,而在0xFFFF0处,放一条无条件转移指令JMP。如果A厂的BIOS是从0xFFC00开始放的,那么这条 转移指令就跳转到0xFFC00处开始执行。如果B厂的BIOS是从0xFF800开始放的,那么这条转移指令就跳转到0xFF800处开始执行,各个厂 家可以跟据自己所生产的BIOS程序的大小,来决定此转移指令具体跳转到的位置。
至此,系统已经知道了上电后应该怎么做,bios在检查完硬件之后,便开始决定加载os。
PS:我们说bios放在rom中,那为什么会影响到内存呢,如下图所示:
rom和ram统一编址,一开始的的1M使包括rom的。

mbr相关内容
mbr又叫主引导扇区,使负责将os从磁盘加载至内存的,为什么不让bios直接将os加载至内存呢?
因为在机器出厂时,不能限制磁盘去只用某种文件系统,而BIOS不可能去识别支持所有文件系统程序。因此为了灵活性,就通过加载程序读OS。
mbr的大小是512个字节,最后两个字节是0x55和0xAA,为什么是这两个字节呢?(百度到的是总要有个结束标志),这两个字节的作用是作为mbr的结束标志,如果没有这两个结束标志,cpu会认为磁盘没有初始化,
mbr为什么是512个字节呢,这是因为mbr里面负责加载os的二进制代码共446个字节,然后磁盘有4个分区,每个分区的信息有64bytes,还有最后两个字节作为结束标志,446+64+2=512bytes
主引导扇区都干了什么?主要是负责读写磁盘的,先是打开保护模式,然后初始化gdt,访问磁盘。
为什么mbr要放在0x7c00的位置?
操作系统共需要32KB的大小,它同样是放在了末尾。
0x7ffff-512-512+1=0x7c00,另外一个512是主引导扇区本身产生的数据。
操作系统被放在了哪里?
0x100000,也就是bios1M的后面。
至此,操作系统的加载过车给已经结束。
写在最后
本文章参考了很多文章,如果觉得被抄袭,请及时联系我,并深感抱歉。
版权声明
本文为[osc_veyfyz58]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4416364/blog/4708502
边栏推荐
- Table join
- 老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”
- On buffer overflow
- 23 pictures, take you to the recommended system
- 非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue
- 1. What does the operating system do?
- Esockettimeout solution in request in nodejs
- object
- Several common playing methods of sub database and sub table and how to solve the problem of cross database query
- B. protocal has 7000eth assets in one week!
猜你喜欢

Investigation of solutions to rabbitmq cleft brain problem

c++11-17 模板核心知识(二)—— 类模板

How to analyze Android anr problems

FC 游戏机的工作原理是怎样的?

Flink's datasource Trilogy 3: customization

A solution to the problem that color picker (palette) cannot use shortcut keys in sublime Text3 plug-in

C++之异常捕获和处理

Concurrent linked queue: a non blocking unbounded thread safe queue

salesforce零基础学习(九十八)Salesforce Connect & External Object

APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!
随机推荐
Introduction skills of big data software learning
When we talk about data quality, what are we talking about?
Have you ever thought about why the transaction and refund have to be split into different tables
服务网格仍然很难 - cncf
C/C++编程笔记:指针篇!从内存理解指针,让你完全搞懂指针
Flink's datasource Trilogy 3: customization
架构中台图
Chapter 5 programming
The vowels in the inverted string of leetcode
c++11-17 模板核心知识(二)—— 类模板
Bifrost 之 文件队列(一)
OSChina 周一乱弹 —— 程序媛的青春
App crashed inexplicably. At first, it thought it was the case of the name in the header. Finally, it was found that it was the fault of the container!
Why don't we use graphql? - Wundergraph
Core knowledge of C + + 11-17 template (2) -- class template
android开发中提示:requires permission android.permission write_settings解决方法
华为HCIA笔记
File queue in Bifrost (1)
Leetcode-11: container with the most water
自然语言处理(NLP)路线图 - kdnuggets