268 行的 Makefile,做了什么?
终端 — make build
$
$
Makefile · 268 行
六个区块各做什么?
执行了哪些命令、产出哪三样?
全景→ 精读→ 走一遍
全景:三栏六区块
赋值 规则
变量区区块一 · 二
区块一
区块二
规则区区块三 · 四
区块三
区块四
目标区区块五 · 六
区块五
区块六
makebuild
makefs
makerun
精读变量区:开关 · 清单 · 工具 · 选项
Makefile · 区块一 二
换平台 → 只改一行 1–7
1#platform := k210
2platform := qemu
3mode := debug
4#mode := release
5K=kernel
6U=xv6-user
7T=target
9OBJS =
9–58 · 共 27 项(折叠)
58… virtio_disk.o
60QEMU = qemu-system-riscv64
61–67(折叠)
68TOOLPREFIX := riscv64-unknown-elf-
69–75(折叠)
76CFLAGS = -Wall -Werror …
77–99(折叠)
OBJS · 27 个 .o(qemu)
TOOLPREFIX := riscv64-unknown-elf-
+ gcc → riscv64-unknown-elf-gcc
+ ld → riscv64-unknown-elf-ld
+ objdump → riscv64-unknown-elf-objdump
x86 上运行⇄产出 RISC-V 指令
CFLAGS = -Wall -Werror … -Werror
warning: … → make: *** Error 1
CFLAGS → 管编译 LDFLAGS → 管链接
精读规则区:make build 走到底
Makefile :102(区块三 · 内核链接规则)
102$T/kernel: $(OBJS) $(linker) $U/initcode
⇥ 命令…
目标 依赖 命令
比的是文件修改时间(mtime)
kernel.o修改 10:05
>
kernel修改 10:00
依赖新 → 执行 不新 → 跳过
build
$T/kernel
userprogs
OBJS:27 个 .o
UPROGS:17 个程序
倒查:先得有二十七个 .o
.c ━━▷ .o内置规则
用区块二登记的编译器和选项
104$(LD) $(LDFLAGS) -T $(linker) -o $T/kernel $(OBJS)
105$(OBJDUMP) -S $T/kernel > $T/kernel.asm
106$(OBJDUMP) -t $T/kernel | sed … > $T/kernel.sym
target/kernel内核镜像 · ELF
kernel.asm源码 ↔ 汇编 对照
kernel.sym名字 ↔ 地址 表
kernel.asm · 逐行对照
源码行
…
…
…
汇编行
…
…
…
kernel.sym · 对照表
名字
start
main
…
地址
…
…
…
:183 通配规则×17
_%%: %.o $(ULIB)
① 内核 kernel
② 调试两件套 kernel.asm+kernel.sym
③ 一批用户程序 ×17
三样
目标区与收束:fs · run · 总结 · 练习
区块五 · :206–249(UPROGS 清单 + fs 目标)
×17
238fs: $(UPROGS)
① dd造 256MB 空文件
→
② mkfs.vfat -F 32格式化
→
③ mount · cp挂载 · 拷入
→
④ umount卸载
⇒
fs.img256MB · FAT32
fs.img make build 产物 不归 make build 管 → 单独敲 make fs
区块六 · :143 run + :260–268 clean
143run: build
━━▷ build
qemu-system-riscv64
…
fs.img虚拟磁盘
QEMUOPTS += -drive file=fs.img,if=none,…
clean · :260–268
target/* *.asm *.sym 用户程序 ×17 fs.img留下
make build→ make fs→ make run
变量区登记页(工具与原料)
① 开关② 零件清单
规则区工序卡
③ 内核链接④ 用户程序
目标区出货方式
⑤ 文件系统镜像⑥ 运行清理
make=车间领班:原料比半成品新 → 重做那道工序
内核 调试两件套 用户程序
练习(答案不揭晓——想通它)
cat.c 改动→ make build→ make run⇒ cat 行为没变? ?