一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00

为什么是0x7c00

计算机执行到这份上,bios也即将完成自己的历史使命了,完成之后,它又将睡去。想到这里,心中不免一丝忧伤,甚至有些许挽留它的想法。可是,这就是它的命,它生来被设计成这样,在它短暂的一生中已经为后人创造了足够的精彩。何况,在下一次开机时,bios还会重复这段轮回,它并没有消失。好了,让伤感停止,让梦想前行。

先说重点,bios最后一项工作校验启动盘中,位于0盘0道1扇区的内容。在此插播一段小告示:在计算机中是习惯以0做为起始索引的,因为人们已经习惯了偏移量的概念,无论是机器眼里和程序员眼里,用“相对”的概念,即偏移量来表示位置显得很直观,所以很多指令中的操作数都是用偏移量表示的。0盘0道1扇区本质上就相当于0盘0道0扇区。为什么称为1呢,因为硬盘扇区的表示法有两种,我们描述0盘0道1扇区用的便是其中的一种:CHS方法,即柱面Cylinder 磁头Header 扇区Sector(另外一种是LBA方式,暂不关心),“0盘”说的是0磁头,因为一张盘是有上下两个盘面的,一个盘面上对应一个磁头,所以用磁头Header来表示盘面。“0道”是指0柱面,柱面Cylinder指的是所有盘面上、编号相同的磁道的集合,形象一点描述就是把很多环叠摞在一起的样子,组合在一起之后是一个立体的管状。“1扇区”才是我们要解释的部分,将磁道等距划分成一段段的小区间,由于磁道是圆形,确切地说是圆环,所以这些被划分出来的小区间便是扇形,所以称为扇区。好了,背景交待完了,重点来了,在CHS方式中扇区的编号是从1开始的,不是0,不是0,原谅我说了两次,良苦用心你懂的,所以0盘0道1扇区是其实就相当于0盘0道0扇区,它就是磁盘上最开始的那个扇区。而LBA方式中,扇区编号是从0开始的。关于硬盘的知识我会在以后章节专门来讲,这里我若没表达清楚,大家先不要着急,只要知道MBR所在的位置是磁盘上最开始的那个扇区就行了。继续说,如果此扇区末尾的两个字节分别是魔数0x55和0xaa,bios便认为此扇区中确实存在可执行的程序(在此先剧透一下,此程序便是久闻大名的主引导记录MBR),便加载到物理地址0x7c00,随后跳转到此地址,继续执行。

这里有个小细节,bios跳转到0x7c00是用jmp 0:0x7c00实现的,这是jmp指令的直接绝对远转移用法,段寄存器cs会被替换,这里的段基址是0,即cs由之前的0xf000变成了0。如果此扇区的最后2个不是0x55和0xaa,即使里面有可执行代码也无济于事了,bios不认,它也许还认为此扇区是没格干净呢,嘿嘿。

不过,这就又抛出两个问题:

  1. 1.为什么是0盘0道1扇区的内容。
  2. 2.为什么是物理地址0x7c00而不是个好记或好看的其它地址。

先回答第1个,我想这个问题不用官方解释了,因为官方确实没什么好说的,不过他们出于尊重客户,还是会像我一样说出类似下面的话。

我就个人观点给大家一个理由,未经核实,仅是自己一面之词,请大家提高警惕,小心谨慎^—^。

在计算机中处处充满了协议、约定,所以,将0盘0道1扇区做为mbr的栖身之地,我完全可以理解为规定。我们反证一下,如果不存在这个“规定”,会发生什么。当然,此扇区最初是给bios使用的,咱们设想一下bios的工作将变成怎样。

主引导记mbr是段程序,无论是位于软盘、硬盘、或者其它介质,总该有个地方保存它。Ok,现在不告诉bios 它存储在哪个位置了。bios只好将所有检测到的存储设备上的每一个存储单位都翻一遍,挨个对比,如果发现该存储单位最后的两个字节是0x55和0xaa,就认为它mbr。这就好比查字典一样,不用偏旁部首和拼音检索的方法,只能一页一页翻了。

几经花开花落,找到mbr的那一刻,bios满脸疲惫地说:“你是我找了好久好久的那个人”。mbr抬起经不起岁月等待的脸:“难得你还认得我,我等你等到花儿都谢了”。其实bios的心声是:“看我手忙脚乱的样子,你们这是要闹哪样啊。就那么512字节的内容,害我找遍全世界,我们是在跑接力赛啊,下一棒的选手我都不知道在哪里……以后让它站在固定的位置等我!”。

由于0盘0道1扇区是磁盘的第一个扇区,mbr选择了离bios最近的位置站好了,从此以后再也不担心被bios骂了。

计算机中处处有固定写死的东西,还用举个例子吗?不用了吧?因为任何一个魔数都是啊^_^,有请下一个魔数0x7c00登场。

至于0x7c00,很久之前,比我好奇心大的人查遍了intel开发手册都没找到相关的说明。要想知道事情的来龙去脉,还是要从个人电脑的老祖宗说起,同样是很久很久以前……1981年8月,IBM公司生产了世界上第一台个人电脑PC 5150,所以它就是现代x86个人电脑兼容机的祖先。说到有关历史的东西,不给来点真相就感觉气场不足,上图啦,这是IBM PC 5150,有没有感受到计算机文化底蕴呢。

一步步编写操作系统 8  bios跳转到神奇的内存地址0x7c00

 

既然intel开发手册中没有相关说明,那咱们就朝其它方向找答案,换句话说,既然不是cpu的硬性规定,那很可能就是代码中写死的。为了搞清楚0x7c00是哪里来的,咱们先探索下 "IBM PC 5150"的bios的秘密。请先深深呼吸一大口气,“0x7C00”最早出现在IBM 公司出产的个人电脑PC5150的ROM BIOS的 INT19H中断处理程序中,说了这么多定语,感觉气都喘不上来了。

通电开机之后,bios处理程序开始自检,随后,调用bios中断0x19h,即 call int 19h。在此中断处理函数中,bios要检测这台电脑有多少硬盘或软盘,如果检测到了任何可用的磁盘,bios就把它的第一个扇区加载到0x7c00.

现在应该搞清楚了为什么在x86手册里找不到它的说明了,它是属于bios中的规范。似乎这下好办了,既然是bios中的规范,那肯定是IBM PC 5150 BIOS 开发团队规定的这个数。

个人计算机肯定要运行操作系统,在这台计算机上,运行的操作系统是DOS 1.0,不清楚此系统要求的最小内存是16KB还是32KB,反正PC 5150 BIOS研发工程师就假定其是32K,所以此版本bios是按最小内存32KB研发的。

MBR不是随便放在哪里都行的,首先不能覆盖已有的数据,其次,不能过早的被其它数据覆盖。不覆盖已有数据,这个好理解。说一下后面这个“其次”。通常,MBR的任务是加载某个程序(这个程序一般是内核加载器,很少有直接加载内核的)到指定位置,并将控制权交给它。所谓的交控制权就是jmp过去而已。之后MBR就没用了,被覆盖也没关系。我说的过早被覆盖,是指不能让mbr破坏自己,比如被加载的程序,如内核加载器,其放置的内存位置若是MBR自己所在的范围,这不就是破坏自己了吗,这就是我所说的“过早”了,怎么也得等mbr执行完才行。

重现一下当时的内存使用情况:8086cpu要求物理地址0x0~0x3FF存放中断向量表,所以此处不能动了,再选新的地方看看。按DOS 1.0要求的最小内存32KB来说,MBR希望给人家尽可能多的预留空间,这样也是保全自己的作法,免得过早被覆盖。所以MBR只能放在32KB的末尾。MBR本身也是程序,是程序就要用到栈,栈也是在内存中的,所以MBR虽然本身只有512字节,但还要为其所用的栈分配点空间,所以其实际所用的内存空间要大于512字节,估计1k内存够用了。结合以上三点,选择32KB中的最后1K最为合适,那此地址是多少呢。32KB换算为16进制为0x8000,减去1K(0x400)的话,等于0x7c00。这就是倍受质疑的0x7c00的由来,这下清楚了。可见,加载MBR的位置是取决于操作系统本身所占内存大小和内存布局。

我想大家现在都心痒痒了吧,说了这么久,cpu中运行的都是bios的代码,连自己一句代码都没跑起来呢。事不宜迟,马上写一个MBR,先让它跑起来再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a NMN \times MNM binary matrix. Please output the size of second large rectangle containing all "1"\texttt{"1"}"1…

Apollo进阶课程⑭ | Apollo自动定位技术——三维几何变换和坐标系介绍

目录 1.三维几何变换---旋转 2.三维几何变换----平移 2.1刚体的位置和朝向 3. 坐标系 3.1 ECI地心惯性坐标系 3.2 ECFF地心地固坐标系 3.3当地水平坐标系 3.4 UTM坐标系 3.5 车体坐标系 3.6IMU坐标系 3.7 相机坐标系 3.8 激光雷达坐标系 3.9 无人车定位信息中涉及…

一步步编写操作系统 09 写个mbr

有点不好意思了,说了好久,才说到实质性的东西,好了,赶紧给客官上菜。 代码2-1(c2/a/boot/mbr.S)1 ;主引导程序2 ;------------------------------------------------------------3 SECTION MBR vstart0x7c…

【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)

题干: 链接:https://ac.nowcoder.com/acm/contest/882/F 来源:牛客网 Given 2N people, you need to assign each of them into either red team or white team such that each team consists of exactly N people and the total competi…

Apollo进阶课程 ⑮丨Apollo自动定位技术详解—百度无人车定位技术

目录 1.百度无人车定位进化历程 2.百度自动驾驶应用的定位技术 2.1GNSS定位技术 2.2载波定位技术 2.3激光点云定位技术 2.4视觉定位技术 原文链接:进阶课程 ⑮丨Apollo自动定位技术详解—百度无人车定位技术 定位的目的是让自动驾驶汽车找到自身确切位置的方法…

一步步编写操作系统 10 cpu的实模式

cpu的实模式 由于mbr在实模式下工作……什么?什么是实模式?这时候有同学打断了我。我心想,这下好办了……哈哈,没有啦,开个玩笑而已。我们这里所说的实模式其实就是8086 cpu的工作环境、工作方式、工作状态&#xff0…

Ubuntu系统中使用搜狗输入法

今天介绍如何在Ubuntu中使用搜狗输入法。(Ubuntu版本为16.04) 1)登陆搜狗官网选择对应系统的搜狗输入法:http://pinyin.sogou.com/linux。 2)打开下载目录,命令行输入以下命令: sudo dpkg -i …

【2019牛客暑期多校训练营(第三场)- B】Crazy Binary String(思维,01串,前缀和)

题干: 链接:https://ac.nowcoder.com/acm/contest/883/B 来源:牛客网 ZYB loves binary strings (strings that only contains 0 and 1). And he loves equal binary strings\textit{equal binary strings}equal binary strings more, wh…

2.1)深度学习笔记:深度学习的实践层面

目录 1)Train/Dev/Test sets 2)Bias/Variance 3)Regularization(重点) 4)Why regularization reduces overfitting(理解) 5)Dropout Regularization(重点…

一步步编写操作系统 12 代码段、数据段、栈和cpu寄存器的关系

先说下什么是寄存器。 寄存器是一种物理存储元件,只不过它是比一般的存储介质要快,能够跟上cpu的步伐,所以在cpu内部有好多这样的寄存器用来给cpu存取数据。 先简短说这一两句,暂时离开一下主题,咱们先看看相对熟悉一…

【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)

题干: 链接:https://ac.nowcoder.com/acm/contest/883/F 来源:牛客网 The semester is finally over and the summer holiday is coming. However, as part of your universitys graduation requirement, you have to take part in some …

Apollo进阶课程⑯丨Apollo感知之旅——感知概貌

原文链接:进阶课程⑯丨Apollo感知之旅——感知概貌 上周阿波君为大家详细介绍了「进阶课程⑮| Apollo无人车自定位技术入门」。 我们人类天生就配备多种传感器,眼睛可以看到周围的环境,耳朵可以用来听,鼻子可以用来嗅,…

一步步编写操作系统 13 栈

栈到底是什么玩意 cpu中有栈段SS寄存器和栈指针SP寄存器,它们是用来指定当前使用的栈的物理地址。换句话说,要想让cpu运行,必须得有栈。栈是什么?干吗用的?本节将给大家一个交待。 还记得数据结构中的栈吗?那是逻辑…

【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNavacm 来源:牛客网 Given a maze with N rows and M columns, where bijb_{ij}bij​ represents the cell on the i-row, j-th column. If bi,j"1"b_{i, j} …

Apollo进阶课程⑰丨Apollo感知之旅——传感器选择和安装

目录 1.激光雷达 2.相机 3.Radar毫米波 4.安装传感器 原文链接:进阶课程⑰丨Apollo感知之旅——传感器选择和安装 上周阿波君为大家详细介绍了「进阶课程⑯ Apollo感知之旅——感知概况」。 传感器是一种检测装置,能感受到被测量的信息,…

一步步编写操作系统 14 CPU与外设通信——IO接口 上

介绍显卡之前,必须得和大家交待清楚,那么多的外部设备,cpu是如何与他们交流。 大家都学过微机接口技术吧?没学过也没关系,反正我也只是笼统地说说^_^,保证大家一定能看得懂。 按理说,如果硬件…

2.2)深度学习笔记:优化算法

目录 1)Mini-batch gradient descent(重点) 2)Understanding mini-batch gradient descent 3)Exponentially weighted averages 4)Understanding exponetially weighted averages 5)Bias c…

【POJ - 2019】Cornfields(二维st表,模板)

题干: FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, hes looking to build the cornfield on the flattest piece of land he can find. FJ has, at great expense, surveyed his square fa…

虚拟机安装Linux(vmware + ubuntu)

VMWare 提取码:7zph 建议官网下载比较新,还快一点 https://www.vmware.com/products/workstation-pro.htmlubantu 下载地址 安装过程都差不多可以参考 VMware下安装Ubuntu系统图文详细教程_master-CSDN博客_vmware安装ubuntu系统 出现蓝屏问题可以参考…

Apollo进阶课程⑱丨Apollo感知之旅——传感器标定

目录 传感器标定 标定的目的 传感器标定算法 标定案例解析 3D标定间制作 Cmaera-to-Camera外参标定 Lidar-to-Camera外参标定 Lidar-to-Lidar外参标定 Lidar内参标定 Lidar-to-GPS外参标定 自然场景的Lidar-to-Camera外参标定 自然场景的Bifocal Camera外参标定 C…