xv6 makefile详解
文章目录
makefile语法格式
makefile就是一个深搜的过程,最上面的语句是顶级目标,顶级目标还有依赖
如果依赖不存在,下面我们还要写,
所以就是上面没有的,要在下面实现,再下面都实现了,上面的顶级目标才能实现
生成qemu可执行文件
make qemu
qemu
依赖于kernel
和fs.img
,把内核加载进去,文件系统挂载进去,之后一个操作系统就可以跑起来了
模拟risc-v指令集的CPU,比较关键的就是-kernel $K/kernel和-driver file=fs.img
1 |
|
生成kernel可执行文件
1 |
|
生成kernel下的OBJS
kernel下的许多程序函数,都需要在 kernel/main.c
函数中使用
(1)编译目标定义
1 |
|
%.o就是一个通配符,所有的.o都依赖于.c文件,这些都是kernel下的程序
1 |
|
.S汇编都是下面这样生成的
riscv64-linux-gnu-gcc -c -o kernel/entry.o kernel/entry.S
.c就是下面这样编译的,规则是不一样的
riscv64-linux-gnu-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -DSOL_PGTBL -DLAB_PGTBL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o kernel/kalloc.o kernel/kalloc.c
到这里整个 kernel
的 OBJS
都被build
kernel.ld
这是kernel目录底下的链接脚本,指导着我们把kernel的依赖文件链接成一个目标文件
链接器 ld
将按照脚本内的指令将 .o
文件生成可执行文件
主要描述的就是处理链接脚本的方式,以及生成可执行文件的内容布局
1 |
|
build OBJS_KCSAN
这些程序都是处理和硬件中断相关的程序
1 |
|
1 |
|
build initcode
用户空间初始化程序
在 kernel/main.c
中使用到了这个程序,执行第一个用户程序 "init"
程序,这一段可加可不加,kernel编译中只加了这一部分
1 |
|
1 |
|
生成一个fs.img文件系统
这个就是生成一个文件系统,相当于一个硬盘的镜像(用来存放用户程序的)
这里的mkfs/mkfs程序,就是将后面的 ( U P R O G S ) , (UPROGS), (UPROGS),(UEXTRA)用户编译好的程序,写入
fs.img
这个文件系统中
1 |
|
mkfs/mkfs fs.img README user/_cat user/_echo user/_forktest user/_grep user/_init user/_kill user/_ln user/_ls user/_mkdir user/_rm user/_sh user/_stressfs user/_usertests user/_grind user/_wc user/_zombie user/_pgtbltest
mkfs
1 |
|
mkfs/mkfs
就是往文件系统中写文件的程序
gcc -DSOL_PGTBL -DLAB_PGTBL -Werror -Wall -I. -o mkfs/mkfs mkfs/mkfs.c
用户程序的编译
1 |
|
ulib
中包含的就是一些string和内存操作的一些库函数printf
包含了和标准输出相关的一些函数umalloc
包含了malloc相关的动态开辟之类的函数usys
里面包含的就是系统调用相关的入口函数
这些将来就可以被OS调用,从文件系统中加载到内存中进行执行
用户态生成这些应用文件
硬盘构建完了上面这些在mkfs中使用到的编译完之后,就能构建fs.img
配置工具
指定工具的版本,如果找不到合适的版本就输出错误信息
1 |
|
配置编译器
,汇编器
,链接器
,copy工具
,dump工具
(反汇编)
1 |
|