程序 = 状态机
状态机 = 可执行文件
理解静态链接的可执行文件
#!/bin/bash -x
echo Hello
#!/usr/bin/env python3
print('Hello')
#!./a.out
/usr/bin/env
?#!
需要绝对路径 (背后是 execve)execve(path, argv, envp)
RTFM
理论上把可执行文件 (ELF) 指定的数据搬运到内存,就可以实现二进制文件的加载。
试一试?
execve 本质上是 “多余” 的
“微内核” (Microkernel)
“外核” (Exokernel)
相比知识点本身,
获得知识的方法 和对系统的掌控力 更重要。
状态机视角
机器永远是对的
听课以为自己懂了,不自己调试是不行的。
肉眼 “看懂” 代码和自己写出代码之间有巨大的鸿沟
回顾上次代码课的调试 (和阅读的源代码)
memlayout.h
0x4
,否则 gdb 会 crashTRAMPOLINE
#define TRAMPOLINE (MAXVA - PGSIZE)
0x3ffffff000
神奇的 “trampoline” (跳板)
xv6 trap trampoline
swap(a0, sscratch)
来到 sys_exec
p->trapframe
中的寄存器本次课内容与目标
Take-away messages