需要:变量MEMFSOBJS指定的文件加上 entry.o entryother initcode kernel.ld fs.img
指定命令文件为kernel.ld,从它里面读取命令,并指定输出文件名为kernelmemfs,连接entry.o及变量MEMFSOBJS里面指定的所有文件,
#并且目标代码输入文件为二进制的initcode entryother fs.img #并将sed处理完毕的kernal的符号表输出至kernelmemfs.sym tags: $(OBJS) entryother.S _init etags *.S *.c
要生成tags ,需要OBJS里面所代表的文件以及entryother.S、_init 可以用etags命令生成emacs专用的tags文件 vectors.S: vectors.pl perl vectors.pl > vectors.S
#想要生成vectors.S,需要vectors.pl
#通过perl命令编译执行vectors.pl并把结果重定向至vectors.S
ULIB = ulib.o usys.o printf.o umalloc.o
#定义变量ULIB,内容为等号后面的文件
_%: %.o $(ULIB) $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^ $(OBJDUMP) -S $@ > $*.asm $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym
要生成_xxxx(任意字符,比如_cat)
把main指定为程序的入口,连接时将初始地址重定向为0#反汇编目标列表,将他们的C源码以及反汇编出来的指令重定向至他们同名的.asm文件中
输出目标列表的目标文件的符号表,从第一行到第一个匹配到SYMBOL TABLE的行的中间的左右行删除;并将任意字符替换为‘’;将只含有‘$’的行都删除 并将sed处理完毕的目标列表的的符号表输出至同名的.sym
_forktest: forktest.o $(ULIB) # forktest has less library code linked in - needs to be small # in order to be able to max out the proc table. $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _forktest forktest.o ulib.o usys.o $(OBJDUMP) -S _forktest > forktest.asm
生成_forktest#要生成_forktest
#反汇编目标列表(forktest),将他们的C源码以及反汇编出来的指令重定向至同名的forktest.asm文件中
mkfs: mkfs.c fs.h gcc -Werror -Wall -o mkfs mkfs.c
#生成mkfs,需要mkfs.c fs.h
#编译mkfs.c,输出所有警告并且警告都当作error,一出警告就停止编译,输出文件为mkfs # Prevent deletion of intermediate files, e.g. cat.o, after first build, so
# that disk image changes after first build are persistent until clean. More # details:
.PRECIOUS: %.o
#这是用一个为目标.PRECIOUS来防止隐含规则把中间文件删除 UPROGS=\\ _cat\\ _echo\\ _forktest\\ _grep\\ _init\\ _kill\\ _ln\\ _ls\\ _mkdir\\ _rm\\ _sh\\ _stressfs\\ _usertests\\ _wc\\ _zombie\\
#定义一个变量UPROGS值为等号后面的内容
fs.img: mkfs README $(UPROGS) ./mkfs fs.img README $(UPROGS)
#make fs.img的时候需要mkfs README,以及变量UPROGS所代表的文件 #执行mkfs,并把fs.img README 变量UPROGS代表的文件作为参数传进去
-include *.d
clean: rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \\ *.o *.d *.asm *.sym vectors.S bootblock entryother \\ initcode initcode.out kernel xv6.img fs.img kernelmemfs mkfs \\ .gdbinit \\ $(UPROGS)
##删除*.tex *.dvi *.idx *.aux *.log *.ind *.ilg *.o *.d *.asm *.sym 文件以及vectors.S bootblock entryother initcode initcode.out kernel xv6.img fs.img kernelmemfs mkfs.gdbinit
# make a printout
FILES = $(shell grep -v '^\\#' runoff.list)
#定义一个变量FILES
#把runoff.list里面的内容不匹配匹配以#(\\为转义字符)开头的内容赋给FILES(-v是反选的意思)
PRINT = runoff.list runoff.spec README toc.hdr toc.ftr $(FILES)
#定义一个变量PRINT
#把FILES里面的内容加上runoff.list runoff.spec README toc.hdr toc.ftr赋给他
xv6.pdf: $(PRINT) ./runoff ls -l xv6.pdf
#生成xv6.pdf需要变量PRINT所代表的文件 #运行runoff
#并把名字为xv6.pdf文件的详细信息列出来
print: xv6.pdf
#make print的时候需要xv6.pdf
# run in emulators
bochs : fs.img xv6.img if [ ! -e .bochsrc ]; then ln -s dot-bochsrc .bochsrc; fi bochs -q
#make bochs的时候,需要fs.img xv6.img #如果文件.bochsrc(boch的配置文件)不存在(-e是看文件、目录是否存在),则给dot-bochsrc创建一个软连接叫bochsrc
#跳过启动菜单(-q),启动 Bochs# try to generate a unique GDB port GDBPORT = $(shell expr `id -u` % 5000 + 25000)
#给变量GDBPORT赋值,值为# QEMU's gdb stub command line changed in 0.11 QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \\ then echo \ else echo \#查看qemu命令的帮助信息, #并看有没有以‘gdb’开头的帮助信息,(由于有-q,如果有匹配的内容则立即返回状态值0。)
#有的话变量QEMUGDB赋值为-gdb tcp::GDBPORT的值 #否则把“-s -p GDBPORT的值”赋给QEMUGDB
#所以QEMUGDB为qemu命令的选项
#-gdb tcp::+$(gdbport):启动gdbserver,用gdb来调试源码级内核,并在tcp的$(gdbport)端口监听
#QEMUGDB为一些qemu命令选项 ifndef CPUS CPUS := 2 Endif
#如果CPUS这个变量为空,那么给他赋值为2
QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA)
-drive
给变量QEMUOPTS赋值,值为等号后面内容
drive:定义一个新的驱动器,选项有镜像文件为fs.img(-file),驱动器连接在一个给定的接口类型列表中可用的连接器使用索引——0(-index),指定磁盘格式为raw(-format) smp:指定cup的个数为变量CPUS的值 -m:内存为512
qemu: fs.img xv6.img $(QEMU) -serial mon:stdio $(QEMUOPTS)
make qemu的时候,需要fs.img xv6.img 建立一个快速的动态译指的虚拟机。
串口号定为mon:stdio(-serial是指定串口号) 并加上QEMUOPTS的选项
qemu-memfs: xv6memfs.img $(QEMU) -drive file=xv6memfs.img,index=0,media=disk,format=raw -smp $(CPUS) -m 256
make qemu-memfs的时候,需要xv6memfs.img 建立一个快速的动态译指的虚拟机。
drive:定义一个新的驱动器,镜像文件为xv6memfs.img、驱动器连接在一个给定的接口类型列表中可用的连接器使用索引——0,指定磁盘格式为raw smp:指定cup的个数为变量CPUS的值 -m:内存为256
qemu-nox: fs.img xv6.img $(QEMU) -nographic $(QEMUOPTS)
#make qemu-nox的时候,需要fs.img xv6.img
#生成一个快速的动态译指的虚拟机,生成的时候,参考QEMUOPTS的选项内容 #-nographic:使用这个选项,使qemu成为简单的命令行应用程序
.gdbinit: .gdbinit.tmpl sed \
#生成.gdbinit,需要.gdbinit.tmpl
qemu-gdb: fs.img xv6.img .gdbinit @echo \ $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB)
make qemu-gdb的时候,需要fs.img xv6.img .gdbinit 把*** Now run 'gdb'.从标准输出输出到标准错误
生成一个快速动态译指的虚拟机,它的串口号为mon:stdio,再加上QEMUOPTS的命令选项 #除此之外,再加上QEMUGDB那些命令选项
qemu-nox-gdb: fs.img xv6.img .gdbinit @echo \ $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB)
make qemu-nox-gdb的时候,需要fs.img xv6.img .gdbinit 把*** Now run 'gdb'.从标准输出输出到标准错误
生成一个快速的动态译指的虚拟机,生成的时候,加上QEMUOPTS、QEMUGDB的指令选项内容,并且使qemu成为简单的命令行应用程序
# CUT HERE make dist的时候就是从这开始删除哟 # prepare dist for students
# after running make dist, probably want to # rename it to rev0 or rev1 or so on and then # check in that version.
EXTRA=\\ mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c\\ ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c\\ printf.c umalloc.c\\ README dot-bochsrc *.pl toc.* runoff runoff1 runoff.list\\ .gdbinit.tmpl gdbutil\\ #给变量EXTRA赋值,值为等号后面的内容 dist: rm -rf dist mkdir dist for i in $(FILES); \\ do \\ grep -v PAGEBREAK $$i >dist/$$i; \\ done sed '/CUT HERE/,$$d' Makefile >dist/Makefile