




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OBJS = bio.oconsole.oexec.ofile.ofs.oide.oioapic.okalloc.okbd.olapic.olog.omain.omp.opicirq.opipe.oproc.osleeplock.ospinlock.ostring.oswtch.osyscall.osysfile.osysproc.otimer.otrapasm.otrap.ouart.ovectors.ovm.o定义了一个变量OBJS,内容为等号后面的内容,为换行符,方便阅读# Cross-compiling (e.g., on Mac OS X)# TOOLPREFIX = i386-jo
2、s-elf# Using native tools (e.g., on X86 Linux)#TOOLPREFIX = # Try to infer the correct TOOLPREFIX if not set如果变量TOOLPERFIX为空 那么为TOOLPREFIX赋个值 objdump命令是:查看目标文件/可执行文件的构成的gcc工具/反汇编如果都不是,则将echo错误信息信息“* Error: Couldnt find an i386-*-elf version of GCC/binutils.”本来是从标准输出-赋给变量,重定向到了标准错误里ifndef TOOLPREFIXT
3、OOLPREFIX := $(shell if i386-jos-elf-objdump -i 2&1 | grep elf32-i386$ /dev/null 2&1; then echo i386-jos-elf-; elif objdump -i 2&1 | grep elf32-i386 /dev/null 2&1; then echo ; else echo * 1&2; echo * Error: Couldnt find an i386-*-elf version of GCC/binutils. 1&2; echo * Is the directory with i386-jo
4、s-elf-gcc in your PATH? 1&2; echo * If your i386-*-elf toolchain is installed with a command 1&2; echo * prefix other than i386-jos-elf-, set your TOOLPREFIX 1&2; echo * environment variable to that prefix and run make again. 1&2; echo * To turn off this error, run gmake TOOLPREFIX= . 1&2; echo * 1&
5、2; exit 1; fi)endif如果变量QEMU为空,那么给QEMU赋值前面加个shell意为要执行shell脚本了如果能够在当前路径找到可执行文件qemu,那么首先不输出(因为/dev/null了),并把该路径赋给变量QEMU,退出。如果在当前路径下能够找到可执行文件qemu-system-i386,那么不输出(因为/dev/null了),把该路径赋给变量QEMU,退出。如果qemu和qemu-system-i386的路径都为空,那么把qemu的值设为/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i
6、386-softmmu检测qemu文件是否存在且可执行权限如果存在,则将变量QEMU设为/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu,并且退出。如果上面没有退出即上面的if没进去,那么执行下面,$(echo错误信息) ,并且由于是1&2,本来是从标准输出-赋给变量,重定向到了标准错误里# If the makefile cant find QEMU, specify its path here# QEMU = qemu-system-i386# Try to infer the c
7、orrect QEMUifndef QEMUQEMU = $(shell if which qemu /dev/null; then echo qemu; exit; elif which qemu-system-i386 /dev/null; then echo qemu-system-i386; exit; else qemu=/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu; if test -x $qemu; then echo $qemu; exit; fi; fi; ech
8、o * 1&2; echo * Error: Couldnt find a working QEMU executable. 1&2; echo * Is the directory containing the qemu binary in your PATH 1&2; echo * or have you tried setting the QEMU variable in Makefile? 1&2; echo * 1&2; exit 1)endifCC = $(TOOLPREFIX)gcc定义变量CC,值为 TOOLPREFIX的值 gcc(从下文可知,gcc在CFALGS中只承担了-
9、E预编译的的任务,即完成了第一步预编译)AS = $(TOOLPREFIX)gas定义变量AS,值为 TOOLPREFIX的值 gas(gas为汇编器,实现了汇编这一步骤)LD = $(TOOLPREFIX)ld定义变量LD,值为 TOOLPREFIX的值 ld(ld命令是把一定量的目标文件(.o文件)和档案文件,并重定位她们的数据,链接符号的引用,最后生成一个可执行文件即程序中预处理、编译、汇编、链接中的链接。)OBJCOPY = $(TOOLPREFIX)objcopy定义变量OBJCOPY,值为 TOOLPREFIX的值 objcopy(objcopy命令是:将不同类型的文件之间进行拷贝
10、)OBJDUMP = $(TOOLPREFIX)objdump定义变量OBJCOPY,值为 TOOLPREFIX的值 objdump(objdump命令是:查看目标文件/可执行文件的构成的gcc工具/反汇编)所以综上所述,我们其实可以看出来,TOOLPREFIX其实就是一个前缀,为了让本脚本能在交叉编译环境不出错,起主要作用的还是后面的东西。CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer定义变量CFLAGS 值
11、为“-fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer”#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -MD -gdwarf-2 -m32 -Werror -fno-omit-frame-pointerCFLAGS += $(shell $(CC)
12、-fno-stack-protector -E -x c /dev/null /dev/null 2&1 & echo -fno-stack-protector)追加变量,追加的值为shell脚本“$(CC) -fno-stack-protector -E -x c /dev/null /dev/null 2&1 & echo -fno-stack-protector”执行的输出值CC为调用gcc编译器,各个编译选项为:对于 &运算符,即只有左边的被执行成功了右边才会执行 echo-fno-stack-protector 即将-fno-stack-protector追加到变量CFLAGS里面(
13、因为该$()的意思就是把shell脚本的输出结果赋给变量)ASFLAGS = -m32 -gdwarf-2 -Wa,-divide定义变量ASFLAGS,# FreeBSD ld wants elf_i386_fbsdLDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2/dev/null | head -n 1)变量LDFLAGS追加-m 选项和后面shell脚本的输出值#shell脚本里面:ld -v:显示ld的版本号,同时列出支持的模拟器,通过管道作为后面的grep匹配的输入看一下他支持的模拟有没有匹配elf_i386的,并且若有错误,抛出到黑洞
14、不输出得到的匹配的模拟器中的第一个追加到LDFLAGS后面xv6.img: bootblock kernel fs.imgdd if=/dev/zero of=xv6.img count=10000dd if=bootblock of=xv6.img conv=notruncdd if=kernel of=xv6.img seek=1 conv=notrunc想要生成xv6.img需要的东西有:bootblock(主板上的引导快bios上烧的一段程序),linux的“kernal”文件,及fs.img/dev/zero是一个无穷的null二进制流,用来初始化文件的执行的命令有:dd命令:用指定
15、大小的块拷贝一个文件,并在拷贝的同时进行指定的转换xv6memfs.img: bootblock kernelmemfsdd if=/dev/zero of=xv6memfs.img count=10000dd if=bootblock of=xv6memfs.img conv=notruncdd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc想要生成xv6memfs.img需要的东西有:bootblock(主板上的引导快) kernelmemfsbootblock: bootasm.S bootmain.c$(CC) $(CFLAGS)
16、-fno-pic -O -nostdinc -I. -c bootmain.c$(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o$(OBJDUMP) -S bootblock.o bootblock.asm$(OBJCOPY) -S -O binary -j .text bootblock.o bootblock./sign.pl bootblock生成bootblock需要的东西有boo
17、tasm.S bootmain.c除了以上编译选项外,还有CFLAGS指定的编译选项除了以上链接ld选项外,还有LDFLAGS指定的编译选项链接bootasm.o bootmain.o,并指定输出文件为bootblock.o输出bootblock.o的C源代码和反汇编出来的指令对照,并重定向输出到bootblock.asmobjcopy:将输入文件bootblock.o拷贝至bootblock执行文件sign.pl 并将bootblock作为参数传进去entryother: entryother.S$(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c entryo
18、ther.S$(LD) $(LDFLAGS) -N -e start -Ttext 0x7000 -o bootblockother.o entryother.o$(OBJCOPY) -S -O binary -j .text bootblockother.o entryother$(OBJDUMP) -S bootblockother.o entryother.asm生成entryother需要的东西有entryother.S汇编entryother.S,生成entryother.o将链接的初始地址重定向到0x700,并连接bootblockother.o entryother.o将输入文件
19、bootblockother.o 只抽取指定部分拷贝到entryother输出bootblockother.o的C源代码和反汇编出来的指令对照,并重定向输出到entryother.asminitcode: initcode.S$(CC) $(CFLAGS) -nostdinc -I. -c initcode.S$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o initcode.out initcode.o$(OBJCOPY) -S -O binary initcode.out initcode$(OBJDUMP) -S initcode.o initcode.a
20、sm#生成initcode#需要initcode.S#1.汇编,但不连接initcode.S,生成initcode.o#2.将链接的初始地址重定向到0,并连接initcode.out initcode.o#3.将输入文件initcode.out,只抽取指定部分拷贝到initcode#4.输出initcode.o的C源代码和反汇编出来的指令对照,并重定向输出到initcode.asmkernel: $(OBJS) entry.o entryother initcode kernel.ld$(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS)
21、 -b binary initcode entryother$(OBJDUMP) -S kernel kernel.asm$(OBJDUMP) -t kernel | sed 1,/SYMBOL TABLE/d; s/ .* / /; /$/d kernel.sym生成kernel需要OBJS里面所有的东西以及entry.o entryother initcode kernel.ld指定命令文件为kernel.ld,从它里面读取命令,并且指定输出文件名为kernel,连接entry.o以及OBJS里面所有的文件,并且目标代码输入文件为二进制的initcode entryother#并将sed处
22、理完毕的kernal的符号表输出至kernel.sym# kernelmemfs is a copy of kernel that maintains the# disk image in memory instead of writing to a disk.# This is not so useful for testing persistent storage or# exploring disk buffering implementations, but it is# great for testing the kernel on real hardware without# ne
23、eding a scratch disk.MEMFSOBJS = $(filter-out ide.o,$(OBJS) memide.o#给变量MEMFSOBJS赋值#调用反过滤函数即将OBJS中的ide.o去除kernelmemfs: $(MEMFSOBJS) entry.o entryother initcode kernel.ld fs.img$(LD) $(LDFLAGS) -T kernel.ld -o kernelmemfs entry.o $(MEMFSOBJS) -b binary initcode entryother fs.img$(OBJDUMP) -S kernelme
24、mfs kernelmemfs.asm$(OBJDUMP) -t kernelmemfs | sed 1,/SYMBOL TABLE/d; s/ .* / /; /$/d kernelmemfs.sym#要生成kernelmemfs(kernal的拷贝文件)需要:变量MEMFSOBJS指定的文件加上 entry.o entryother initcode kernel.ld fs.img指定命令文件为kernel.ld,从它里面读取命令,并指定输出文件名为kernelmemfs,连接entry.o及变量MEMFSOBJS里面指定的所有文件,#并且目标代码输入文件为二进制的initcode en
25、tryother fs.img#并将sed处理完毕的kernal的符号表输出至kernelmemfs.symtags: $(OBJS) entryother.S _initetags *.S *.c要生成tags ,需要OBJS里面所代表的文件以及entryother.S、_init可以用etags命令生成emacs专用的tags文件vectors.S: vectors.plperl vectors.pl vectors.S#想要生成vectors.S,需要vectors.pl#通过perl命令编译执行vectors.pl并把结果重定向至vectors.SULIB = ulib.o usys.
26、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文件中输出目标列表的目标文件的符号表,从第一行到第一个匹配到S
27、YMBOL 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
28、_forktest forktest.asm生成_forktest#要生成_forktest#反汇编目标列表(forktest),将他们的C源码以及反汇编出来的指令重定向至同名的forktest.asm文件中mkfs: mkfs.c fs.hgcc -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# t
29、hat 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)#ma
30、ke fs.img的时候需要mkfs README,以及变量UPROGS所代表的文件#执行mkfs,并把fs.img README 变量UPROGS代表的文件作为参数传进去-include *.dclean: 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 *.
31、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 printoutFILES = $(shell grep -v # runoff.list)#定义一个变量FILES#把runoff.list里面的内容不匹配匹配以#(为转义字符)开头的内容赋给FILES(-v是反选的意思)PRINT = runoff.list runoff.s
32、pec README toc.hdr toc.ftr $(FILES)#定义一个变量PRINT#把FILES里面的内容加上runoff.list runoff.spec README toc.hdr toc.ftr赋给他xv6.pdf: $(PRINT)./runoffls -l xv6.pdf#生成xv6.pdf需要变量PRINT所代表的文件#运行runoff#并把名字为xv6.pdf文件的详细信息列出来print: xv6.pdf#make print的时候需要xv6.pdf# run in emulatorsbochs : fs.img xv6.imgif ! -e .bochsrc ;
33、 then ln -s dot-bochsrc .bochsrc; fibochs -q#make bochs的时候,需要fs.img xv6.img#如果文件.bochsrc(boch的配置文件)不存在(-e是看文件、目录是否存在),则给dot-bochsrc创建一个软连接叫bochsrc#跳过启动菜单(-q),启动 Bochs# try to generate a unique GDB portGDBPORT = $(shell expr id -u % 5000 + 25000)#给变量GDBPORT赋值,值为# QEMUs gdb stub command line changed i
34、n 0.11QEMUGDB = $(shell if $(QEMU) -help | grep -q -gdb; then echo -gdb tcp:$(GDBPORT); else echo -s -p $(GDBPORT); fi)#查看qemu命令的帮助信息,#并看有没有以gdb开头的帮助信息,(由于有-q,如果有匹配的内容则立即返回状态值0。)#有的话变量QEMUGDB赋值为-gdb tcp:GDBPORT的值#否则把“-s -p GDBPORT的值”赋给QEMUGDB#所以QEMUGDB为qemu命令的选项#-gdb tcp:+$(gdbport):启动gdbserver,用gdb
35、来调试源码级内核,并在tcp的$(gdbport)端口监听#QEMUGDB为一些qemu命令选项ifndef CPUSCPUS := 2Endif#如果CPUS这个变量为空,那么给他赋值为2QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA)给变量QEMUOPTS赋值,值为等号后面内容drive:定义一个新的驱动器,选项有镜像文件为fs.img(-file),驱动器
36、连接在一个给定的接口类型列表中可用的连接器使用索引0(-index),指定磁盘格式为raw(-format)smp:指定cup的个数为变量CPUS的值-m:内存为512qemu: 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=
37、disk,format=raw -smp $(CPUS) -m 256make qemu-memfs的时候,需要xv6memfs.img建立一个快速的动态译指的虚拟机。drive:定义一个新的驱动器,镜像文件为xv6memfs.img、驱动器连接在一个给定的接口类型列表中可用的连接器使用索引0,指定磁盘格式为rawsmp:指定cup的个数为变量CPUS的值-m:内存为256qemu-nox: fs.img xv6.img$(QEMU) -nographic $(QEMUOPTS)#make qemu-nox的时候,需要fs.img xv6.img#生成一个快速的动态译指的虚拟机,生成的时候,参
38、考QEMUOPTS的选项内容#-nographic:使用这个选项,使qemu成为简单的命令行应用程序.gdbinit: .gdbinit.tmplsed s/localhost:1234/localhost:$(GDBPORT)/ $#生成.gdbinit,需要.gdbinit.tmplqemu-gdb: fs.img xv6.img .gdbinitecho * Now run gdb. 1&2$(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB)make qemu-gdb的时候,需要fs.img xv6.img .gdbinit把* Now
39、run gdb.从标准输出输出到标准错误生成一个快速动态译指的虚拟机,它的串口号为mon:stdio,再加上QEMUOPTS的命令选项#除此之外,再加上QEMUGDB那些命令选项qemu-nox-gdb: fs.img xv6.img .gdbinitecho * Now run gdb. 1&2$(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB)make qemu-nox-gdb的时候,需要fs.img xv6.img .gdbinit把* Now run gdb.从标准输出输出到标准错误生成一个快速的动态译指的虚拟机,生成的时候,加上QEMUOPTS、Q
40、EMUGDB的指令选项内容,并且使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.cln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.cprintf.c umalloc.cREADME dot-bochsrc *.pl toc.* runoff runoff1 runoff.list.gdbinit.tmpl gdbutil#给变量EXTRA赋值,值为等号后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖南常德市安乡县教育局选调52人模拟试卷附答案详解(完整版)
- 2025湖南长沙人才集团有限公司外包人员及见习生招聘模拟试卷及答案详解(有一套)
- 2025安徽六安市人民医院派遣制工作人员招聘10人模拟试卷及1套完整答案详解
- 2025年威海荣成市卫生健康局所属事业单位公开招聘工作人员(57人)考前自测高频考点模拟试题及答案详解(名师系列)
- 2025呼伦贝尔额尔古纳市蒙源旅游文化有限公司招聘136人考前自测高频考点模拟试题及1套完整答案详解
- 2025年中国活性黄84行业市场分析及投资价值评估前景预测报告
- 2025贵州省卫生健康委员会“银龄计划”(引进退休高级医疗卫生人才)考前自测高频考点模拟试题及答案详解参考
- 2025湖北汉口学院保安招聘模拟试卷及完整答案详解一套
- 2025年宜昌市点军区公开招聘6名社区专职工作人员(网格员)模拟试卷(含答案详解)
- 2025年福建省龙岩市上杭县客家木偶艺术传习中心招聘1人考前自测高频考点模拟试题附答案详解(黄金题型)
- 2025年春新北师大版数学七年级下册课件 第四章 三角形 问题解决策略:特殊化
- 2024年1月版安全环境职业健康法律法规标准文件清单
- 校外培训机构传染病防控健康教育制度
- 大学语文知到智慧树章节测试课后答案2024年秋南昌大学
- 凉菜岗位职责
- 药学本科毕业论文范文
- 【MOOC】声乐作品赏析与演唱-扬州大学 中国大学慕课MOOC答案
- 锅炉节能器施工方案
- 2024版中国宪法课件
- 【MOOC】机械之美-神奇的矿冶机械(双语)-江西理工大学 中国大学慕课MOOC答案
- T-IAC CAMRA 47.3- 2022汽车覆盖件低碳维修技术规范 第3部分:车辆玻璃
评论
0/150
提交评论