第4章 现代微机的存储系统
4.1 现代微机存储器系统概述 4.1.1 半导体存储器技术 1. 只读存储器ROM(Read Only Memory) ROM在正常工作的时候只能读出其中存放的数据,而不能改变其内容。因此ROM经常被用来存放哪些固定不变,无需修改的数据与程序 。 ROM的最大特点是掉电以后,数据不会丢失,通电后可以继续使用。
ROM 将已定型的程序和数据固化在其中,之后就不再更改。 PROM 称为可编程ROM。允许用户向其中写入一次数据或程序,之后其中的数据就不可再更改。 EPROM 称为可擦除的PROM。其中的数据可以通过紫外线照射而被擦除,之后可以再次写入新的数据。 EEPROM 称为电可擦除可编程ROM(又写为E2PROM)。其擦除和改写无需紫外线,只需特定的电信号即可。这种存储器的存取速度较慢。 Flash Memory 称为闪烁存储器(闪存)。也是电可擦除和更改型的ROM存储器,采用块擦除阵列结构,具有存储容量大、读取速度快、信息非易失、功耗低、可在线读写,抗干扰能力强、掉电信息不丢失等特点,目前被广泛应用。
2. 随机存取存储器RAM(Random Access Memory) 在正常工作时就能随时对其数据进行读写操作的存储器,其对数据的修改是在正常工作状态,而无需特别的写入环境。 RAM的读写速度一般都比ROM快,而且存取任一单元所需的时间相同。 RAM在掉电的时候会将其存储的数据丢失。
SRAM 称为静态RAM(static RAM)。只要电源不掉电,内部存放的数据就不会丢失。SRAM的最大特点就是速度快。 DRAM 称为动态RAM(dynamic RAM)。它用MOS管的栅极对其衬底间的分部电容来保存信息。需要定期刷新。DRAM的最大特点就是集成度高。 NVRAM 称为非易失RAM(Non Volatile RAM)。它是SRAM和EEPROM的共同体,正常工作时是SRAM存储数据,一旦掉电,就会自动的将数据转存到EEPROM中,重新上电后,数据又会自动的从EEPROM恢复到SRAM中。
常用的DRAM类型 SDRAM(Synchronous DRAM, 同步动态随机存储器)。将RAM与CPU以相同的时钟频率进行控制,彻底取消等待时间。 DDR SDRAM(Double Data Rate SDRAM,双倍速率 SDRAM)。 DDR SDRAM能够在时钟的上升期和下降期各传输一次数据,因此一个时钟周期内可传输两次数据。 DDR2 SDRAM。DDR2拥有两倍于DDR的预读取能力(4bit数据读预取)。即DDR2每个时钟能够以4倍外部总线的速度读/写数据,并且能够以内部控制总线4倍的速度运行。
4.1.2 内存的主要性能指标 (1)存储容量 内存所能容纳的二进制的总位数,一个有K位地址线,L位数据线的存储芯片所拥有的容量为2K×L位。 (2)存取速度 指从内存单元将数据读到存储数据寄存器或从存储数据寄存器将数据写到内存单元所需的时间,前者为读取时间,后者为写入时间。 (3)可靠性 内存可靠性用平均无故障时间(MTBF)来衡量。也可以看作是两次故障之间的时间间隔。MTBF越长,可靠性越高。 (4)性能/价格比 性能主要是指上面三项,对不同的用途,侧重点会有所不同。
4.1.3 现代微机的存储结构 CPU内 的寄存器 L1 数据Cache L1 代码Cache L2 Cache L3 Cache 内部存储器(内存) 外部存储器(外存) 外存Cache
4.2 现代微机的系统地址映射 4.2.1 传统地址范围(实地址模式) 1MB 0FFFFFH 系统BIOS(上端) 64KB 4.2 现代微机的系统地址映射 4.2.1 传统地址范围(实地址模式) 960KB 640KB 768KB 896KB 0F0000H 0EFFFFH 0E0000H 0DFFFFH 0C0000H 0A0000H 0BFFFFH 09FFFFH 0FFFFFH 1MB 00000H DOS区 传统视频区 (SMM存储器) 128KB 扩充区 128KB(16 KB8) 扩展系统BIOS(低端) 64KB(16KB4) 系统BIOS(上端) 64KB
4.2.2 主存储地址范围(1MB-TOLUD) 兼容DOS存储(传统地址范围) 0MB 10000H 主存储区 1MB 0H 15MB 0F0000H TOLUD 100000H ISA Hole(可选) TSEG(1MB/2MB/8MB可选) IGD(1~64MB可选) PCI存储范围 APIC Flash Memory 最大4GB 0FFFFFFFFH
4.2.3 PCI存储地址范围(TOLUD-4GB)
4.3 IA-32结构保护模式下的存储管理 4.3.1 保护模式下的段式存储管理 1. 段式管理的地址变换 45(77) 32(64) 4.3.1 保护模式下的段式存储管理 1. 段式管理的地址变换 45(77) 32(64) 31(63) 0 逻辑地址 段寄存器的15~2位 偏移量 段基址 段描述符 段表 物理地址 32(64)位线性地址
2. 段描述符 D7 D0 段界限 7~0 段界限 15~8 基址 7~0 基址 15~8 基址 23~16 基址 31~24 TYPE S AVL DPL P G D/B L 段界限 19~16 1 2 3 4 5 6 7
D7 D0 G D/B L AVL 段界限 19~16 用户的操作系统可用位 1=在64位模式,0=在兼容或IA-32模式 D/B位 G=0 段长以1字节为单位 粒度位 G=1 段长以4K字节为单位 D=1 使用32位操作系统和32位寻址方式 代码段(D位) D=0 使用16位操作系统和16位寻址方式 D/B位 B=1 使用ESP寄存器,上限为FFFFFFFFH 数据段(B位) B=0 使用SP寄存器,上限为FFFFH
非系统段中的第5字节 扩展方向位 数据段标志 可写位 可执行位 D7 D0 A W R ED C E=0 E=1 S=1 DPL P 存在位 兼容位 访问位 特权位 代码段标志 可读位 S=1是非系统段 S=0是系统描述符
系统描述符中的TYPE
选择符(段寄存器) 索引 Ti RPL Ti=0 Ti=1 选择符 界限 界限 基址 GDTR LDTR 15 2 1 0 索引 Ti RPL Ti=0 Ti=1 LDT …… …… LDT 2 2 1 1 LDT GDT 选择符 界限 界限 基址 基址 GDTR LDTR
#include "stdafx.h" #include <stdio.h> #include <wtypes.h> // wtypes.h定义了WORDLONG, //DWORD,WORD等数据类型 DWORDLONG gdtr,savegdt; //下面是GDT中将创建的数据段描述符表,基地址0X00000F00, //段界限为0XFFFF,优先级为3的在内存中的可写数据段 WORD descriptor[4]= {0xFFFF, 0X0F00, 0XF200, 0X0040}; int result[10]; int main(int argc, char* argv[]) {_asm { push ebp sgdt gdtr // 将GDTR寄存器的内容读取到 //gdtr开始的6个字节中,其中 // 前两个字节给出GDT的界限值, //高4个字节给出GDT的基地址
mov ebp,dword ptr [gdtr+2] // 将gdt的基 add ebp,70h // 我们选择70H偏移下的段描述 // 符(GDT中第14个描述符) lea edi,savegdt mov esi,ebp movsd // 以上4条指令保存原来在70H偏移上 movsd // 的描述符 mov edi,ebp lea esi,descriptor; movsd // 把我们的数据段描述符装入70H movsd // 偏移上 push es mov ax,0073h // 选择字为描述符偏移70H拼接上 // 低3位控制位元,其中Ti为0,表 // 示访问GDT,RPL为11,为3级优 // 先级,所以就为73H
mov es,ax // ES装入选择字73H lea edi,result // 将存放输出结果的变量 //的地址放在EDI中 mov eax,1 mov ebx,1 } _asm { mov cx,10 a1: mov es:[eax],eax add eax,4 loop a1 // 上面4条指令将向物理地址 // 0X00000F00处写10个双字 a2: mov eax,es:[ebx] mov [edi],eax
add ebx,4 add edi,4 loop a2 // 以上从物理地址0X00000F00 // 处依次读出10个数据存放在 // result数组中 } _asm { pop es pop ebp printf("result="); for(int i=0;i<10;i++) printf("%d,",result[i]);// 输出结果 return 0;
4.3.2 保护模式下的虚拟页式存储管理 主存 程序1 ~ 页面 程序2 页框 程序3
PAE PSE 物理地址位数 页面大小 32位 4KB 1 4KB/4MB 36位 4KB/2MB PGE PCE 8 31 7 6 5 4 3 2 1 0 MCE PAE PSE DE TSD VME PVI 保留,缺省为全0 CR4 PAE PSE 物理地址位数 页面大小 32位 4KB 1 4KB/4MB 36位 4KB/2MB
32位物理地址下的4KB分页方式 页目录 32位线性地址 页目录项号 页面号 偏移 CR3 32位物理地址 31 22 21 12 11 0 31 22 21 12 11 0 页表 低12位 高20位 31 12 11 9 8 7 6 5 4 3 2 1 0 PWT PCD 页表基地址31~12 P RW US G AVL A D 页目录项 页框基地址31~12 G PAT 页表项 31 12 11 9 8 7 6 5 4 3 2 1 0 P=出现位,US=用户/监督位,PCD是页Cache禁止,D=Cache“脏”位,RW=读/写位,PWT=页写贯穿位,A=访问位,AVL=用户的操作系统可用位。而第7位(PS)在4KB分页中为0
32位地址模式下的4MB分页方式 31 22 21 0 32位线性地址 页目录项号 偏移 CR3 低22位 32位物理地址 高10位 页目录 31 22 21 0 页目录 低22位 高10位 31 22 13 12 11 9 8 7 6 5 4 3 2 1 0 PWT PCD 页框基地址31~22 P RW US A D 1 页目录项 PAT AVL G
36位地址下的4KB分页方式地址转换 PCD PWT 31 5 4 3 2 1 0 CR3寄存器 31 5 4 3 2 1 0 PWT PCD 32字节对齐的PDPT基地址 CR3寄存器 63 36 35 12 11 9 8 5 4 3 2 1 0 P AVL PDPT项 4KB对齐的页目录基地址(高24位) 32位线性地址 页目录项号 页面号 偏移 CR3 36位物理地址 31 30 29 21 20 12 11 0 页目录 页表 PDPT项号 页目录指针表 4×64位 512×64位 低12位 高24位 63 36 35 12 11 9 8 7 6 5 4 3 2 1 0 PWT PCD 4KB对齐的页表基地址 P RW US AVL A 页目录项 4KB对齐的页框基地址 D 页表项 63 36 35 12 11 9 8 7 6 5 4 3 2 1 0 G
36位地址下的2MB分页方式地址转换 32位线性地址 页目录项号 偏移 CR3 36位物理地址 31 30 29 21 20 0 页目录 31 30 29 21 20 0 页目录 PDPT项号 页目录指针表 4×64位 512×64位 页目录项 PWT PCD 2MB对齐的页框基地址 P RW US AVL A D 63 36 35 21 20 13 12 11 9 8 7 6 5 4 3 2 1 0 1 G 低21位 高15位 PAT
IA-32e模式下的4KB内存分页结构项的格式 PWT PCD PML4基地址 P RW US A 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 AVL PML4表 EXB PDPT表 页目录基地址 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 页目录项(4KByte页表) 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 0 0 0 页表(4KByte页表) 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 G PAT D
IA-32e模式下4KB分页方式地址转换
IA-32e模式下的2MB内存分页结构项的格式 PML4表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 EXB AVL PML4基地址 AVL A PCD PWT US RW P PDPT表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 EXB AVL 页目录基地址 AVL A PCD PWT US RW P 页目录项(4MB页表) 63 62 51 39 13 12 11 9 8 7 6 5 4 3 2 1 0 EXB AVL 页目录基地址 PAT AVL AVL G 1 D A PCD PWT US RW P
IA-32e模式下2MB分页方式地址转换
4.4 高速缓冲存储器Cache 4.1.1 Cache的工作原理与地址映射 1. Cache的工作原理
2. Cache的地址映像 1) 直接映像 主存中的每一页都映像到高速缓存中的一个固定页,而高速缓存中的每一页却对应着主存中的若干页。 2) 全相联映像 全相联映像技术允许主存中每一个页面映像到Cache的任何一个页面位置上,也允许采用某种替换算法从已占满的Cache中替换出任何一个旧页面。这种方式冲突概率低,可达到很高的Cache命中率,但实现起来比较困难。 3)组相联映像 将主存空间按Cache大小等分成组,再将Cache空间和主存空间中的每一组都等分成大小相同的块,使得主存中一个组内的页数与Cache中的分块数相同。各组之间是直接映像,而组内各块之间则是全相联映像。
3. Cache的读写操作 存储器读 访问页面在Cache中——直接读Cache,不读主存 访问页面不在Cache中—— · 贯穿读出式:页面从主存读到Cache,再到CPU · 旁路读出式:页面直接从主存读到CPU,而不 经过Cache 存储器写 · 写回法:写Cache页时不写主存,到下次页面修改时再写主存。 · 写贯穿法:页面在写到Cache时同时写到主存,以保持主存与Cache的相关页的内容一致
4.4.2 IA-32的Cache结构 物理存储器 系统总线 L3 Cache* L2 Cache (外部) 数据Cache(L1) 总线接口单元 Instruction TLBs Data TLBs 存储缓冲 指令译码器 跟踪Cache**/L1指令Cache * Intel Xeon 处理器才有 ** 跟踪Cache只有Pentium 4才有
Core Solo,Core Duo,Core 2,Pentium 4中L1和L2Cache行和Intel Xeon 处理器的L1 、L2和L3 Cache行都是64字节。 一个Cache行可以使用8个突发传送事件来填满。Cache不支持部分Cache行的填充。 TLBs存储最近用过的页目录和页表项。他们通过降低访问主存中页表的次数来加快页表的访问。 处理器的Cache对软件来说基本上是透明的。 对Cache行为的了解有助于优化软件的性能。
4.4.3 IA-32的Caching类型 强不可缓存(Strong Uncacheable,UC)型:主存单元的读写不使用Cache。所有读和写都只针对主存,并且以程序的次序执行而不会重排序。 不可缓存(Uncacheable,UC-)型:和UC存储器具有一些相同的特征,不过这种存储器类型可以通过对WC类型存储器的MTRRs编程来撤消。 写组合(Write Combining,WC)型:和UC-存储器一样,主存单元的读写不使用Cache,并且处理器总线的一致性协议也没有被强制使用。
写贯穿(Write-through,WT)型:对主存的读或写操作都使用Cache。如果Cache命中,则读操作将会直接读Cache行,如果没有命中则会引起一个Cache填充事件。所有的写在可能的情况下都被写入到Cache行,并且同时写到主存中。 写回(Write-back,WB)型:对主存的写和读操作都使用Cache。如果Cache命中,则读操作将会直接读Cache行,如果没有命中则会引起一个Cache填充事件。写操作被写到Cache中。被修改的Cache行,在稍后才被写到主存中。 写保护(Write-protected,WP)型:读操作在可能的情况下是从Cache行中读数据, 读操作没有命中Cache时会引起Cache填充。写操作被传送到内存中,而且导致在系统总线上的所有处理器中的相应Cache行变为无效。
Cache不同类型的特点
4.4.4 IA-32的Cache一致性协议 MESI(Modified、Exclusive、Shared、Invalid)Cache一致性协议是一种写-无效监听协议。它跟踪存储器数据变化,保证了一个Cache行数据更新以后,能够和所有与它的地址有关联的存储单元保持数据的一致性。
已修改(Modified):指出Cache行数据已被更新,但该更新不会送上系统总线,因此此时的Cache行内容与主存及其它Cache的不一样。当该Cache控制器之后监听到该行再次命中,必须将修改行的数据写回存储器,以保持数据一直; 独占(Exclusive):指出这个Cache行的数据与主存相联地址的内容一样,并且其它Cache中不包括此Cache行的内容; 共享(Shared):指出此Cache行的内容存在于几个Cache当中,在每个相关的Cache行和存储器行里都存放了这行内容的副本; 无效(Invalid):复位以后的无效状态,指示这一Cache行无效。
IA-32 MESI Cache行状态