手写操作系统 - 23.图解内核任务切换【手动栈】
·

图解手动任务切换
这张图片展示了一个基于堆栈操作的任务切换过程,主要使用了汇编语言实现。以下是任务切换的完成步骤的描述:
1. 初始化上下文
任务切换的目标是保存当前任务的上下文(寄存器、堆栈等),并恢复目标任务的上下文。
- 任务的堆栈中保存了所有的寄存器值(如
EAX、EBX、ESP等)和返回地址。 - 每个任务都有自己的堆栈,
from->stack和to->stack分别表示当前任务和目标任务的堆栈指针。
2. 保存当前任务的寄存器状态
在 simple_switch 函数中:
- 使用
push指令依次将EBP、EBX、ESI、EDI等寄存器的值压入当前任务的堆栈。 - 保存完成后,堆栈的状态包含所有的寄存器值和返回地址。
3. 更新堆栈指针
将当前任务的堆栈指针 ESP 存储到 from->stack,从而保存当前任务的上下文。
4. 加载目标任务的堆栈指针
从 to->stack 中读取目标任务的堆栈指针,并将其加载到 ESP,这一步切换了堆栈指向。
5. 恢复目标任务的寄存器状态
- 使用
pop指令依次弹出目标任务堆栈中的寄存器值,恢复EDI、ESI、EBX、EBP。 - 通过恢复寄存器状态,目标任务的上下文被完全加载。
6. 跳转到目标任务的执行地址
- 使用
ret指令从堆栈中弹出返回地址,跳转到目标任务的执行位置。 - 这时任务切换完成,CPU 开始执行目标任务。
任务切换的关键点
- 堆栈指针切换 是整个任务切换的核心,通过更新
ESP实现上下文的保存与恢复。 - 所有寄存器状态都存储在堆栈中,确保切换时任务上下文一致。
- 切换后的执行位置由堆栈中的返回地址决定。
通过这种方式,简单地实现了任务之间的上下文切换,这种方法常用于嵌入式系统或简单的实时操作系统中。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)