【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常

简介: 【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常

 

💭 写在前面:本文将学习深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 。CSAPP 是计算机科学经典教材《Computer Systems: A Programmer's Perspective》的缩写,该教材由Randal E. Bryant和David R. O'Hallaron 合著。

 本篇博客全站热榜排名:未上榜


0x00 控制流(Control Flow)

控制流(Control Flow)指的是程序执行的顺序和流程。程序从一个语句开始执行,然后按照一定的顺序执行其他语句,这些语句之间的执行顺序就构成了程序的控制流。控制流可以分为顺序控制流、选择控制流和循环控制流三种基本类型。

处理器只做一件事:从开机到关机,CPU 只是一次次地读取和执行(解释)一连串的指令。该序列是 CPU 的控制流 (control flow) :

0x01 改变控制流(Altering the Control Flow)

你所知道的:改变流的两种 机制 (mechanisms):

跳转 (Jumps) 和 分支 (branches) ,调用和返回 根据程序状态(即变量的值)执行。

* 跳转指令:在程序中使用跳转指令(如 goto、break、continue)

程序的控制流在计算机中是通过跳转指令(如条件跳转、无条件跳转等)来实现的。在程序运行时,处理器根据指令的执行结果来决定跳转到哪条指令执行,从而实现程序的控制流。

但是,这对于一个有用的系统来说是不够的。

必须要根据 系统状态 (system state) 的变化做出反应。比如:数据从磁盘或网络适配器到达、指令访问了无效的内存地址、用户在键盘上敲 Ctrl-C、系统定时器过期。

OS 需要机制来管理 异常控制流 (exceptional control flow),突然改变控制流程以应对上述情况。

异常处理:在程序运行过程中,如果出现了异常情况(如除零、数组越界等),程序会自动跳转到相应的异常处理代码,进行异常处理并改变程序的控制流。

0x02 异常控制流(Exceptional Control Flow)

存在于计算机系统的各个层面。

在计算机系统中,异常控制流(Exception Control Flow)指的是在程序执行过程中发生了异常事件(如除零、内存访问越界、系统调用出错等),导致程序执行流程发生了变化。

底层机制:

  • 异常 (Exceptional):响应系统事件(比如系统状态的改变)而改变控制流,利用硬件和操作系统软件的组合实现

上层机制:

  • 进程上下文切换 (Process context switch):主要由操作系统软件实现。
  • 信号 (signal):主要由操作系统软件实现

Exception:An exception is a transfer of control to the OS kernel in response to some event

什么是异常?异常是对某些事件的控制权转移到操作系统内核的反应。

内核是操作系统的内存驻留部分,比如除零,算术溢出,I/O 请求完成,按 Ctrl-C……

0x03 异常表(Exception Tables)

在操作系统中,Exception Tables(异常表)是用于处理中断和异常的一种数据结构。

当操作系统运行过程中发生中断或异常时,操作系统会使用异常表来确定如何处理这些事件。

每种类型的事件都有一个唯一的异常编号 是异常表的一个索引。

每次异常 发生时,处理程序 都会被调用。

0x04 异常类别(Classes of Exceptions)

"Interrupts, Traps, Faults, and Aborts"

异常 (Interrupts)、陷阱 (Traps)、故障 (Faults)、终止 (Aborts)。

0x05 异步异常 - 中断(Asynchronous Exceptions - Interrupts)

由处理器外部的事件引起:通过设置处理器的中断引脚指示,处理程序返回到 "下一个 "指令。

💭 例子:

定时器中断:每隔几毫秒,外置定时器芯片 (external timer chip) 就会触发一次中断、内核用来从用户程序中夺回控制权。

来自外部设备的 I/O 中断:在键盘上按下 Ctrl-C、网络中的数据包到达、磁盘中的数据到达

0x06 同步异常(Synchronous Exceptions)

由执行指令后发生的事件引起的。

陷阱 (Traps):

  • 故意的 (Intentional)
  • 示例:系统调用、断点陷阱、特殊指令
  • 将控制返回到 next 指令

故障 (Faults):

  • 意外,但可能恢复
  • 示例:页面故障、一般保护故障、浮点异常
  • 重新执行错误 "current" 指令或中止

终止 (Aborts) :

  • 意外,且不可恢复
  • 示例:奇偶校验错误、机器检查
  • 中止当前程序

同步异常(陷阱),示例:系统调用 (syscall)

同步异常(陷阱),示例:页错误

同步异常(终止),示例:发生的硬件错误,如奇偶校验错误、当 DRAM 或 SRAM 位损坏时。

* 术语注释,不要沉迷于这种分类法(其实并没有明确的共识!)

0x07 x86-64系统中的异常示例

示例:选择性显示 (selectively shown):

从 0 到 31 的数字在 Intel 架构中定义(对于任何x86-64系统都是相同的)

从 31 到 255 的数字由操作系统开发人员定义。例如,Linux 为称为系统调用的特殊陷阱 (special trap) 保留 128(0x80)。

0x08 陷阱示例:系统调用

每个 x86-64 系统调用都有一个唯一的 ID 号,示例:

0x09 系统调用示例:打开文件

用户调用:

open(filename, options)

调用__open函数,该函数调用系统调用指令 syscall。

00000000000e5d70 <__open>:
...
e5d79: b8 02 00 00 00 mov $0x2,%rax    # open is syscall #2
e5d7e: 0f 05 syscall                   # Return value in %rax
e5d80: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
...
e5dfa: c3 retq

%rax 包含系统调用号。

其它参数在 %rdi、%rsi、%rdx、%r10、%r8、%r9 中。

以 %rax 为单位的返回值。

负值是与负 errno 相对应的错误

0x0A 故障示例:页错误(Page Fault)

每个 x86-64 系统调用都有一个唯一的 ID 号

例子:

0x0B 故障示例:无效内存访问(Invalid Memory Access)

程序访问无效的内存地址。

向用户进程发送 SIGSEGV 信号。

用户进程退出时出现 segmentation fault。

int a[1000];
main ()
{
    a[5000] = 13;
}

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.3.9
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Computer Systems: A Programmer's Perspective (3rd Edition)

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

相关文章
|
机器学习/深度学习 人工智能 芯片
极智AI | 谈谈为什么量化能加速推理
本文主要讨论一下为什么量化能加速模型推理。
1315 0
|
SQL Oracle 关系型数据库
DDL、DML和DCL的区别与理解
DDL、DML和DCL的区别与理解
2707 1
DDL、DML和DCL的区别与理解
|
6月前
|
Linux Windows
Wget安装教程:Windows命令行下载工具部署步骤(附环境变量配置方法)
Wget是Linux自带的命令行下载工具,支持HTTP/HTTPS/FTP协议,Windows需手动安装。下载单文件版wget.exe,放入指定文件夹并配置系统环境变量Path,即可在cmd中通过`wget + 网址`快速下载文件,操作简便高效。
4794 1
|
7月前
|
Ubuntu 编译器 Linux
Ubuntu下GCC编译器完全指南(手把手教你安装、配置和使用GCC进行C语言开发)
本教程详细介绍在Ubuntu系统中安装与使用GCC编译器的完整流程,涵盖检查、安装、编写C程序、编译运行及常用选项,助你快速掌握Linux编程基础,迈出开发第一步。
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
8531 119
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
缓存 JavaScript 前端开发
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
一、鸿蒙中的装饰器是什么? 在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。
300 0
|
存储 安全 API
阿里云先知安全沙龙(上海站) ——红队武器开发之基于合法服务的隐蔽C2
C2(命令与控制)是攻击者远程控制受感染主机的技术。通过合法服务平台(如Slack、Telegram等)的API,攻击者可以隐蔽地传输指令和数据,避免被传统检测机制发现。合法服务具备以下优势: 1. **隐蔽性强**:流量隐藏在正常通信中,难以被检测。 2. **开发成本低**:无需自行开发服务端,减少工作量。 3. **抗封禁能力**:合法域名/IP不易被封禁,威胁情报不会标黑。 4. **团队协作**:天然支持多成员协同作战。 示例包括SaaiwC组织利用Telegram和APT29组织利用Zulip平台进行数据传输和控制。
|
监控 数据挖掘 API
🔥 新手也能懂!Shopee商品详情API接口全攻略
本文介绍了一个用于采集Shopee商品数据的API及其使用方法。通过该API,电商运营者可快速监控竞品价格、销量与评价;数据分析人员能批量获取商品信息进行市场调研;开发者则可构建自动化工具如比价系统或生成报告。内容涵盖注册准备、关键参数说明、Python代码示例以及实战案例(如监控竞品差评)。此外,还提供了防封技巧、常见问题解答及适合人群分析,帮助用户高效上手并解决实际需求。
|
人工智能 安全 网络虚拟化
指南:Grok官网是什么?国内如何使用grok 3 官网AI
Grok AI 是一款非常强大的人工智能助手,不仅能够在社交媒体管理、语音助手等方面为用户提供便利,还可以极大提升工作效率。
10957 5
|
存储 数据安全/隐私保护 Windows
逆向学习Windows篇:进程句柄操作详解
逆向学习Windows篇:进程句柄操作详解
1070 1