《汇编语言 基于x86处理器》- 读书笔记 - 第2章-x86处理器架构
2.1 一般概念
- x86处理器家族:涵盖了Intel IA-32(如Pentium, Core-Duo)及Intel 64(AMD64)架构,还包括AMD的Athlon, Phenom, Opteron等处理器。
- 汇编语言的作用:作为一种工具,汇编语言帮助学习计算机如何工作,要求掌握一定的计算机硬件知识。
2.1.1 基础微型计算机设计
CPU核心组件:包括有限数量的寄存器(Register)、高频时钟(CU)、控制单元(CU)和算术逻辑单元(ALU)。
-
寄存器(Register):寄存器在CPU内部,读写速度最快,数量有限。主要用于临时存储数据和指令,参与算术逻辑运算,以及作为地址指针使用。根据CPU不同可支持:8位、16位、32位、64位。
-
时钟(Clock):计算机CPU的运作受内置时钟控制,该时钟以恒定频率产生脉冲,定义了操作步调。时钟频率(GHz单位)揭示了CPU每秒能执行的时钟周期数,从而反映其运算速度;1GHz意味着每个周期1纳秒。指令执行至少耗时一个周期,某些如乘法操作可能需几十周期,且内存访问指令会遭遇等待状态(wait states),因速度不匹配导致周期空转。
-
控制单元(Control Unit, CU):控制单元是CPU的核心,负责指挥和协调整个处理器的工作流程。它根据指令执行的序列,生成必要的控制信号,以驱动其他部件(如ALU、内存接口等)正确执行。控制单元解读指令寄存器中的指令,决定何时读取数据、何时执行运算、何时存储结果以及何时跳转到下一个指令等。
-
算术逻辑单元(Arithmetic Logic Unit, ALU):ALU是CPU内部执行基本数学运算和逻辑运算的部分,如加减乘除、位运算(AND、OR、NOT等)。它根据控制单元的指令,对来自寄存器的数据进行处理,并将运算结果返回到寄存器或直接用于下一步操作。
2.1.2 指令执行周期
CPU指令执行周期1可以概括为以下五个基本步骤:(或简化为三个步骤:取指、译码、执行)
-
取指令(Fetch):
- CPU的指令指针(Instruction Pointer/IP)指向内存中的
当前
指令地址。 - 指令地址通过地址总线发送到内存。
- 内存控制器响应此地址,将指令通过数据总线送回CPU。
- 指令被加载到CPU内部的指令寄存器。
- 指令指针自动递增,指向下一个指令的地址。
- CPU的指令指针(Instruction Pointer/IP)指向内存中的
-
指令译码(Decode):
- CPU的指令解码器分析指令寄存器中的二进制指令,识别出操作码(Op-code)和操作数(Operand)。
- 如果有操作数,确定它们是直接数值、寄存器引用还是内存地址。
-
操作数准备(Operand Fetch/Address Calculation):
立即数
或寄存器
中的操作数直接用于下一步。- 对于内存中的操作数:
- 首先:计算地址。
- 然后:将
操作数地址
传给内存控制器
。 - 最后:通过
数据总线
读取实际操作数
,加载到通用寄存器中。
-
执行(Execute):
- **算术逻辑单元(ALU)**根据操作码执行相应的操作,如加、减、逻辑运算等。
- 浮点单元(如果指令涉及浮点运算)可能也会参与。
- 运算结果存于一个或多个寄存器中。
- 更新状态标志(如零标志ZF、进位标志CF、溢出标志OF等)以反映运算结果的特性。
-
写回(Write Back/Store Result):
- 如果指令有结果且需要写回内存或影响状态,则将结果从寄存器通过数据总线写入目标位置。
- 如果结果仅影响CPU内部状态,则更新相关寄存器即可。
这是CPU指令执行的一般过程,但请注意,实际的CPU架构和指令集可能会有所差异,导致执行周期中的具体步骤有所不同。在某些架构中,还有可能插入等待周期(wait states)以应对内存访问延迟等问题。
2.1.3 读取内存
与访问CPU内部寄存器
相比,读取内存
的操作是一个相对缓慢
的过程。
从CPU发出读取指令到接收到数据。内存读取过程2包含:地址放置、读信号激活、等待响应及数据传输四个主要步骤,每个步骤需要一定的时间,这个时间通常远大于
一个时钟周期。(而CPU访问寄存器通常只需要单个时钟周期
。)
具体所需的时间取决于多个因素,比如内存类型(如DDR3、DDR4、DDR5)、内存控制器的效率、CPU与内存之间的通信协议(如FSB、QPI、UPI、PCIe)以及系统的整体延迟特性等。
现代CPU和内存控制器通过预取、缓存、多通道内存技术等多种手段来减少这种延迟对系统性能的影响。
缓存机制存储最近和预测将要使用的数据,有效缩短了访问时间,提高了处理器的工作效率。缓存命中是优化性能的关键,而合理设计缓存策略对提升整体系统性能至关重要。
-
预取(Prefetching):通过预测未来可能需要的数据或指令,提前将其从较慢的存储层级(如内存)加载到较快的缓存中,从而减少实际执行时的等待时间,提升数据访问效率。
-
缓存(Caching):缓存是位于CPU与主存之间的高速小容量存储器,用于暂时存放近期访问过的数据或指令。它利用局部性原理,让CPU能够快速重复访问频繁或最近访问的信息,减少对较慢内存的依赖,加速处理流程。当CPU能够在缓存中找到所需数据,称为缓存命中;反之,如果数据不在缓存中,即发生缓存未命中,此时就需要从较慢的主内存中读取数据。
-
多通道(Multi-Channel Memory):多通道内存技术指内存控制器能够同时通过两个或更多独立通道与内存模块通信,实质上并行读写数据,从而成倍提升内存带宽,加快数据传输速率,是提高系统整体性能的关键技术之一。
2.1.4 加载并执行程序
以在Windows
操作系统环境下,执行D:\demo.exe
为例,从用户操作直至程序结束和资源回收,整个过程深入体现了操作系统对进程生成、管理和资源调控的复杂机制。以下是综合的流程概述:
-
用户触发执行:用户通过图形界面操作(如双击文件图标)或在命令提示符下输入命令
D:\demo.exe
来启动程序。 -
文件定位与权限验证:系统验证路径有效性并在D盘根目录寻找
demo.exe
,同时检查用户权限,确保用户有权执行此文件,并根据UAC和ACL进行安全评估。 -
系统准备:操作系统分配必要的内存资源,解析PE头信息以正确加载程序代码、数据段、堆栈和堆。此外,对于动态链接库(DLL)的依赖,系统会加载它们并处理重定位信息。
-
进程创建与环境初始化:创建新进程,赋予其唯一PID,初始化PCB,并设置段寄存器(CS, DS, ES等)、栈指针(SS, SP)和指令指针(EIP),准备进程执行环境。
-
安全与初始化检查:进行安全检查,如数字签名验证和病毒扫描,确保程序安全,同时完成所有初始化工作。
-
执行与资源管理:控制权转交至进程入口点(如PE头指定的代码入口),操作系统持续监控进程状态,通过调度器分配CPU时间片,并管理内