Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?
扫描二维码
随时随地手机看文章
-
0xFFFF:0x0000
-
0xF000:0xE05B
-
0x0000:0x7C00
0xFFFF:0x0000
这个地址,是处理器上电之后的第一个重要的物理地址。
段地址:0xFFFF当处理器的reset引脚被触发后,处理器首先进行硬件初始化,也就是把处理器内部的每个寄存器都设置为一个初始的默认状态:偏移地址:0x0000
计算得到物理地址:0xFFFF0
把段寄存器 cs 设置为 0xFFFF,指令寄存器 ip 设置为 0x0000;当所有的初始化完成之后,CPU 就开始执行第一条指令。把其它的所有寄存器设置为 0x0000;
每一条指令的第一个字节都是操作码,CPU 根据操作码,能够知道当前指令的字节长度,并把 ip 寄存器指向下一条指令。既然硬件初始化时,已经把cs初始化为0xFFFF,把ip初始化为0x0000,经过段寻址的公式计算之后,就得到了物理地址:0xFFFF0,也就是说,CPU 执行的第一条指令位于物理地址0xFFFF0这个地方。
8086 处理器有 20 根地址线,寻址范围是:0x00000 ~ 0xFFFFF,最大就是 1 MB。我们再回到系统的启动流程。但是 8086 的处理器是 16 位的,寄存器最大表示的范围是 0xFFFF,也就是 64 KB。
采用【段基址:偏移量】来表示一个段时,这个段的最大偏移范围就是 64 KB。
所谓的映射:就是访问某个地址空间中的内容时,就会自动定位到被映射的目标物理设备中进行访问,这是由硬件来保证的。CPU在执行指令的时候,ip寄存器是递增的,也就是说会从低地址到高地址,依次执行每一条指令。
0xF000:0xE05B
这个地址处的代码,才是BIOS真正开始执行的地方。BIOS所做的事情包括:
侦测硬件设备:系统中有哪些硬件设备,工作状态是什么;在BIOS的最后一个步骤中,它把引导程序读取到内存中0x0000:0x7C00地址处,计算得到物理地址就是:0x07C00。对硬件设备进行初始化:比如最初始的中断向量表;
侦测操作系统启动设备:选择好一个系统盘之后,把系统盘中主引导扇区中的引导程序读取到内存中;
中间空着的那块地址空间,映射到一些外设。
0x0000:0x7C00
这个地址,就是操作系统的引导代码被读取到内存中的地方。
在此也鄙视一下现在很多的应用软件,动不动就占用那么多的内存,都以为整个电脑只为它一家软件服务的?!可以看到,引导代码几乎位于RAM的顶端了,这样的话,从中断向量开始的0x00400,一直到引导代码的0x07C00,这块地址空间就是连续的一整块,可以被操作系统更方便的操作。
------ End ------