内存布局示意图
这张图片是从李忠老师的教学视频里扣下来的,侵删。
DRAM区也就是我们平时说的内存条的存储空间。
设备存储就是我们的外部存储设备的存储空间。例如显卡声卡键盘控制器等等。
ROM占据着内存布局的最高段,只有64千字节的容量。
通电时的复位操作
计算的热启动是和处理器上的复位按钮相连的。按下复位键后,8086中寄存器的状态如图所示。
可见除了CS寄存器,其他的都为0.我们来研究一下CS寄存器的复位后情况。
(1)8086:CPU reset后CS寄存器的值为0xFFFF,IP寄存器的值为0,所以将CS左移4位+IP,换算出的物理地址为0xFFFF0,这个地址就是
1MB往下16字节的位置。
(2)80286:CPU reset之后CS的只为0xF000,IP的只为0xFFF0,算法同样是CS左移4位+IP,计算出的物理地址也是0xFFFF0
(3)80386:到了386年代,一切都变了,此时CPU reset后CS的只为0xF000,但是CS除了段选择之外还有一个隐藏的基址寄存器,这个寄存
器的值为0xFFFF0000,IP的值仍然为0xFFF0,此时的计算算法也不是上面的左移4位了,而是0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0,这个地址已经是很高的地址了,是4G往下16字节的位置。
可见,8086似乎和其他后来新生代的处理器不一样,毕竟时代变换,我们的标准和方法也在变换着。
CS的内容和IP的内容共同构成了逻辑地址,所以我们第一条指令指向 FFFF0:0000
这个内存地址根据上面的内存布局图可见,位于ROM BIOS的范围内。
我们要知道,bios是断电后不改变其中数据的,不像我们平时所说的内存,需要有电并且持续的进行动态刷新才可以维持电容里的电保持原来的电量。所以BIOS中的内容是提前在硬件上写好,并且不可以随意更改的,更改要出大问题啊。
我们的处理器跳转到BIOS区,也就是FFFF0这个地址,然后BIOS在其中已经写好了跳转指令,需要让我们的处理器跑到别的地方执行,因为FFFF0距离FFFFF这个最大内存地址也只有16个字节了,根本容纳不了多少指令,更何况我们计算机启动这么复杂的过程呢?
所以,我们心里明白,跳转后该执行的指令,应该也是要不受电源影响的,所以内存被排除。我们的操作系统应从外部辅助设备中加载到内存,然后执行。这个设备就是硬盘。
读取硬盘是从他的主引导扇区里的内容开始执行,所以,我们只要在主引导扇区中,写入我们想让处理器执行的代码就可以了。