前提
本文针对x86架构的处理器。在正式开始之前,首先需要明确一些基本概念。
cs寄存器:代码段寄存器,这个寄存器其实是告诉CPU在这个位置是代码还是数据的。在实模式下,CPU的寻址方式是代码段寄存器左移4位然后加上ip寄存器,作为地址去取内容,写作cs:ip。
reset vector:就是CPU执行的第一条指令的位置
地址构成
其实随着x86的发展,第一条指令的地址并不是一成不变的
8086:CPU reset之后cs寄存器的值是0xFFFF,ip寄存器的值是0x0,所以形成的物理地址是0xFFFF0,这个地址就是1M往下16字节的位置
80286:CPU reset之后cs寄存器的值是0xF000,ip寄存器的值是0xFFF0,所以形成的物理地址也是0xFFFF0
80386:到了386时代一切都变了,此时在CPU reset之后cs寄存器的值仍然是0xF000,但是cs除了段选择子之外还有一个隐藏的基址寄存器,这个寄存器的值是0xFFFF0000,ip寄存器的值仍然是0xFFF0。此时的地址不在是0xF000左移4位加上0xFFF0了,而是0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0。所以第一条指令是在一个很高的地址,是4G往下16字节的位置。
地址布局与映射
经过地址构成这一说,可能大家会有一些疑问。CPU怎么能一上来就去0xFFFFFFF0取指呢?因为此时内存都还没初始化呢,那里什么都没有啊。而且第一条指令毫无疑问是在BIOS里啊,现在用来烧写BIOS的flash芯片有256KB的,1MB的,4MB的