# 快速陷入处理
[![CI](https://github.com/YdrMaster/fast-trap/actions/workflows/workflow.yml/badge.svg?branch=main)](https://github.com/YdrMaster/fast-trap/actions)
[![Latest version](https://img.shields.io/crates/v/fast-trap.svg)](https://crates.io/crates/fast-trap)
[![issue](https://img.shields.io/github/issues/YdrMaster/fast-trap)](https://github.com/YdrMaster/fast-trap/issues)
[![Documentation](https://docs.rs/fast-trap/badge.svg)](https://docs.rs/fast-trap)
![license](https://img.shields.io/github/license/YdrMaster/fast-trap)
这个库提供一套裸机应用程序陷入处理流程的框架,旨在保证处理性能的同时尽量复用代码。
> **感谢:2022 系统能力赛,哈工大(深圳),[FTL-OS](https://gitlab.eduxiji.net/DarkAngelEX/oskernel2022-ftlos) 提供灵感**
## 目录
- [概念](#概念)
- [术语](#术语)
- [高效转移](#高效转移)
- [陷入向量和突发寄存器](#陷入向量和突发寄存器)
- [陷入栈](#陷入栈)
- [陷入快速路径](#陷入快速路径)
- [切换现场](#切换现场)
- [任务兼容性](#任务兼容性)
- [陷入服务程序的一致抽象](#陷入服务程序的一致抽象)
- [设计解释](#设计解释)
- [使用说明](#使用说明)
- [功能测试](#功能测试)
- [性能测试](#性能测试)
## 概念
**陷入**是硬件的异步机制,由于异常或中断,一个连续的控制流会被硬件打断,然后从另一个位置继续开始。本文将发生陷入的控制流称为**现场控制流**,将由于陷入而到达的控制流称为**陷入控制流**。
对于现场控制流和陷入控制流的关系有 2 种认识:
1. 二者是对等的控制流;
2. 二者不是对等的,而是性质不同的 2 种控制流;
本文基于观点 #2 展开。即,本文认为,发生陷入导致控制流产生了 2 级结构。为方便叙述,规定:对于一次陷入产生的现场控制流和陷入控制流,将现场控制流称为低级控制流,陷入控制流称为高级控制流。
如果软件支持,在陷入控制流上还能再次发生陷入(这并不罕见),这一般被称为**陷入嵌套**。这些嵌套结构使控制流形成了时间上的树状结构。依本文的规定,可以用相对的级别来描述这些控制流的关系。下图展示了一个控制流发生 2 级嵌套的陷入时,控制流的转移过程:
```plaintext
root flow ----x----------x----> t
/ \ / \
/ \ / \_______________
/ \ / \
trap Lv.1 o------>o o-----x----------x---->o
/ \ / \
/ \ / \
/ \ / \
trap Lv.2 o------>o o------>o
```
关于这幅图,需要注意以下 3 点:
1. 图中箭头方向表示时序方向,不表示空间位置。即使是循环,也画成一条线;
2. `x` 表示一次陷入,一般的陷入都是硬件引起的(包括软中断、`ecall` 和 `ebreak`),但也并非绝对。凡是以特定方式进入高级控制流的过程,就认为是广义的陷入;
3. `o` 表示控制流具有空白的栈。箭头起点的 `o` 表示控制流从空白的栈开始,或者说没有**内生状态**,所有状态都来自外部指定,这些外部指定的状态可以理解为广义的参数。箭头指向的 `o` 表示控制流的生命周期结束,栈上所有信息都被清空,所有权转移或释放;
这个库定义了如何在嵌套的陷入中管理多个控制流。所有控制流被分为由用户主动构造的**根控制流**和硬件陷入产生的**非根控制流**。对于根控制流,库并不干涉,用户可以自由地定义其结构和管理方式。非根控制流的基本结构被库限定,以实现对其操作的封装。
### 术语
本文把**陷入**当作名词,描述硬件控制或模拟硬件控制,直接从一个控制流转移到另一个控制流的过程。从陷入控制流回到现场控制流的过程称为**恢复**。可以用**发生陷入**和**执行恢复**来指代这两个动作,以强调陷入通常是突发的、被动的,而恢复是自然的、主动的。
为了区分,**切换**只用于描述软件明确定义的**任务**之间的切换,控制流发生陷入和恢复的动作统一称为**转移**。
### 高效转移
与任意的根控制流相比,非根控制流强调**空入空出**。也就是说,只要发生陷入,一定转移到一个空的控制流,而运行完后则一定清空状态再执行恢复。这个设计是为了降低转移的开销。
如果转移发生在两个非空白的控制流之间,则必须先保存出控制流的现场,再恢复入控制流的现场,然后才能恢复入控制流执行。对于 RISC-V 这样有大量通用寄存器的架构来说,保存和恢复是沉重的负担,至少需要 `(32 - 1) × 2 = 62` 个访存的指令。但如果有一边是空白的控制流,就意味着不需要保存或恢复其现场,转移的开销就会降低一半。
恰好,保持陷入控制流的空入空出是容易的。因为陷入控制流是陷入发生前预先指定的,完全可以总是指定到空白的控制流。而执行恢复是主动的,有充分的时机在恢复前清空状态。因此,本文选择将陷入控制流以非根控制流的形式固定下来,实现控制流转移的高效封装。
如果读者了解**协程异步**,也许可以发现,非根控制流是介于**绿色线程/有栈协程**和**无栈协程**之间的东西。当它被抢占,它就是一个一般的线程,但当它开始和结束的时候,它由于具有特殊的状态而降低了开销。这和协程由于只能在预定的让出点转移,而能预编码转移过程以减小开销的方案如出一辙。
### 陷入向量和突发寄存器
硬件上(ARM、RISC-V M & H & S),陷入和恢复的转移行为是由陷入向量(trap vec)和突发寄存器(scratch)决定的。当硬件发现陷入条件(异常和中断),pc 将指向陷入向量。而刚到达陷入向量时,软件处于举目无亲的状态,所有通用寄存器都因为存放着现场而不能操作,只有预设的突发寄存器可以读写。突发寄存器里必须存放一个指向一些预留空间的指针,以供保存现场。
以上描述是现有的硬件设计决定的,对于软件来说是一种必然。软件能做的只是在可能的陷入发生之前把它们准备好。库提供了一个陷入处理例程,使用 `load_direct_trap_entry` 函数可以以直接模式将其配置到硬件。若要使用中断向量表,可以通过 `trap` 函数找到入口地址。
> 中断向量表是很有意义的,因为中断是外部事件触发的,比异常更加不可预测,中断几乎总是需要封存现场并切换任务,尤其是时钟中断。但异常的解决则非常多样,有可能因为十分简单而能更快地处理。进一步的讨论见[陷入快速路径](#陷入快速路径)。
陷入向量的设置是独立于陷入的,如果没有用于其他操作就只需要初始化一次。而突发寄存器每次陷入都会读写。[下一节](陷入栈)介绍了保存在突发寄存器里的陷入栈对象,包括其结构、生命周期、复用,以及如何构造、加载、卸载和回收。
### 陷入栈
突发寄存器保存着一个指针,同时这也是陷入发生的第一时间唯一可访问的动态数据。虽然任何静态的数据也都是可以找到和使用的,但出于内聚性考虑,将所有封装需要用到的东西打包放在一起是更好的选择。
这个库将陷入栈设计成一个在地址空间上连续的内存块。当用户预期陷入将会发生之前(例如从内核切换到用户之前或打开中断之前),需要预先分配一个陷入栈对象,然后将其**加载**到突发寄
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
毕设&课设&项目&实训-基于开源项目rCore实现的,使用rust语言编写的操作系统。.zip (2000个子文件)
license-apache-2.0 11KB
license-apache-2.0 11KB
libwindows.a 3.09MB
libwinapi_ntdll.a 1.58MB
libwinapi_kernel32.a 1.01MB
libwinapi_onecoreuap_downlevel-kernel32.a 957KB
libwinapi_onecore_downlevel-kernel32.a 955KB
libwinapi_icuuc.a 657KB
libwinapi_advapi32.a 624KB
libwinapi_user32.a 592KB
libwinapi_gdiplus.a 507KB
libwinapi_onecoreuap_downlevel-advapi32.a 504KB
libwinapi_onecore_downlevel-advapi32.a 503KB
libwinapi_onecore_downlevel-user32.a 493KB
libwinapi_onecoreuap-msajapi.a 493KB
libwinapi_windowsapp_downlevel-msajapi.a 489KB
libwinapi_windowsapp-msajapi.a 483KB
libwinapi_icuin.a 461KB
libwinapi_setupapi.a 459KB
libwinapi_gdi32.a 457KB
libwinapi_windowsapp_downlevel-kernel32.a 423KB
libwinapi_onecoreuap-rpcrt4.a 423KB
libwinapi_onecore-rpcrt4.a 422KB
libwinapi_mincore-rpcrt4.a 422KB
libwinapi_rpcrt4.a 418KB
libwinapi_shell32.a 325KB
libwinapi_ole32.a 323KB
libwinapi_onecoreuap_downlevel-oleaut32.a 315KB
libwinapi_onecoreuap-oleaut32.a 311KB
libwinapi_onecore-oleaut32.a 311KB
libwinapi_mincore-oleaut32.a 311KB
libwinapi_onecoreuap_downlevel-shlwapi.a 310KB
libwinapi_onecore_downlevel-shlwapi.a 308KB
libwinapi_oleaut32.a 307KB
libwinapi_onecoreuap-esent.a 295KB
libwinapi_esent.a 290KB
libwinapi_opengl32.a 280KB
libwinapi_onecoreuap_downlevel-ole32.a 279KB
libwinapi_onecore_downlevel-ole32.a 277KB
libwinapi_windowsapp_downlevel-oleaut32.a 272KB
libwinapi_windowsapp-oleaut32.a 268KB
libwinapi_samsrv.a 267KB
libwinapi_wininet.a 256KB
libwinapi_msi.a 232KB
libwinapi_onecoreuap-iphlpapi.a 229KB
libwinapi_onecore-iphlpapi.a 229KB
libwinapi_mincore-iphlpapi.a 229KB
libwinapi_iphlpapi.a 227KB
libwinapi_fwpuclnt.a 225KB
libwinapi_onecoreuap-dnsapi.a 220KB
libwinapi_onecore-dnsapi.a 219KB
libwinapi_mincore-dnsapi.a 219KB
libwinapi_tapi32.a 218KB
libwinapi_windowsapp-rpcrt4.a 216KB
libwinapi_onecoreuap-crypt32.a 199KB
libwinapi_mincore-crypt32.a 199KB
libwinapi_onecore-crypt32.a 199KB
libwinapi_crypt32.a 197KB
libwinapi_onecoreuap-wldap32.a 192KB
libwinapi_winsqlite3.a 191KB
libwinapi_mincore-wldap32.a 191KB
libwinapi_onecore-wldap32.a 191KB
libwinapi_cfgmgr32.a 191KB
libwinapi_wldap32.a 189KB
libwinapi_dbghelp.a 184KB
libwinapi_onecoreuap-propsys.a 183KB
libwinapi_onecoreuap_downlevel-gdi32.a 174KB
libwinapi_onecore_downlevel-gdi32.a 173KB
libwinapi_dhcpsapi.a 169KB
libwinapi_netapi32.a 169KB
libwinapi_winspool.a 164KB
libwinapi_spoolss.a 156KB
libwinapi_onecoreuap-webservices.a 156KB
libwinapi_onecoreuap_downlevel-setupapi.a 154KB
libwinapi_onecore_downlevel-setupapi.a 154KB
libwinapi_webservices.a 153KB
libwinapi_winmm.a 147KB
libwinapi_onecoreuap-ws2_32.a 142KB
libwinapi_mincore-ws2_32.a 142KB
libwinapi_onecore-ws2_32.a 142KB
libwinapi_windowsapp_downlevel-webservices.a 141KB
libwinapi_ws2_32.a 141KB
libwinapi_winsta.a 140KB
libwinapi_windowsapp-webservices.a 139KB
libwinapi_odbc32.a 136KB
libwinapi_onecore_downlevel-shell32.a 133KB
libwinapi_mprapi.a 133KB
libwinapi_mincore_downlevel-api-ms-win-downlevel-shlwapi-l1-1-0.a 127KB
libwinapi_onecoreuap-mfplat.a 125KB
libwinapi_mfplat.a 124KB
libwinapi_mincore_downlevel-api-ms-win-downlevel-advapi32-l1-1-0.a 123KB
libwinapi_mapi32.a 121KB
libwinapi_imagehlp.a 118KB
libwinapi_wsmsvc.a 118KB
libwinapi_ntvdm.a 117KB
libwinapi_ntdsa.a 116KB
libwinapi_rasapi32.a 115KB
libwinapi_windowsapp-crypt32.a 113KB
libwinapi_resutils.a 105KB
libwinapi_ncrypt.a 105KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功