汇编语言与逆向技术基础 二、IA-32 处理器体系结构

本章知识点

  • 计算机体系结构
  • IA-32 处理器体系结构
  • IA-32 的内存管理

计算机体系结构

计算机基本概念

  • 计算机基本结构
  • 指令执行周期
  • 内存的读取
  • 程序如何运行的

计算机基本结构

寄存器、ALU、CU、时钟、内存存储单元、输入输出设备

数据总线、地址总线、控制总线(由前两个总线实现)

  • 中央处理器 Central Processor Unit,进行计算和逻辑操作的地方
    • 寄存器 Register:数据存储,数量有限
    • 时钟 Clock:同步 CPU 内部操作
      • 每个时钟周期 CPU 完成一步操作
      • 时钟频率 = 1/时钟周期
      • 时钟频率反映了 CPU 速度的快慢
      • 软件优化
    • 控制单元 CU:控制机器指令的执行步骤
    • 算术逻辑单元 Arithmetic Logic Unit:算术运算、逻辑运算
  • 内存存储单元
    • Memory storage unit 存放指令和数据的地方
    • 核心频率 133MHz~200MHz
  • 总线 Bus
    • 数据总线 data bus
    • 地址总线 address bus
    • 控制总线 control bus
    • MHz

指令执行周期

  • 单条机器指令的执行包括一系列操作

    • 取指令(需要访存):指令指针 IP
    • 解码:控制单元 CU 确定执行什么操作
    • 取操作数(需要访存):从内存读操作数
    • 执行:算术逻辑单元 ALU
    • 存储输出操作数(需要访存):向内存中写入

    一般来说,执行一次机器指令需要访存3次。

IA-32 处理器体系结构

  • IA-32(Intel Architecture 32-bit)英特尔32位体系结构
    • 1985年 80386 CPU 首先使用
    • 32 位内存地址
    • 32 位数据操作数

工作模式

  • 实地址模式 Real-Address Mode

    • 16 位,8086 程序设计环境
    • 20 条地址线
    • 储存空间 1MB(2202^{20} bit​)
  • 保护模式 Protected Mode

    • 32 位,IA-32 程序设计环境
    • 虚拟 8086 模式:执行 8086 程序
    • 多任务操作系统
    • 程序有独立的 4GB 内存存储空间(2322^{32} bit​)

地址空间

  • IA-32 CPU 4GB 地址空间
    • 32位的寻址上限
  • 8086只有 1MB 地址空间

寄存器

  • 寄存器是 CPU 内部的高速存储单元

    • 比内存的访问速度快很多
    • 优化循环结构执行速度,把循环计数变量放到寄存器中。
  • 通用寄存器 8个32位通用寄存器

    EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI

段寄存器

  • CS 代码段

  • SS 栈段

  • DS 数据段

  • ES (额外)数据段

  • FS 数据段(异常处理)

  • GS 数据段

EFLAGS 寄存器

  • 零标志 ZF:若算数结果或逻辑运算结果为0,将其置1,反之清零

    • xor eax, eax
    • jz
  • 进位标志 CF:在无符号算数运算的结果的最高有效位若发生进位或借位,则将其置1,反之清零。

    • add eax, 0xffffffff
    • jc
  • 溢出标志 OF:在有符号算数运算中结果太大或太小并且目的操作数无法容纳时,将其置为一,标志是否溢出

  • 符号标志 SF:0 表示结果为正,1 表示结果为负。

  • 奇偶标志位 PF:包含偶数个1位,置为1。

  • 辅助进位标志 AC:若第三位发生进位,置为1

  • 方向标志 DF

  • 陷阱标志 TF:将该位设置为 1 以允许单步调试模式,清零则禁用该模式

指令指针

  • 指令指针寄存器 EIP 存放下一条指令的内存地址
  • 跳转指令可以修改 EIP

IA-32 的内存管理

  • IA-32 保护模式的内存管理比实地址模式要复杂
    • 多任务
    • 多用户
    • 段模式、页模式
    • 页模式是基于段模式的,通常称为段页式

平坦模式 FLAT

  • 每个程序有独立的 4GB 虚拟地址空间
    • 数据,指令,数据<->指令
  • 虚拟地址到物理地址的转换是透明的

段管理

  • 一般保护模式的程序有三个段

    • 代码段 CS
    • 数据段 DS
    • 堆栈段 SS
  • 段是一块内存空间

  • GDT 全局描述符表

    • 整个系统只有一个 GDT 64bit
    • Intel 提供了一个寄存器 GDTR 来存放 GDT 的入口地址
  • LDT 局部描述符表

    • 每个程序都有自己的 LDT
    • IA-32 为 LDT 的入口地址也提供了一个寄存器 LDTR
    • 任何时刻只有一个任务允许,所以LDTR只有一个

分页机制