268 行的 Makefile,做了什么?
终端 — make build
$
$
Makefile · 268 行
六个区块各做什么?
执行了哪些命令、产出哪三样?
全景
→
精读
→
走一遍
全景:三栏六区块
赋值
规则
变量区
区块一 · 二
区块一
区块二
规则区
区块三 · 四
区块三
区块四
目标区
区块五 · 六
区块五
区块六
make
build
make
fs
make
run
精读变量区:开关 · 清单 · 工具 · 选项
Makefile · 区块一 二
换平台 → 只改一行
1–7
1
#platform := k210
2
platform := qemu
3
mode := debug
4
#mode := release
5
K=kernel
6
U=xv6-user
7
T=target
9
OBJS =
9–58 · 共 27 项(折叠)
58
… virtio_disk.o
60
QEMU = qemu-system-riscv64
61–67(折叠)
68
TOOLPREFIX := riscv64-unknown-elf-
69–75(折叠)
76
CFLAGS = -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
238
fs: $(UPROGS)
① dd
造 256MB 空文件
→
② mkfs.vfat -F 32
格式化
→
③ mount · cp
挂载 · 拷入
→
④ umount
卸载
⇒
fs.img
256MB · FAT32
fs.img
make build 产物
不归 make build 管 → 单独敲 make fs
区块六 · :143 run + :260–268 clean
143
run: 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 行为没变?
?