计算机内核学习

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 里面主要有:
  1. image: realclean everything clean buildimg
  2. realclean: 清空。 rm 中间产物 OBJS + 最后的三个产物
  3. everything: 产生最后的三个产物 boot.bin loader.bin kernel.bin
  4. clean:清空中间产物 OBJS
  5. buildimg:
    1. 建立一个 img 把 boot.bin 写到 img 的前 512 字节
    2. 用 mount 指令挂载 img
    3. 把 loader.bin kernel.bin 加载到挂载 img 所在目录中
    4. 用 unmount 指令解挂载 img
  • 这样形成的 a.img(1.44M fat12 格式)
    前 512 字节包含了 boot.bin ;数据区中有 loader.bin 以及 kernel.bin 文件

  • 详细说一下 everything 中三个最后产物到底如何形成的。
    首先我们要明确

    1. asm 利用的头文件是.inc
    2. c 利用的头文件是.h
    3. asm 的文件编译都需要 nasm
    4. c 文件的编译都需要 gcc
  • 对于 nasm 以及 gcc 后面都对应的-I 然后一个目录,另外两个参数是源文件和目标文件,
    中间的目录代表我们编译所需要的头文件从哪里取出。

2.内核内容

猜你喜欢

转载自blog.csdn.net/qq_28485501/article/details/83751410