为硬件直接编程
操作系统:就一个 C 程序
心路历程
大学的真正意义
为了让下列程序能够 “运行起来”:
int main() {
printf("Hello, World\n");
}
我们需要准备什么?
好消息:我们提供了运行 C 程序的框架代码和库
坏消息:框架代码也太复杂了吧
花一点时间想 “有更好的办法吗?”
AI 已经正确 “消化” 了 Makefile 的主干 (说明我们写得 “好读”)
观察 AbstractMachine 程序编译过程的正确方法:
make -nB \
| grep -ve '^\(\#\|echo\|mkdir\|make\)' \
| sed "s#$AM_HOME#\$AM_HOME#g" \
| sed "s#$PWD#.#g" \
| vim -
make -nB
(RTFM)想要看得更清楚一些?
:%s/ /\r /g
编译/链接
-std=gnu11
, -m64
, -mno-sse
, -I
, -D
, ...-melf_x86_64
, -N
, -Ttext-segment=0x00100000
am-x86_64-qemu.a
, klib-x86_64-qemu.a
)假设 MBR 后紧跟 ELF Binary (真正的的加载器有更多 stages)
代码讲解:
am/src/x86/qemu/boot/start.S
和 main.c
if (elf32->e_machine == EM_X86_64) {
((void(*)())(uint32_t)elf64->e_entry)();
} else {
((void(*)())(uint32_t)elf32->e_entry)();
}
就是一个 C 程序
支持固定的 “线程”
while (1) printf("a");
while (1) printf("b");