“操作系统” 的状态机已经启动
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