操作系统的状态机模型

70 阅读1分钟

“操作系统” 的状态机已经启动

Firmware 和 boot loader 共同完成 “操作系统的加载”

  • 初始化全局变量和栈;分配堆区 (heap)
  • 为 main 函数传递参数
    • 谁给操作系统传递了参数?
    • 如何实现参数传递?

进入 C 代码之后

  • 完全遵循 C 语言的形式语义
  • 但有一些行为 “补充” —— AbstractMachine API

操作系统:是个 C 程序

一个迷你 “操作系统” thread-os.c

  • make 会得到一个 “磁盘镜像”,好像魔法一样
    • 就跟你们第一次用 IDE 的时候按一个键就可以编译运行一样

int main() {
cte_init(on_interrupt);

for (int i = 0; i < LENGTH(tasks); i++) { 
Task *task = &tasks[i]; 
Area stack = (Area) { &task->context + 1, task + 1 };
task->context = kcontext(stack, task->entry, (void *)task->name);
task->next = &tasks[(i + 1) % LENGTH(tasks)];
} 
mpe_init(mp_entry); }

AbstractMachine 对 “C 程序语义” 做出的扩充

TRM + MPE

  • 完全等同于多线程 (处理器相当于线程) - L1/native
  • IOE API: 完全是普通的库函数
    • 同一设备的数据竞争 = undefined behavior

CTE

  • 允许创建多个执行流 (类比协程) - M2
  • yield 主动切换;会被中断被动打断
  • on_interrupt 会拦截到中断事件

VME

  • 允许创建一个 “经过地址翻译的执行模式”
  • 通过 CTE API 管理

RTFSC 时间

(0) 生成镜像和启动虚拟机

如果使用 “土办法”,你很可能被淹没在 Makefile 中读懂 Makefile 需要 STFW, RTFM,大量的精力虽然花点时间读是值得的,但很可能读了很久都没读到重要的地方


花一点时间想 “应该怎么做”

  • 花几分钟创建一个小工具:“AbstractMachine 构建理解工具”
    • UNIX Philosophy: keep it simple, stupid
    • everything is a file; write things to work together using text interface
  • Get out of your comfort zone