当前位置: 首页 > 科技观察

从零开始学习Linux系统启动过程中的几个神秘地址,你知道是什么意思吗?

时间:2023-03-14 08:04:56 科技观察

0xFFFF:0x00000xF000:0xE05B0x0000:0x7C00在第一篇文章中,我们提到现代操作系统是从最古老的8086系统一步步发展起来的。为了向后兼容,处理器制造商有相同的基本原则(如果不兼容,他们将放弃他们的市场份额)。特别是系统上电后,直到操作系统中的第一个进程(Linux下的init进程)开始运行,经历了BIOS、引导程序、操作系统三将的接力运行。今天,我们从几个特殊地址的角度,从宏节点来看系统启动过程。地址0xFFFF:0x0000是处理器上电后第一个重要的物理地址。从地址的写法可以看出这是8086系统实模式下的段寻址方式:段地址*16+偏移量。段地址:0xFFFF偏移地址:0x0000计算出的物理地址:0xFFFF0当处理器的复位引脚被触发时,处理器首先进行硬件初始化,即将处理器内部的各个寄存器设置为初始默认状态:设置段寄存器cs到0xFFFF,指令寄存器ip到0x0000;将所有其他寄存器设置为0x0000;当所有初始化完成后,CPU开始执行第一条指令。正如我之前所说,CPU非常愚蠢和简单。它只知道到cs:ip指向的地址去,取一条指令,执行完再取下一条指令继续执行。..每条指令的第一个字节是操作码。根据操作码,CPU可以知道当前指令的字节长度,并将ip寄存器指向下一条指令。由于硬件初始化已经将cs初始化为0xFFFF,ip初始化为0x0000,经过段寻址公式计算得到物理地址:0xFFFF0,也就是说CPU执行的第一条指令位于物理地址0xFFFF0这个地方.那么,这个物理地址存储了哪些指令呢?首先我们回顾一下地址范围的相关知识:8086处理器有20条地址线,寻址范围为:0x00000~0xFFFFF,最大为1MB。但是8086处理器是16位的,最大寄存器范围是0xFFFF,也就是64KB。当用[段基地址:偏移量]表示段时,该段的最大偏移范围为64KB。让我们回到系统启动过程。上电后,硬件会映射一个ROM芯片到内存地址空间的最高地址空间,也就是1MB的位置,如图:BIOS代码存放在ROM芯片中,称为:基本输入输出系统(BasicInput/OutputSystem)。此时cs:ip计算出的物理地址为0xFFFF0,刚好落在映射到ROM的内存空间中。因此,从该地址获取指令实际上是从ROM中读取。所谓映射:当访问某个地址空间中的内容时,会自动定位到映射的目标物理设备中进行访问,这是由硬件来保证的。当CPU执行指令时,ip寄存器会递增,也就是说每条指令都会从低地址到高地址依次执行。但此时第一条指令的地址是0xFFFF0,几乎接近1MB地址空间的顶部,地址空间只有16字节。如果执行到顶部,溢出后,会回绕到最低地址0x00000。因此,在第一条指令的位置,有一条跳转指令:跳转目标为0xF000:0xE05B,计算出物理地址0xFE05B,可见也落在了映射到ROM的地址空间(貌似像废话:此时只能执行BIOS中的代码)。地址0xF000:0xE05B处的代码是BIOS真正开始执行的地方。BIOS的作用包括:检测硬件设备:系统中有哪些硬件设备,工作状态如何;初始化硬件设备:如初始化中断向量表;检测操作系统引导设备:选择一个系统盘后,将系统盘主引导扇区中的引导程序读入内存;在BIOS的最后一步,它读取引导程序到内存中的地址0x0000:0x7C00,计算出的物理地址为:0x07C00。该地址的内存空间由硬件映射到RAM芯片。具体来说,硬件将内存空间0x00000~0x9FFFF映射到随机存取存储器,共640KB。注意:虽然地址空间有640KB那么大,但实际RAM大小可能只有32KB,所以实际可用空间取决于物理芯片。中间的空地址空间映射到一些外设。地址0x0000:0x7C00是操作系统的引导代码被读入内存的地方。在内存地址(0x00000-0x003FF)的开头,存放了中断向量表。可以看出,操作系统的引导代码并不是从中断向量表之后的0x00400开始存放的,而是放在0x07C00处:至于为什么要这样放,众说纷纭,比较靠谱的解释是这样的:如果实际的RAM芯片只有32KB(别用现代的眼光看,很久以前RAM还是很珍贵的),那么内存布局是这样的:我也鄙视很多应用现在的软件,动不动就占用这么多空间。如果内存太大,你以为整台电脑只服务一个软件?!您可以看到引导代码几乎位于RAM的顶部。这样的话,从中断向量开始的0x00400到引导代码所在的0x07C00,这个地址空间就是一个连续的块,可以更方便的被操作系统操作。此外,将引导代码放在RAM中的高地址还有一个好处:当引导代码最终将接力棒交给操作系统时,引导代码就没有用了。因此,操作系统可以直接擦除引导代码所在地址空间的所有内容,供自己使用!本文转载自微信公众号“IOT物联网小镇”,可通过以下二维码关注。转载本文请联系物联小镇公众号。