日期:2014-05-16  浏览次数:20759 次

Old-linux-0.11顶层Makefile
# 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 = 文件实