Chapter 8:記憶體管理系統 === :::info 這是讀書筆記 ![book](https://hackmd.io/_uploads/H1rFFZZAkx.jpg =30%x) 作者:鄭鋼 出版社:佳魁資訊股份有限公司 出版日期:2017/05/31 ::: --- # makefile 簡介 不錯的網路資源 * https://www.mropengate.com/2018/01/makefile.html * https://hackmd.io/@sysprog/SySTMXPvl * https://github.com/yyluoyong/Make-3.8-Chinese-Manuals/blob/master/main.pdf ## 檔案結構 >[!Tip] 盡可能的簡化整個檔案目錄 ![截圖 2025-07-08 下午4.04.36](https://hackmd.io/_uploads/Sk9NZ89Hxl.png) ## makefile ```mk= ##################################### # Environment # ##################################### BUILD_DIR = ./build OUT_DIR = ./out ##################################### # Build Tools # ##################################### AS = nasm CC = x86_64-linux-gnu-gcc LD = x86_64-linux-gnu-ld ##################################### # Build Flags # ##################################### KERNEL_ENTRY = 0xc0001500 ASFLAGS = -f elf CFLAGS = -c -m32 -fno-stack-protector -fno-builtin LDFLAGS = -m elf_i386 -Ttext $(KERNEL_ENTRY) -e main -z noexecstack ##################################### # Include Files # ##################################### INCLUDE = -I ./include ##################################### # Output Files # ##################################### obj := ##################################### # MBR: mbr.bin # ##################################### $(OUT_DIR)/mbr.bin: boot/mbr.S $(AS) -I boot/ $< -o $@ ##################################### # Bootloader: loader.bin # ##################################### $(OUT_DIR)/loader.bin: boot/loader.S $(AS) -I boot/ $< -o $@ ##################################### # Kernel Objects: C # ##################################### $(BUILD_DIR)/main.o: kernel/main.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/main.o $(BUILD_DIR)/init.o: kernel/init.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/init.o $(BUILD_DIR)/interrupt.o: kernel/interrupt.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/interrupt.o $(BUILD_DIR)/timer.o: kernel/timer.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/timer.o $(BUILD_DIR)/debug.o: kernel/debug.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/debug.o $(BUILD_DIR)/string.o: kernel/string.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/string.o $(BUILD_DIR)/bitmap.o: kernel/bitmap.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/bitmap.o $(BUILD_DIR)/memory.o: kernel/memory.c $(CC) $(CFLAGS) $(INCLUDE) $< -o $@ obj += $(BUILD_DIR)/memory.o ##################################### # Kernel Objects: Assembly # ##################################### $(BUILD_DIR)/print.o: kernel/print.S $(AS) $(ASFLAGS) $< -o $@ obj += $(BUILD_DIR)/print.o $(BUILD_DIR)/kernel.o: kernel/kernel.S $(AS) $(ASFLAGS) $< -o $@ obj += $(BUILD_DIR)/kernel.o ##################################### # Kernel: kernel.bin # ##################################### $(OUT_DIR)/kernel.bin: $(obj) $(LD) $(LDFLAGS) $^ -o $@ ##################################### # Command # ##################################### .PHONY : dir clean all dir: @echo ">>>Start $@..." @echo "mkdir $(BUILD_DIR)" @if [ ! -d $(BUILD_DIR) ];then mkdir $(BUILD_DIR);fi @echo "mkdir $(OUT_DIR)" @if [ ! -d $(OUT_DIR) ];then mkdir $(OUT_DIR);fi @echo ">>>make $@ done." clean: @echo ">>>Start $@..." rm -f $(BUILD_DIR)/* rm -f $(OUT_DIR)/* @echo ">>>make $@ done." all: dir $(OUT_DIR)/mbr.bin $(OUT_DIR)/loader.bin $(OUT_DIR)/kernel.bin @echo ">>>make $@ done." ``` # assert 實作 ## Source Code https://github.com/yifengyou/os-elephant/tree/master/code/c08/a ## Result ![截圖 2025-07-03 上午8.42.05](https://hackmd.io/_uploads/r1alfL7rll.png) # 字串操作函數 ## Source Code https://github.com/yifengyou/os-elephant/tree/master/code/c08/b # Bitmap Operation ## Source Code https://github.com/yifengyou/os-elephant/tree/master/code/c08/c # 記憶體管理 ## Source Code https://github.com/yifengyou/os-elephant/tree/master/code/c08/e ## Result ![截圖 2025-07-08 下午3.56.30](https://hackmd.io/_uploads/S1wwyUcHgx.png)