CPU 内存管理

Computer System Basis

Posted by 汤汤 on November 23, 2023

=====================

系统相关

进制转换

1B = 8 bits、 1字节 = 8 比特

16进制(0x00–0xFF)对应10进制(0–$2^4^ * 2^4^ -1$ 即255) 对应二进制(2^8^ ,即1字节)

$\Rightarrow$ 在地址转换中(如,0x002400D0),位16进制对应1字节,位16进制对应4字节。4字节 = $2^2 * 2^3bits = 2^5bits$ = 32位

定义:32位 v.s. 64位

计算机的最小存储单元是1Byte,即内存单元。 32位和64位区别是CPU内存单元地址的个数,即CPU的寻址能力。CPU的寻址能力由地址总线的宽度(总线的位数)决定。

32位:地址空间由8个16进制数(0x0000 1111)表示,即对应4字节,4*2^3^= 2^5^ = 32位。32位寻址的CPU支持 2^32^大小的地址。

64位:地址空间由16个16进制数(0x0000 1111 2222 3333)表示,即对应8字节,8*2^3^ = 2^6^ = 64位。64位寻址的CPU支持2^64^大小的地址。

汇总如表所示 :
32位 64位
1 2 3

ISA架构

表列出了厂商设计的处理器架构。:)

厂商 复杂or精简 CPU架构 备注
Intel CISC x86 可变指令长度
AMD CISC x86
IBM RISC PowerPC 基于POWER(Performance Optimized With Enhanced RISC)
ARM RISC ARM 多数32位嵌入式处理器

表 :) 汇总了一些主流CPU支持的位数及其特点。

位数 x86(IA86;i386) IA64 x86-64(x64) AMD64
32位        
64位        
备注   不兼容32位,遇冷 intel提出 AMD提出
区别 8个32位通用寄存器(EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI) 拓展为64位通用寄存器(RAX,RBX,RCX,RDX,RBP,RSP,RSI,RDI),并新增了r8 $\sim$ r15这6个寄存器 拓展为64位通用寄存器(RAX,RBX,RCX,RDX,RBP,RSP,RSI,RDI),并新增了r8 $\sim$ r15这6个寄存器 拓展为64位通用寄存器(RAX,RBX,RCX,RDX,RBP,RSP,RSI,RDI),并新增了r8 $\sim$ r15这6个寄存器
MIPS Microprocessor without interlocked piped stages
这里需要补充

无内部互锁的管道(流水)级微处理器

寄存器:32位 v.s. 64位

控制寄存器
  • CR0:
    • 系统控制寄存器
    • 0bit: protected enable,PE=1时启动保护模式
    • 1bit: moniter coprocessor,监控协处理位
    • 2bit: emulate coprocessor,模拟协处理器位,EM=1时不能使用协处理器
    • 3bit: task switch,任务转换完成后TS置为一,随之不能使用协处理器(与MP合作)
    • 4bit: processor extension type,保存处理器拓展类型的信息,ET=0表示使用287协处理器,ET=1表示使用387浮点协处理器
    • 16bit: write-able protected 写保护未即位,WP=0则禁止写保护
    • 31bit: paging enable。
  • CR1
    • 未定义的控制寄存器
  • CR2
    • 页故障线性地址寄存器
  • CR3
    • 页目录基址寄存器
    • 保存页目录表的物理地址
  • CR4
    • 在pertium系列处理器中实现
    • 如何启动虚拟8086模式

CR0-CR4寄存器

8位和16位寄存器
如表所示 :
分类 名称
8位寄存器 AL CL DL BL AH CH DH BH
16位寄存器 AX CX DX BX SP BP SI DI
32位寄存器

表中整理了32位的8个通用寄存器。:)

寄存器名称 类型 含义 惯例
EAX 数据寄存器 累加器 accumulator,操作数和结果数据累加器 调用者保存
ECX 数据寄存器 计数器 counter, 字符串和循环操作计数器 调用者保存
EDX 数据寄存器 乘法形成的部分结果或除法之前的部分被除数 调用者保存
EBX 数据寄存器 base,基地址,在内存寻址时存放基地址 被调用者保存
ESP 指针寄存器 stack pointer,指向栈顶,即栈指针 被调用者保存
EBP 指针寄存器 base pointer,保存栈帧的起始地址(基地址),即帧指针。这样才顺利返回到调用函数。ss段的数据指针 被调用者保存
ESI 变址指针寄存器 string操作的源指针 source,ss段的数据指针 不得占用
EDI 变址指针寄存器 string操作的目标指针 destination,ES段的数据指针 不得占用

32位CPU除了以上通用寄存器,还有段寄存器(ES CS SS DS FS GS)如表 :( 所示、指令指针寄存器(EIP)和标志寄存器(Eflags),其中:

(1)段寄存器1 的值和偏移量组合成内存单元的物理地址。(分段和分页的区别2。)

(2)EIP存放下次将要执行的指令在代码段中的偏移量。标志寄存器内的flags在表 中列出。

表在这里 :(

简称 全称 备注
CS Code segment register 代码段段值
DS data segment register 数据段段值
ES extra segment regiter 附加数据段段值
SS stack segment register 堆栈段段值
FS extra segment register 附加数据段段值
GS extra segment register 附加数据段段值

标志寄存器的表在这里

flags 含义 备注
CF carry 进位符  
PF parity 奇偶标志位 用于奇偶校验
AF auxiliary carry 辅助进位符 字操作中,发生低字节向高字节进位或借位;字节操作中,发生低4位向高4位进位或借位
ZF zero flag  
SF Sign flag 正数为0,负数为1
OF overflow  
TF trap flag 用于程序执行,状态控制标志位
IF interrupt-enable 中断允许 状态控制标志位
DF direction flag 状态控制标志位
  • 16位寄存器的寻址: 只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为偏移地址的一部分。这里需要补充16位寄存器的寻址方式

  • 32位寄存器的寻址: 指令1:mov$ $ebx,[eax+edx*2+300] 地址中寄存器的书写顺序决定该寄存器是基址寄存器还是变址寄存器,在指令1中\%eax为基址寄存器,\%edx为变址寄存器,300为偏移常量。

64位寄存器

64位CPU有16个通用寄存器,64位寄存器与32位寄存器的区别:

  1. 32位CPU用栈帧作为参数的保存位置,64位CPU用rdi,rsi,rdx,rcx,r8,r9保存1 $\sim$ 6个参数,用rax保存返回值

  2. 32位cpu用ebp作为栈帧指针,64位cpu将rbp作为通用寄存器

  3. 64位支持形式的以PC相关的寻址

堆 栈

分页机制

内存分页技术3,由页表4负责将虚拟空间映射到物理空间。

paging避免了分段产生的大量内存碎片。配合技术提高交换的效率。

多级页表与局部性原理

多级页表5,以二级页表为例,一级页表覆盖到全部的虚拟空间,但只需占用一个page的空间大小,一级页表的页表项存储于二级页表,而二级页表只有在进行有需要时才创建(若某个页表项没用到,就不需要创建其对应的二级页表了)。

多级页表内部的地址转换带来了一定的时间开销,根据程序的局部性原理,计算机在CPU中封装了一个程序最常访问页表项的硬件,转址旁路缓存(translation lookside cache)6

内存交换

段页式内存管理

地址结构 = 段号 :段内页号 :页内偏移

  1. 段寄存器的存在合理性:解决CPU位数和地址总线的数目不同,比如8086CPU为16位,地址总线有20根,为能访问所有的地址空间,设置CS、DS、SS和ES这4个段寄存器;80386CPU为32位,地址总线有32根,但为了兼容16位,寄存器仍为16比特位宽,仍不能访问全部的地址空间,为此80386增加了FS和GS,以及GDTR全局描述表寄存器和LDTR局部描述表寄存器(这俩寄存器不用和16位兼容,故为32位)DTR存放段寄存器的信息(即段描述符),段寄存器中只需要存放其在DTR中的索引。 

  2. 分段和分页的区别:分段给每个进程分配不同的线性空间;分页可将同一线性空间映射到不同的物理空间。 

  3. paging的存在合理性:内存分段导致存在内存碎片,进而提出内存交换技术。然而,交换一个占用内存空间较大的程序到硬盘,效率极低。paging将虚拟空间和物理空间划分为固定尺寸的内存,即page。 

  4. 页表存储在CPU的内存管理单元MMU。若进程访问的虚拟地址不在页表中,产生”缺页”异常,进入内核空间,分配物理内存,更新进程页表。 

  5. 多级页表的存在合理性:简单的paging导致页表项很多,而每个进程都需要自己的虚拟空间,即每个进程都需要一个大大的页表。故单级页表空间浪费严重。 

  6. TLB,也称页表缓存、快表。MMU对TLB的访问交互实现虚拟地址到物理地址的转换。