360 likes | 496 Views
第 4 章 现代微机的存储系统. 4.1 现代微机的存储结构. CPU 内 的寄存器. L1 数据 Cache. L1 代码 Cache. L2 Cache. L3 Cache. 内部存储器(内存). 外存 Cache. 外部存储器(外存). 4.2 现代微机的系统地址映射. 1MB. 0FFFFFH. 系统 BIOS (上端) 64KB. 0F0000H. 960KB. 0EFFFFH. 扩展系统 BIOS (低端) 64KB ( 16KB 4 ). 0E0000H. 896KB. 0DFFFFH. 扩充区
E N D
4.1 现代微机的存储结构 CPU内 的寄存器 L1 数据Cache L1 代码Cache L2 Cache L3 Cache 内部存储器(内存) 外存Cache 外部存储器(外存)
4.2 现代微机的系统地址映射 1MB 0FFFFFH 系统BIOS(上端) 64KB 0F0000H 960KB 0EFFFFH 扩展系统BIOS(低端) 64KB(16KB4) 0E0000H 896KB 0DFFFFH 扩充区 128KB(16 KB8) 0C0000H 768KB 传统视频区 (SMM存储器) 128KB 0BFFFFH 0A0000H 640KB 09FFFFH DOS区 00000H 4.2.1 传统地址范围(实地址模式)
4.2.2 主存储地址范围(1MB-TOLUD) 最大4GB 0FFFFFFFFH Flash Memory APIC PCI存储范围 TOLUD IGD(1~64MB可选) TSEG(1MB/2MB/8MB可选) 主存储区 100000H ISA Hole(可选) 15MB 0F0000H 主存储区 1MB 10000H 兼容DOS存储(传统地址范围) 0H 0MB
4.3 IA-32结构保护模式下的存储管理 4.3.1 保护模式下的段式存储管理 1. 段式管理的地址变换 31(63) 0 45(77) 32(64) 逻辑地址 段寄存器的15~2位 偏移量 段基址 段描述符 段表 物理地址 32(64)位线性地址
D7 D0 段界限 7~0 0 段界限 15~8 1 基址 7~0 2 基址 15~8 3 基址 23~16 4 P DPL S TYPE 5 G D/B 段界限 19~16 L AVL 6 7 基址 31~24 2. 段描述符
D7 D0 L AVL G 段界限 19~16 D/B 用户的操作系统可用位 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
E=0 ED W DPL S=1 P A E=1 C R 非系统段中的第5字节 扩展方向位 数据段标志 可写位 可执行位 D7 D0 兼容位 存在位 访问位 特权位 代码段标志 可读位 S=1是非系统段 S=0是系统描述符
选择符(段寄存器) 15 2 1 0 索引 Ti RPL Ti=0 Ti=1 LDT …… …… LDT 2 2 1 1 0 0 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 {pushebp sgdtgdtr// 将GDTR寄存器的内容读取到 //gdtr开始的6个字节中,其中 // 前两个字节给出GDT的界限值, //高4个字节给出GDT的基地址
movebp,dword ptr [gdtr+2] // 将gdt的基 // 地址读到EBP中 addebp,70h // 我们选择70H偏移下的段描述 // 符(GDT中第14个描述符) leaedi,savegdt movesi,ebp movsd // 以上4条指令保存原来在70H偏移上 movsd // 的描述符 movedi,ebp lea esi,descriptor; movsd // 把我们的数据段描述符装入70H movsd// 偏移上 pushes movax,0073h// 选择字为描述符偏移70H拼接上 // 低3位控制位元,其中Ti为0,表 // 示访问GDT,RPL为11,为3级优 // 先级,所以就为73H
moves,ax// ES装入选择字73H leaedi,result // 将存放输出结果的变量 //的地址放在EDI中 moveax,1 movebx,1 } _asm {movcx,10 a1:moves:[eax],eax addeax,4 loopa1// 上面4条指令将向物理地址 // 0X00000F00处写10个双字 } _asm {movcx,10 a2:moveax,es:[ebx] mov[edi],eax
addebx,4 addedi,4 loopa2// 以上从物理地址0X00000F00 // 处依次读出10个数据存放在 // result数组中 } _asm {popes popebp } printf("result="); for(int i=0;i<10;i++) printf("%d,",result[i]);// 输出结果 return 0; }
~ ~ ~ ~ 4.3.2 保护模式下的虚拟页式存储管理 主存 程序1 页面 程序2 页框 程序3
31 7 6 5 4 3 2 1 0 8 TSD DE PVI CR4 MCE 保留,缺省为全0 PAE PSE PGE VME PCE
31 22 21 12 11 0 偏移 页目录项号 32位线性地址 页面号 低12位 CR3 32位物理地址 高20位 页表 页目录 31 12 11 9 8 7 6 5 4 3 2 1 0 页目录项 0 A US P PCD PWT D 页表基地址31~12 AVL RW G 31 12 11 9 8 7 6 5 4 3 2 1 0 页表项 A US P D PCD PWT RW AVL 页框基地址31~12 G PAT 32位物理地址下的4KB分页方式 P=出现位,US=用户/监督位,PCD是页Cache禁止,D=Cache“脏”位,RW=读/写位,PWT=页写贯穿位,A=访问位,AVL=用户的操作系统可用位。而第7位(PS)在4KB分页中为0
31 22 21 0 32位线性地址 偏移 页目录项号 CR3 低22位 32位物理地址 高10位 页目录 31 22 13 12 11 9 8 7 6 5 4 3 2 1 0 页目录项 PAT A PCD US P AVL 1 D PWT RW 页框基地址31~22 G 32位地址模式下的4MB分页方式
31 5 4 3 2 1 0 PWT 32字节对齐的PDPT基地址 PCD CR3寄存器 63 36 35 12 11 9 8 5 4 3 2 1 0 PDPT项 PWT AVL P PCD 4KB对齐的页目录基地址(高24位) 31 30 29 21 20 12 11 0 PDPT项号 页目录项号 偏移 页面号 32位线性地址 CR3 低12位 36位物理地址 高24位 页目录指针表 页表 页目录 4×64位 512×64位 512×64位 63 36 35 12 11 9 8 7 6 5 4 3 2 1 0 0 A PCD US P PWT RW AVL 页目录项 4KB对齐的页表基地址 63 36 35 12 11 9 8 7 6 5 4 3 2 1 0 G 0 A PCD US P D PWT RW AVL 页表项 4KB对齐的页框基地址 36位地址下的4KB分页方式地址转换
31 30 29 21 20 0 PDPT项号 页目录项号 偏移 32位线性地址 低21位 CR3 36位物理地址 高15位 页目录指针表 页目录 4×64位 512×64位 63 36 35 21 20 13 12 11 9 8 7 6 5 4 3 2 1 0 页目录项 G 1 A PCD US P PAT D PWT RW AVL 2MB对齐的页框基地址 36位地址下的2MB分页方式地址转换
PML4表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 RW EXB A PCD P AVL PWT US AVL PML4基地址 PDPT表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 A PCD P AVL PWT RW EXB US AVL 页目录基地址 页目录项(4KByte页表) 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 US 0 0 0 A PCD P AVL PWT RW EXB AVL 页目录基地址 页表(4KByte页表) 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 G PAT D A PCD US P AVL PWT RW EXB AVL 页目录基地址 IA-32e模式下的4KB内存分页结构项的格式
IA-32e模式下的2MB内存分页结构项的格式 PML4表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 RW EXB A PCD P AVL PWT US AVL PML4基地址 PDPT表 63 62 51 39 12 11 9 8 7 6 5 4 3 2 1 0 A PCD P AVL PWT RW EXB US AVL 页目录基地址 页目录项(4MB页表) 63 62 51 39 13 12 11 9 8 7 6 5 4 3 2 1 0 US G 1 D A PCD P AVL PWT RW EXB PAT AVL AVL 页目录基地址
4.4 高速缓冲存储器Cache 4.1.1 Cache的工作原理与地址映射 1. Cache的工作原理
2. Cache的地址映像 1) 直接映像 主存中的每一页都映像到高速缓存中的一个固定页,而高速缓存中的每一页却对应着主存中的若干页。 这是最简单的一种映像技术,易于实现,地址变换速度快,但是不够灵活,Cache的页冲突概率高,空间利用率低。 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-through,WT)型:对主存的读或写操作都使用Cache。如果Cache命中,则读操作将会直接读Cache行,如果没有命中则会引起一个Cache填充事件。所有的写在可能的情况下都被写入到Cache行,并且同时写到主存中。 • 写回(Write-back,WB)型:对主存的写和读操作都使用Cache。如果Cache命中,则读操作将会直接读Cache行,如果没有命中则会引起一个Cache填充事件。写操作被写到Cache中。被修改的Cache行,在稍后才被写到主存中。 • 写保护(Write-protected,WP)型:读操作在可能的情况下是从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行无效。