哈工大操作系统——揭开钢琴的盖子

写在前面:

        亲爱的小伙伴你们好,不知道你有没有在学习操作系统的过程中遇到过这样那样的困难,很多次想要放弃,很多次怀疑自己的能力,但是请你相信“未来的路就在脚下,不要悲伤,不要害怕”,一定要“充满信心,期盼着明天!”。请你一定要相信Tandy12356_,他是未来的你派过来拯救你的救星,他一定会将你带入一段美妙的操作系统学习之旅!

还记得童年时那种无忧无虑的快乐嘛^_^                                                                                           

现在回想过来真的有时会泪湿眼角......

一、预备知识

1、计算机是一个莫得感情的工具人,那么它如何知道自己需要执行哪条指令呢?

        答: 我们知道计算机的基本工作模式就是大名鼎鼎的“取指——执行——取指——执行”,所以说呢,我们首先要把程序放入到内存当中去( 试想一下如果内存中啥都没有,你去取空气吗?),然后让PC指针来指向这一段程序中你需要执行的指令,接下来就可以把这条指令通过总线传送到CPU的IR寄存器当中,下面的任务你就不用操心了,总之CPU会进行一通解释处理,最终你这条指令就被正确地解释执行了。

2.IBM PC实模式下如何取出指令?

        答:PC=CS<<4+IP,即CS左移四位加上IP偏移就会得到我们需要的逻辑地址了。

二、来自Tandy12356_的灵魂问答

1、打开电源时,计算机首先要执行什么?

.        当我们按下电源键以后,硬件电路会初始化设置PC寄存器的值,对于IBM PC而言,IBM公司的硬件工程师利用电路将PC寄存器的初值设置为0xFFFF0,按照IBM PC的寻址方式PC=0xFFFF0的物理实现是设置CS和IP这两个计算器的值即CS=0xFFFF,IP=0x0000。而在IBM PC刚一启动时,计算机会工作在实模式下,实模式取出指令的具体实现是首先将CS段寄存器中的数值左移4位,再和段内偏移寄存器IP中的值相加后,形成一个地址,然后将这个地址放到地址总线上,去取出对应的内存中存放的指令。此处要从地址PC=CS<<4+IP即0xFFFF0处取出第1条指令开始执行

         总而言之,打开电源时,计算机首先要执行什么的关键就在于PC寄存器当中存放的什么内容,这决定了我们一开始需要执行的指令被存放在了什么位置。

        那么具体来讲需要执行什么命令呢?

        众所周知,内存是随机存储器(RAM),属于易失性存储器,所以在没有上电时,RAM中根本不会存放任何内容,因此刚一上电时,RAM中不可能存有任何实际的信息。

        所以有读者要问了,那你这个0xFFFF0地址处,到底有存放了什么神秘的东西?

        答:计算机硬件厂商为了让整个故事有一个确定的起点,在只读存储器(ROM)中开辟一段空间,这里需要注意的是这个只读存储器并不会因为你拔下电源插头而丢失掉其中保存的内容,这就像是一些恋爱冲昏头脑的家伙,即使你和他已经分手了,他的记忆里还是始终存放着你的信息,而且这些信息大概率即便是“山无陵,天地合,冬雷阵阵,夏雨雪”也不会丢失的,所以你大可以把一些重要的信息存放在ROM当中。 IBM PC的0xFFFF0就指向这个区域,而在IBM PC中这段ROM被称为BIOS(Basic Input & Output System )在BIOS中放置的代码是对于基本硬件的测试代码,例如对主板、内存等硬件的测试,同时还提供了一些让用户调用硬件的基本输入输出功能的子程序,比如我们之后需要用到的int 0x10号中断。

        所以你现在能回答我提出的问题了吗?        

        即打开电源时,计算机首先要执行什么

        答:计算机会首先执行ROM BIOS当中存放的对于基本硬件的测试代码。

        问:大哥能不能具体一点啊?

        答:能。

        现在再回到PC=0xFFFF0这个主题上,CPU从ROM BIOS中取出的指令所需要完成的工作是测试各种硬件是否正常,如果出现异常就会停止启动,相信很多人有过这样的经历,看到屏幕上显示出一些内容以后,计算机就没有任何反应,这时应该是硬件检测失败,如果硬件检测正常的话计算机就会利用BIOS的输入输出功能将启动扇区当中的内容读入到内存的0X7C00地址处(请务必留意内存两个字),并设置寄存器CS=0x07C0,IP=0x0000。
 

2、我到底什么时候才能控制计算机?

        确实从按下电源键开始到现在,一直是计算机自己在一波操作猛如虎的在那里不知道在忙活些什么,但是请相信我,很快地它就需要聪明的你来对这个生性凶猛、一秒钟能把1+1=2算几百万遍的家伙好好驯服一番了。

        因为根据“取指——执行”的计算机的基本工作原理,现在开始要从PC=0x7C00处,一条一条地取出指令并执行指令了,前面的分析告诉我们,BIOS将启动磁盘上引导扇区的内容读到了内存0X7C00地址处,因此接下来执行的程序就是引导扇区(启动磁盘上的0号柱面,0号磁头,1号扇区)上存放的程序。

        那么引导扇区上存放的内容又是从哪里来的呢?

        答:引导扇区就是用来引导操作系统的扇区,如果没有操作系统就不会有所谓的引导扇区,所以引导扇区的内容是操作系统在安装的时候写进去的。

3、编写操作系统引导扇区的代码需要使用什么编程语言?

        答:操作系统第一个要编写的文件就是这个引导扇区中存放的程序代码,也就是从计算机开机到现在我们可以控制的第一段程序,通常将这个程序文件命名为bootsect.s,这是一个汇编程序文件,之所以要使用汇编语言来编写,是因为我们需要让开机的整个过程严格地按照要求来执行,用C语言写程序固然简单,但经过C语言编译后的很多细节是不能由我们直接进行控制的,比如C语言程序在编译链接的过程中会产生我们不需要数据、地址等信息,而操作系统引导的代码一旦有一点偏差就会功亏一篑。

今天的学习小结:

        归根结底就是回答了一个问题:

        打开电源键以后计算机执行的第一条指令是什么?

        或者说计算机应该执行什么指令?

        答:对于X86 PC机而言,刚开始CPU处于实模式。

        1)开机时需要设置CS=0xFFFF IP=0x0000

        2)接下来便可以寻址0xFFFF0 (ROM BIOS映射区)

        3)从地址0xFFFF0处开始执行代码,这个地址通常是ROM BIOS中的地址,PC机中的BIOS将会执行某些系统检测(例如检测RAM,键盘,显示器,软盘,磁盘等设备),并在物理地址0开始处初始化中断向量。

        4)将磁盘零0磁道0扇区的512个字节读入到0x7c00处(硬盘的第1个扇区中存放的开机后执行的第一段我们可以控制的程序)

        5)设置CS=0x07C0,IP=0X0000并跳转到此处进行执行

写在后面:

        不知道大家有没有喜欢Tandy12356_的文章呢?   ( ・´ω`・ ),如果喜欢的话希望大家能点个关注或者收藏的啦!

        在这里给大家预告下期内容啦:接下来我们会从bootsect.s源码作为切入点,一步步地领着大家去了解bootsect.s到底为我们的系统做了什么样的工作,它具体发挥着什么样的作用,并会给大家作出十分详细的总结。

        如果大家喜欢的话,可不可以给个支持呢,您的点赞收藏就是Tandy小熊创作下去的动力捏!!

          ( • ̀ω•́ )✧( • ̀ω•́ )✧( • ̀ω•́ )✧

欲知后事如何,欢迎收看下集:引导启动程序——bootsect.s

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值