3. 主存储器、BIOS和CMOS存储器

  • 主存储器、BIOS存储器和CMOS存储器

    • 主存储器

    • 基本输入/输出程序BIOS

    • CMOS存储器

1. 主存储器

目前计算机配置大内存和Intel 32位CPU,即PC/AT计算机。因此CPU的物理内存寻址范围已经高达4GB(通过采用CPU的新特性,系统甚至可以寻址64GB的物理内存容量)。但为了与原来的PC软件上兼容,系统1MB以下物理内存使用分配上仍然保持与原来PC基本一致,只是原来系统ROM中的基本输入输出程序BIOS一直处于CPU能寻址的内存最高端位置处,而BIOS原来所在的位置将在计算机开机初始化时被用做BIOS的影子(shadow)区域,即BIOS代码仍然会被复制到这个区域中。如图2-4。

3. 主存储器、BIOS和CMOS存储器

初始化,物理地址被设置成从地址0开始的连续区域。除了地址从0xA0000 ~ 0xFFFFF(640KB ~ 1MB,共384KB)和0xFFFE0000 ~ 0xFFFFFFFF(4GB处的最后64KB)以外的所有内存都可以做系统内存。这两个用于I/O设备和BIOS程序。

2. 基本输入/输出程序BIOS

BIOS(Basic Input/Output System,基本输入输出系统)全称是ROM-BIOS。

BIOS存在BIOS ROM芯片中,用于初始化硬件,设置CMOS参数,从块设备加载boot loader(MBR和boot sector中)到内存0x7c00地址,并跳转执行。

BIOS存在BIOS ROM芯片中,用于开机时执行系统各部分的自检,建立操作系统需要使用的各种配置表,如中断向量表、硬盘参数表。由于BIOS提供的服务不具备可重入性(即程序不可并发运行),因而初始化时利用BIOS提供一些系统参数外,Linux运行时不使用BIOS功能。

3. 主存储器、BIOS和CMOS存储器

开机或复位时,CPU会自动将代码段寄存器CS设为0xF000,其段基地址设为0xFFFF0000,段长度设为64KB。IP被设为0xFFF0,此时CPU代码指针指向0xFFFFFFF0处,即4GB最后64KB的最后16B处。由上面的2-4图,正是ROM BIOS存放的位置,并且BIOS会在这里存放一条跳转指令JMP,跳转到BIOS代码中64KB范围内的某一个指令开始执行。由于目前PC/AT中BIOS容量大多有1MB ~ 2MB,并存储在闪存(Flash Memory)ROM中,因此为能执行或访问BIOS中超过64KB范围而又远不在0 ~ 1MB地址空间中的其他BIOS代码或数据。BIOS程序会首先使用32位访问方式把数据段寄存器的访问范围设置位4GB(而非原来的64KB),这样CPU就可以在0 ~ 4GB范围内执行和操作数据。此后,BIOS在执行一些硬件检测和初始化操作之后,就会把与原来PC兼容的64KB BIOS代码和数据复制到内存低端1MB末端的64KB处,然后跳转到这个地方并让CPU真正运行在实地址模式下,如图2-5。最后BIOS会从硬件或其他块设备把操作系统引导程序加载到内存0x7c00处,并跳转到这个地方继续执行引导程序。

3. CMOS存储器

CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体)存储器容量很少(只有64B或128B),用来存放计算机的实时时钟信息和系统硬件配置信息。这部分内存通常和实时时钟芯片(Real Time Chip)做在一块集成电路中。CMOS内存的地址空间在基本内存地址空间之外,需要使用I/O指令来访问。