在过去的三个月内,本人根据《linux内核设计的艺术》和《linux0.11内核完全注释》细读了linux-0.11源码中的大部分内容,最近开始研究清华大学的操作系统实验课中的ucore源代码,因此希望将自己的所思所想分享给大家,也欢迎大家一起来交流探讨。
当我们按下开机按钮时,电脑是怎么开始执行第一条指令的?
①梦回40年前,当时的intel公司生产了一个16位的微处理器芯片8086,它是x86体系架构的鼻祖。但是,8086设计时为了满足当时的寻址要求1MB(个人认为可能当时的内存条最大为1MB),它的地址总线为20位,最大可寻址1MB空间,而数据总线为16位,寄存器也只能存16位的数据,为了填补这4位的差距,intel工程师想出了一个好的方法。一个寄存器存不下,那我用两个寄存器不就行了吗?当时他们的想法是将地址空间分段,因此段寄存器(CS、SS、DS、ES)应运而生,这些寄存器存的是段的基址,我们都知道CPU执行指令是通过CS:IP来执行的,但在当时CS和IP都是16位的,所以intel规定CS:IP=CS<<4+IP,来满足20位寻址。
背景大概就是这么多了,当时intel公司规定在开机启动后,CPU运行在实模式,根据CS:IP来执行指令,那时候通过硬件逻辑已经将CS写死为0xF000,IP写死为0xFFF0,也就是说只要你开机或断电重启,CPU就会执行0xF000:0xFFF0这个地址里面的指令。按照intel规定,