当前位置:网站首页>操作系统之bios

操作系统之bios

2020-11-09 07:30:00 osc_veyfyz58

系统上电之后发生了什么

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