当前位置:网站首页>操作系统之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
边栏推荐
- Share API on the web
- Core knowledge of C + + 11-17 template (2) -- class template
- 数据库设计:范式与反范式
- 23张图,带你入门推荐系统
- VIM Introduction Manual, (vs Code)
- A few lines of code can easily transfer traceid across systems, so you don't have to worry about losing the log!
- Platform in architecture
- Database design: paradigms and anti paradigms
- APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!
- Introduction to nmon
猜你喜欢
Introduction to nmon
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
Web上的分享(Share)API
Android emulator error: x86 emulation currently requires hardware acceleration solution
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!
OpenGL ES 框架详细解析(八) —— OpenGL ES 设计指南
Factory Pattern模式(简单工厂、工厂方法、抽象工厂模式)
SQL语句的执行
Realization of file copy
20201108 programming exercise exercise 3
随机推荐
The difference between GDI and OpenGL
Realization of file copy
C++邻接矩阵
通过canvas获取视频第一帧封面图
Sublime text3 插件ColorPicker(调色板)不能使用快捷键的解决方法
23 pictures, take you to the recommended system
STS安装
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
A few lines of code can easily transfer traceid across systems, so you don't have to worry about losing the log!
Android emulator error: x86 emulation currently requires hardware acceleration solution
链表
Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
Copy on write collection -- copyonwritearraylist
RabbitMQ脑裂问题解决方案调查
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
Introduction to nmon
Salesforce connect & external object
Have you ever thought about why the transaction and refund have to be split into different tables
Web上的分享(Share)API
leetcode之反转字符串中的元音字母