日期:2014-05-16 浏览次数:20825 次
# Top Makefile # # if you want the ram-disk device, define this to be the # size in blocks. # #虚拟内存盘ramdisk = (空) RAMDISK = #-DRAMDISK=512 # #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 AS86 =as86 -0 -a LD86 =ld86 -0 # #GNU assembler linker AS =gas LD =gld # LDFLAGS =-s -x -M #连接器gld运行时用到的选项-s -x -M #-s 输出文件中省略所有的符号信息 #-x 删除所有的局部符号 #-M 在标准的输出设备上打印链接映像(link map) #连接映象:由连接程序产生的一种内存地址映象 其中列出了程序装入到内存中的位置信息 具体有如下信息: #目标文件及符号信息映射到内存中的位置 #公共符号如何放置 #连接中包含的所有文件成员及其引用的符号 # CC =gcc $(RAMDISK) #RAMDISK = #CC = gcc #编译工具为gcc # CFLAGS =-Wall -O -fstrength-reduce -fomit-frame-pointer \ -fcombine-regs -mstring-insns #-Wall :打印所有的警告信息 #-O :使用该选项 编译器会试着减少目标代码的大小和执行时间。-formit-frame-pointer也会打开(对于无帧指针frame pointer)又支持调试的机器 #-fstrength-reduce :优化循环语句 #-fcombine-regs : #-mstring-insns :不知道这两个干嘛的 新版本的gcc不太支持 不不不 是不支持 # CPP =cpp -nostdinc -Iinclude #cpp什么鸟东西? #-nostdinc -Iinclude 不要搜索标准的头文件目录中的文件 而是使用-I选项指定的目录或者是在当前的目录里搜索头文件 # # # ROOT_DEV specifies the default root-device when making the image. # This can be either FLOPPY, /dev/xxxx or empty, in which case the # default of /dev/hd6 is used by 'build'. # in which case :在某种情况下 # specifies :指定 # FLOPPY :软的软盘 ROOT_DEV=/dev/hd6 #ROOT_DEV 指定在创建内核映象文件时所使用的默认根文件系统所在的设备 ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o #kernel mm fs等目录所产生的目标代码文件。为了方便引用 在这里将它们用ARCHIVES(归档文件) 标识符表示 DRIVERS =kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a #块和字符设备库文件 MATH =kernel/math/math.a #数学运算库文件 LIBS =lib/lib.a #由lib/目录中生成的通用库文件 #.a表示该文档是个归档文档 也即包含有许多可执行二进制代码子程序集合的库文件 通常是用GNU的ar程序生成。 #ar是GNU的二进制文件处理程序 用于创建 修改以及从归档文件中抽取文件 # # # ## make老式的隐式后缀规则 # 指示make利用下面的命令将所有的.c文件编译生成.s汇编程序 # 指使gcc采用前面CFLAGS所指定的选项以及仅使用include/目录中的头文件 # 在适当的编译后不进行汇编就停止(-S) 从而产生与输入的各个C文件对应的汇编语言形式的代码文件。 (晓得这里有个疑问-S是Stop的意思?纳尼?) # 默认情况下所产生的汇编程序文件是原C文件名去掉.c而加上.s后缀。 # -o表示其后是输出文件的形式。 # 其中$*.s(或$@)是自动目标变量,$<代表第一个先决条件,这里即是符合条件*.c的文件。 # ':'表示下面是该规则的命令 .c.s: $(CC) $(CFLAGS) \ -nostdinc -Iinclude -S -o $*.s $< # 将所有.s汇编程序文件编译成.o目标文件。下一条是实现该操作的具体命令 # 使用gas编译器将汇编程序编译成.o目标文件。-c表示只编译或汇编,但不进行连接操作 .s.o: $(AS) -c -o $*.o $< # 使用gcc将c语言编译成目标文件但不连接 .c.o: $(CC) $(CFLAGS) \ -nostdinc -Iinclude -c -o $*.o $< # # all表示创建Makefile所知的最顶层目标。这里即是image文件 all: Image # 第一行说明:目标文件(Image文件)是由分号后面的4个元素产生 # 下面两行是执行的命令 # 第一行表示使用tools目录下的build工具程序将bootsect,setup,system文件以$(ROOT_DEV)为根文件系统设备组装成内核映象文件Image # 第二行的sysn同步命令是迫使缓冲块数据立即写盘并更新超级块 # Image: boot/bootsect boot/setup tools/system tools/build tools/build boot/bootsect boot/setup tools/system $(ROOT_DEV) > Image sync # # 表明disk这个目标要由Image产生 # dd为UNIX标准命令:复制一个文件,根据选项进行转换和格式化 # bs=表示一次读/写的字节数,if=表示输入的文件.of=表示输出到的文件 # /dev/PS0指第一个软盘驱动器(设备文件) #这个可以改成/dev/fd0 编译完之后执行make disk直接把image文件插入到fd0里边,重新执行之后就会显示编译完的内容 # #为什么这里的/dev/PS0不行 尚不清楚 disk: Image dd bs=8192 if=Image of=/dev/PS0 tools/build: tools/build.c $(CC) $(CFLAGS) \ -o tools/build tools/build.c # boot/head.o: boot/head.s # tools/system: boot/head.o init/main.o \ $(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS) $(LD) $(LDFLAGS) boot/head.o init/main.o \ $(ARCHIVES) \ $(DRIVERS) \ $(MATH) \ $(LIBS) \ -o tools/system > System.map #最后的>System.map表示gld需要将连接映象重定向存放在System.map文件中 #数学协处理函数文件math.a由下一行上的命令实现 #进入kernel/math/目录 运行make工具程序 kernel/math/math.a: (cd kernel/math; make) # 块设备函数文件 blk_drv.a kernel/blk_drv/blk_drv.a: (cd kernel/blk_drv; make) # 字符备函数文件 chr_drv.a kernel/chr_drv/chr_drv.a: (cd kernel/chr_drv; make) # 内核目标模块kernel.o kernel/kernel.o: (cd kernel; make) # 内核管理模块mm.o mm/mm.o: (cd mm; make) # 文件系统目标模块fs.o fs/fs.o: (cd fs; make) # 库函数lib.a lib/lib.a: (cd lib; make) # # 用8086汇编和连接器对setup.s文件进行编译生成setup文件 # -s表示要取出目标文件中的符号信息 # boot/setup: boot/setup.s $(AS86) -o boot/setup.o boot/setup.s $(LD86) -s -o boot/setup boot/setup.o # 生成bootsect.o磁盘引导块 boot/bootsect: boot/bootsect.s $(AS86) -o boot/bootsect.o boot/bootsect.s $(LD86) -s -o boot/bootsect boot/bootsect.o # # 在bootsect.s程序开口添加一行有关system文件长度信息 # 首先生成含有 "SYSSIZE = 文件实