计算机的硬件组成结构¶
约 3052 个字 预计阅读时间 11 分钟
计算机有三大硬件组成部分
-
CPU:包含运算器,控制器,寄存器
-
主存储器
-
I/O接口:辅助存储器,输入设备,输出设备
而汇编程序员将硬件抽象为
-
寄存器
-
存储器地址
-
输入输出地址
寄存器(Register)¶
Info
寄存器是处理器内部的高速存储单元,用于暂时存放程序执行过程中的代码和数据
大致可以分成两类
-
透明寄存器:对应用人员不可见,不能编程直接控制
-
可编程(programmable)寄存器:具有引用名称,可以直接供编程使用
可编程寄存器又分为通用寄存器和专用寄存器
处理器通用寄存器¶
处理器最常使用整数通用寄存器,可以用于保存整数数据,地址等
32位的IA-32处理器具有8个32位通用寄存器
- EAX,EBX,ECX,EDX,ESI,EDI,EBI,ESP
Register | English Name | Chinese Name |
---|---|---|
EAX | Accumulator | 累加器 |
EBX | Base Address | 基址寄存器 |
ECX | Counter | 计数器 |
EDX | Data | 数据寄存器 |
ESI | Source Index | 源变址寄存器 |
EDI | Destination Index | 目的变址寄存器 |
EBP | Base Pointer | 基址指针 |
ESP | Stack Pointer | 堆栈指针 |
源自16位8086处理器的8个16位通用寄存器(E为扩展,即extend)
- AX,BX,CX,DX,SI,DI,BP,SP,前四个寄存器可分高低字节,形成8个8位的通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL
这使得这些寄存器既是一个整体,又可以独立使用
图示
处理器专用寄存器¶
专用寄存器主要有三类,标志寄存器,指令指针寄存器,段寄存器
标志(Flag)寄存器¶
什么是标志
标志体现了某种工作状态,有些处理器标志用于反映指令执行结果(加减是否进位借位,数据是否为0,正负),有些处理器标志用于控制指令执行形式(处理器是否单步操作,是否响应外部中断)
各种标志组合在一个专用寄存器形成标志寄存器,8086支持16位的标志寄存器FLAGS
IA-32处理器形成32位EFLAGS标志寄存器
-
状态标志:记录指令执行结果的辅助信息,是处理器最基本的标志
- 加减运算和逻辑运算指令主要设置他们
- 其他有些指令的执行也会相应地设置他们
- 处理器主要使用其中5个构成各种条件(分支指令判断这些条件实现程序分支)
-
控制标志: 方向标志DF,仅用于串操作指令
- 系统标志: 控制操作系统或核心管理程序的操作方式
指令指针寄存器EIP¶
用于保存 将要执行的指令在主存的存储器地址 ,相当于一个指向将要执行指令的指针
-
在顺序执行时会自动增量,指向下一条指令
-
分支,调用等操作时执行控制转移指令修改,引起程序到指定的指令执行
-
在出现中断或者异常时被处理器赋值而相应改变
段寄存器¶
存储空间分段管理
“段”是保存相关代码或者数据的一个主存区域
应用程序主要涉及三类基本段
-
代码段(Code Segment) 存放程序的可执行代码(处理器指令)
-
数据段(Data Segment) 存放全局变量等程序所用的数据
-
堆栈段(Stack Segment) 这是程序所需要的特殊区域,用于存放返回地址,临时变量等
段寄存器表明某个段在主存中的位置
根据各个段的首字母缩写来给相应的寄存器命名,共有6个16位寄存器
代码段 | CS |
---|---|
堆栈段 | SS |
数据段 | DS,ES(Extra segment),FS,DS |
代码段的当前指令地址
- 段基地址:由代码段寄存器CS保存
- 偏移地址:由指令指针寄存器EIP保存
堆栈段的当前栈顶地址
- 段基地址:堆栈段寄存器SS保存
- 堆栈指针寄存器ESP保存
数据段的操作数地址
- 段基地址:数据段寄存器DS指示,有时候也用ES,FS,GS指示
- 偏移地址:没有专门的寄存器,由存储器寻址方式计算出的有效地址EA指示
编程采用的逻辑地址为 段基地址:偏移地址 的组合
- 段基地址:在主存中的起始地址
- 偏移地址:距离段基地址的便宜量
Info
总结
寄存器分为不可编程的 透明寄存器 和 可编程寄存器 ,可编程寄存器又可以进行分类
分类 | 类型 | 寄存器 |
---|---|---|
通用寄存器 | 32位通用寄存器 | EAX EBX ECX EDX ESI EDI EBP ESP |
16位通用寄存器 | AX BX CX DX SI DI BP SP | |
8位通用寄存器 | AH AL BH BL CH CL DH DL | |
专用寄存器 | 标志寄存器 | EFLAGS |
指令指针寄存器 | EIP | |
段寄存器 | CS DS SS ES FS GS |
存储器组织¶
计算机硬件组成结构中的主存储器容量很大,被划分为许多存储单元,每个存储单元被编排一个号码,即存储单元地址,称为 存储器地址(Memory Address)
每个存储单元以字节为基本存储单位
- 即字节编址(Byte Addressable)
- 一个字节(Byte)等于8个二进制位(Bit),两个字节称为字,两个字称为双字
- IA-32有32位地址,可以访问 4GB 内存
存储器的物理地址¶
处理器连接的物理存储器使用物理地址
- 从0开始顺序编排,直到其支持的最大存储单元
存储管理单元和存储模型¶
高性能处理器集成有存储管理单元MMU,利用它进行主存储器空间管理
存储管理单元(Memory Management Unit, MMU)是计算机系统中的一个硬件组件,负责管理计算机的内存使用情况。它在CPU与物理内存(RAM)之间起到桥梁作用,主要职责有:
-
地址转换(虚拟内存到物理内存映射) 程序并不直接寻址物理存储器 MMU将程序使用的虚拟地址(逻辑地址)转换为物理地址。这种地址转换通常是通过分页(paging)或分段(segmentation)机制来实现的。每个进程在自己的虚拟地址空间中运行,这样可以使多个进程共存于系统内存中而互不干扰。
-
内存保护 MMU可以设置不同的权限(如读、写、执行)来保护内存区域,防止一个进程访问另一个进程的内存或操作系统内存,保障系统的安全性和稳定性。
-
内存分配与回收 MMU协助操作系统在程序运行时分配和释放内存。它帮助管理物理内存的分配,以确保内存高效利用并减少碎片化。
-
分页管理 MMU通过分页机制,将程序的虚拟内存划分为固定大小的块(称为页面),并将这些页面映射到物理内存的实际位置。这样可以有效地管理内存,并支持虚拟内存技术,使程序能够使用超过物理内存大小的内存空间。
-
缓存管理 在一些高级系统中,MMU也参与管理CPU缓存(如L1、L2缓存)与内存之间的数据交换。它确定哪些数据应该留在缓存中以提高访问速度。
-
异常处理 当程序试图访问无效的地址(如没有映射到物理内存的虚拟地址)时,MMU会产生一个异常(通常称为页面错误或缺页中断),通知操作系统处理这个情况,如分配新的内存页或从磁盘加载需要的数据。
IA-32 处理器的存储模型
- 平展存储模型(Flat Memory Model):存储器是一个连续的4GB线性地址空间
- 段式存储模型(Segmented Memory Model)
- 存储器由一组独立的地址空间组成:段(Segment)
- 每个段都可以达到4GB
- 实地址存储模型(Real-address Memory Model)
- 8086处理器的存储模型(最大1MB)
- 段式存储模型的特例(段最大64KB)
Example
存储器空间可以分段管理,采用逻辑地址指示
举个例子,有一幢楼,3层,每一层有10个房间,首先我们从第一层01开始编号到最后一个房间30
对于第二层第五个房间,物理地址是绝对地址:15,但是为了方便,它被称为205,这就是它的逻辑地址(相对地址)
三大地址的关系
程序员编程时采用逻辑地址,操作系统利用存储管理单元MMU将逻辑地址映射成线性地址(虚拟地址),处理器使用物理地址访问主存储器芯片
逻辑地址(Logical Address)
- 定义: 逻辑地址是程序员在编写程序时使用的地址,由CPU在执行程序时生成。
- 特点: 逻辑地址是相对于程序的起始地址的偏移量,与实际的物理内存位置无关。
- 别名: 逻辑地址也被称为 虚拟地址(Virtual Address) 。在每个进程的上下文中,逻辑地址是唯一的。
- 使用: 逻辑地址是在程序代码中使用的,比如指针或数组索引。它们是由编译器生成的,并且不会直接对应到物理内存的具体位置。
线性地址(Linear Address)
- 定义: 线性地址是将逻辑地址转换成物理地址之前的一个中间地址。它是经过分段(segmentation)计算后的地址。
- 特点: 线性地址是通过把逻辑地址和段寄存器(如CS、DS等)中的段基址相加得到的。
- 使用: 在有些体系结构中,线性地址可能直接等于物理地址(如无分页机制的情况下),但是在大多数现代处理器中,线性地址通过分页机制进一步转换为物理地址。
物理地址(Physical Address)
- 定义: 物理地址是内存单元在计算机实际物理内存(RAM)中的位置。它是CPU最终使用的实际地址。
- 特点: 物理地址由线性地址经过分页(paging)机制转换而来,是指向实际内存芯片的地址。
-
使用: 物理地址是由内存控制器使用的,用于访问实际的物理内存位置。
-
逻辑地址到线性地址的转换(分段):
-
逻辑地址由程序生成,分为段选择器和段内偏移量。段选择器指向内存段描述符(存储在段寄存器中),而偏移量指向段内的具体位置。
- MMU使用段选择器查找段基址,然后将段基址与偏移量相加,生成线性地址。
- 公式:
$$ \text{线性地址} = \text{段基址} + \text{逻辑地址中的偏移量} $$
-
线性地址到物理地址的转换(分页):
-
线性地址进一步通过分页机制转换为物理地址。分页机制将线性地址划分为多个固定大小的页面,线性地址中的页号部分用于查找页表(Page Table),得到物理页帧号。
- 线性地址的页内偏移量部分与物理页帧号组合形成物理地址。
- 公式:
$$ \text{物理地址} = \text{物理页帧号} + \text{页内偏移量}$$
- 逻辑地址 是程序员或编译器使用的地址,描述的是虚拟内存中的位置。
- 线性地址 是经过分段机制转换后的地址,是逻辑地址与段基址之和。
- 物理地址 是存储器中实际访问的位置,由线性地址经过分页机制转换得到。