欢迎来到电脑知识学习网,专业的电脑知识大全学习平台!

手机版

电脑开机循环进入bois-(电脑开机循环进入bios)

电脑选购 发布时间:2022-12-30 03:28:17
电脑开机循环进入bois (电脑开机循环进入bios)

本节内容源自《操作系统真象还原》,请大家支持正版

为什么是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.为什么是0盘0道1扇区的内容。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,有没有感受到计算机文化底蕴呢。

既然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,先让它跑起来再说。

【再续】


电脑 电脑
责任编辑:电脑知识学习网

电脑选购