1. 文件结构
前言:
内核的文件树如下所示:
编译文件如下:
# All Phony Targets
.PHONY : everything final image clean realclean disasm all buildimg
# Default starting position
everything : $(TINIXBOOT) $(TINIXKERNEL)
all : realclean everything
final : all clean
image : final buildimg
clean :
rm -f $(OBJS)
realclean :
rm -f $(OBJS) $(TINIXBOOT) $(TINIXKERNEL)
disasm :
$(DASM) $(DASMFLAGS) $(TINIXKERNEL) > $(DASMOUTPUT)
# Write "boot.bin" & "loader.bin" into floppy image "TINIX.IMG"
# We assume that "TINIX.IMG" exists in current folder
buildimg :
dd if=boot/boot.bin of=TINIX.img bs=512 count=1 conv=notrunc
mount TINIX.IMG /mnt/floppy -o loop
cp -f boot/loader.bin /mnt/floppy/
cp -f kernel.bin /mnt/floppy
umount /mnt/floppy
boot/boot.bin : boot/boot.asm boot/include/load.inc boot/include/fat12hdr.inc
$(ASM) $(ASMBFLAGS) -o $@ $<
boot/loader.bin : boot/loader.asm boot/include/load.inc boot/include/fat12hdr.inc boot/include/pm.inc
$(ASM) $(ASMBFLAGS) -o $@ $<
$(TINIXKERNEL) : $(OBJS)
$(LD) $(LDFLAGS) -o $(TINIXKERNEL) $(OBJS)
kernel/kernel.o : kernel/kernel.asm include/sconst.inc
$(ASM) $(ASMKFLAGS) -o $@ $<
kernel/start.o: kernel/start.c include/type.h include/const.h include/protect.h include/string.h include/proc.h include/proto.h \
include/global.h
$(CC) $(CFLAGS) -o $@ $<
- Makefile 里面主要有:
- image: realclean everything clean buildimg
- realclean: 清空。 rm 中间产物 OBJS + 最后的三个产物
- everything: 产生最后的三个产物 boot.bin loader.bin kernel.bin
- clean:清空中间产物 OBJS
- buildimg:
- 建立一个 img 把 boot.bin 写到 img 的前 512 字节
- 用 mount 指令挂载 img
- 把 loader.bin kernel.bin 加载到挂载 img 所在目录中
- 用 unmount 指令解挂载 img
-
这样形成的 a.img(1.44M fat12 格式)
前 512 字节包含了 boot.bin ;数据区中有 loader.bin 以及 kernel.bin 文件 -
详细说一下 everything 中三个最后产物到底如何形成的。
首先我们要明确- asm 利用的头文件是.inc
- c 利用的头文件是.h
- asm 的文件编译都需要 nasm
- c 文件的编译都需要 gcc
-
对于 nasm 以及 gcc 后面都对应的-I 然后一个目录,另外两个参数是源文件和目标文件,
中间的目录代表我们编译所需要的头文件从哪里取出。