Wed, 01 Mar 2023 20:35:59 +0100
24 files changed,
120 insertions(+),
187 deletions(-)
M
apps/makefile
→
apps/makefile
@@ -1,24 +1,27 @@
.RECIPEPREFIX = > -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) +LOCAL_BUILD = $(GLOBAL_BUILD)/apps + +SRC_DIR := $(shell pwd) + +C_SOURCES := $(wildcard *.c) $(wildcard **/*.c) +S_SOURCES := $(wildcard *.s) $(wildcard **/*.s) + +C_OBJECTS := $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(C_SOURCES)) +S_OBJECTS := $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(S_SOURCES)) OBJECTS = $(S_OBJECTS) $(C_OBJECTS) -LOCAL_BUILD = $(GLOBAL_BUILD)/apps +DIRS := $(dir $(OBJECTS)) -SUBDIRS = $(wildcard */.) +$(OBJECTS): | $(DIRS) +$(DIRS): +> $(MKDIR) $(DIRS) .PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) -T link.txt -r $(wildcard $(LOCAL_BUILD)/*.o) -o $(GLOBAL_BUILD)/apps.o --oformat elf32-i386 - -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) +build: folder $(SUBDIRS) $(GLOBAL_BUILD)/apps.o +$(GLOBAL_BUILD)/apps.o: $(OBJECTS) +> $(LD) -T link.txt -r $^ -o $@ --oformat elf32-i386 -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s > $(AS) -o $@ $<
D
boot/makefile
@@ -1,20 +0,0 @@
-.RECIPEPREFIX = > - -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) -OBJECTS = $(S_OBJECTS) $(C_OBJECTS) - -LOCAL_BUILD = $(GLOBAL_BUILD) - -SUBDIRS = $(wildcard */.) - -.PHONY: folder -folder: -> @mkdir -p $(LOCAL_BUILD) - -.PHONY: build -build: folder $(SUBDIRS) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build
D
boot/stage1/makefile
@@ -1,5 +0,0 @@
-.RECIPEPREFIX = > - -.PHONY: build -build: boot.s -> $(AS) -o $(GLOBAL_BUILD)/boot_stage1.o boot.s
D
boot/stage2/makefile
@@ -1,27 +0,0 @@
-.RECIPEPREFIX = > - -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) -OBJECTS = $(S_OBJECTS) $(C_OBJECTS) - -LOCAL_BUILD = $(GLOBAL_BUILD)/boot_stage2 - -SUBDIRS = $(wildcard */.) - -.PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -T link.txt -o $(GLOBAL_BUILD)/boot_stage2.o --oformat elf32-i386 - -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) 2> /dev/null; true - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build - -$(LOCAL_BUILD)/%.s.o: %.s -> $(AS) -o $@ $< - -$(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(CC) -c $(CCFLAGS) -o $@ $<
D
kernel/drivers/makefile
@@ -1,27 +0,0 @@
-.RECIPEPREFIX = > - -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) -OBJECTS = $(S_OBJECTS) $(C_OBJECTS) - -LOCAL_BUILD = $(GLOBAL_BUILD)/drivers - -SUBDIRS = $(wildcard */.) - -.PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/drivers.o --oformat elf32-i386 - -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build - -$(LOCAL_BUILD)/%.s.o: %.s -> $(AS) -o $@ $< - -$(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
kernel/main.c
→
kernel/main.c
@@ -142,6 +142,6 @@
//kpanic("SIMULATED KERNEL PANIC"); // won't be executed - //printk("Main procedure terminating.\n"); + printk("Main procedure terminating.\n"); return 0; }
M
kernel/makefile
→
kernel/makefile
@@ -1,24 +1,30 @@
.RECIPEPREFIX = > -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) +LOCAL_BUILD := $(GLOBAL_BUILD)/kernel + +SRC_DIR := $(shell pwd) + +C_SOURCES := $(wildcard *.c) $(wildcard **/*.c) +S_SOURCES := $(wildcard *.s) $(wildcard **/*.s) + +C_OBJECTS := $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(C_SOURCES)) +S_OBJECTS := $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(S_SOURCES)) OBJECTS = $(S_OBJECTS) $(C_OBJECTS) -LOCAL_BUILD = $(GLOBAL_BUILD)/kernel +DIRS := $(dir $(OBJECTS)) -SUBDIRS = $(wildcard */.) +$(OBJECTS): | $(DIRS) +$(DIRS): +> $(MKDIR) $(DIRS) .PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) $(LOCAL_BUILD)/*.o -r -o $(GLOBAL_BUILD)/kernel.o --oformat elf32-i386 +build: folder +$(GLOBAL_BUILD)/kernel.o: $(OBJECTS) | folder +> $(LD) $^ -r -o $@ --oformat elf32-i386 .PHONY: folder folder: > $(MKDIR) $(LOCAL_BUILD) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s > $(AS) -o $@ $<
D
kernel/mm/makefile
@@ -1,27 +0,0 @@
-.RECIPEPREFIX = > - -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) -OBJECTS = $(S_OBJECTS) $(C_OBJECTS) - -LOCAL_BUILD = $(GLOBAL_BUILD)/mm - -SUBDIRS = $(wildcard */.) - -.PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/mm.o --oformat elf32-i386 - -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build - -$(LOCAL_BUILD)/%.s.o: %.s -> $(AS) -o $@ $< - -$(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
D
kernel/sched/makefile
@@ -1,27 +0,0 @@
-.RECIPEPREFIX = > - -S_OBJECTS = $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(wildcard *.s)) -C_OBJECTS = $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(wildcard *.c)) -OBJECTS = $(S_OBJECTS) $(C_OBJECTS) - -LOCAL_BUILD = $(GLOBAL_BUILD)/sched - -SUBDIRS = $(wildcard */.) - -.PHONY: build -build: folder $(SUBDIRS) $(OBJECTS) -> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/sched.o --oformat elf32-i386 - -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): -> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build - -$(LOCAL_BUILD)/%.s.o: %.s -> $(AS) -o $@ $< - -$(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
kernel/sched/sched.c
→
kernel/sched/sched.c
@@ -133,7 +133,7 @@ pic1_eoi();
} void idle(void) { - while (1) { printk("."); hlt(); } + while (1) { printk("idle.\n"); hlt(); } } extern void* sched_interrupt;
M
link.txt
→
link.txt
@@ -5,42 +5,42 @@ PAGE_SIZE = 1 << 12;
MEMORY { - BOOT_STAGE1 : ORIGIN = 0x00007C00, LENGTH = 0x00000200 - BOOT_STAGE2 : ORIGIN = 0x00010000, LENGTH = 0x00090000 - KERNEL : ORIGIN = 0xC0000000, LENGTH = 0x30000000 - APPLICATION : ORIGIN = 0x10000000, LENGTH = 0xB0000000 + BOOT_STAGE1_VMA : ORIGIN = 0x00007C00, LENGTH = 0x00000200 + BOOT_STAGE2_VMA : ORIGIN = 0x00010000, LENGTH = 0x00090000 + KERNEL_VMA : ORIGIN = 0xC0000000, LENGTH = 0x30000000 + APPLICATION_VMA : ORIGIN = 0x10000000, LENGTH = 0xB0000000 } SECTIONS { BOOT_STAGE1 : AT(0x0000) { - */boot_stage1.o(.*) + */stage1.o(.*) . = 510; BYTE(0x55) BYTE(0xAA) - } >BOOT_STAGE1 + } >BOOT_STAGE1_VMA BOOT_STAGE2 : AT(LOADADDR(BOOT_STAGE1) + SIZEOF(BOOT_STAGE1)) { - */boot_stage2.o(.*) - } >BOOT_STAGE2 + */stage2.o(.*) + } >BOOT_STAGE2_VMA KERNEL : AT(LOADADDR(BOOT_STAGE2) + SIZEOF(BOOT_STAGE2)) { */kernel.o(.*) */kernel.o(.bss) - } >KERNEL + } >KERNEL_VMA APPLICATION : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL)) { */apps.o(.*) - } >APPLICATION + } >APPLICATION_VMA .bss : AT(LOADADDR(APPLICATION) + SIZEOF(APPLICATION)) { - } >KERNEL + } >KERNEL_VMA } __SS_LMA = LOADADDR(BOOT_STAGE2);@@ -50,6 +50,8 @@
__KERNEL_LMA = LOADADDR(KERNEL); __KERNEL_VMA = ADDR(KERNEL); __KERNEL_SIZE = SIZEOF(KERNEL); + +ASSERT(__KERNEL_LMA == __SS_LMA + __SS_SIZE, "LMA incorrect!"); __APP_LMA = LOADADDR(APPLICATION); __APP_VMA = ADDR(APPLICATION);
M
makefile
→
makefile
@@ -18,6 +18,7 @@
#export MAKE := make -R export MKDIR := mkdir -p +export RM := rm GLOBAL_BUILD := $(CURRENT_DIR)/build@@ -49,44 +50,54 @@
export CCFLAGS export GLOBAL_BUILD -.PHONY: folder -folder: -> $(MKDIR) $(LOCAL_BUILD) +OBJECTS := $(LOCAL_BUILD)/stage1.o $(LOCAL_BUILD)/stage2.o $(LOCAL_BUILD)/kernel.o $(LOCAL_BUILD)/apps.o +DIRS := $(dir $(OBJECTS)) + +$(OBJECTS): | $(DIRS) +$(DIRS): +> $(MKDIR) $(DIRS) .PHONY: build -build: $(GLOBAL_BUILD)/base.img +build: $(GLOBAL_BUILD)/base.img $(GLOBAL_BUILD)/base.o -$(GLOBAL_BUILD)/base.o: boot kernel apps -> $(LD) $(LOCAL_BUILD)/*.o -T link.txt -Map=$(LOG_DIR)/mapfile.txt -o $(GLOBAL_BUILD)/base.o +$(GLOBAL_BUILD)/base.o: $(OBJECTS) +> $(LD) $^ -r -T link.txt -Map=$(LOG_DIR)/mapfile.txt --oformat elf32-i386 -o $@ -$(GLOBAL_BUILD)/base.img: $(GLOBAL_BUILD)/base.o -> $(OBJCOPY) -O binary $(GLOBAL_BUILD)/base.o $(GLOBAL_BUILD)/base.img +$(GLOBAL_BUILD)/base.img: $(OBJECTS) +> $(LD) $^ -T link.txt -Map=$(LOG_DIR)/mapfile.txt --oformat binary --nostdlib -o $@ .PHONY: logs logs: $(LOG_DIR)/base.sym $(LOG_DIR)/objdump.txt $(LOG_DIR)/base.sym: $(GLOBAL_BUILD)/base.o -> $(OBJCOPY) --only-keep-debug $(GLOBAL_BUILD)/base.o $(LOG_DIR)/base.sym +> $(OBJCOPY) --only-keep-debug $< $@ $(LOG_DIR)/objdump.txt: $(GLOBAL_BUILD)/base.o -> $(OBJDUMP) -D $(GLOBAL_BUILD)/base.o > $(LOG_DIR)/objdump.txt +> $(OBJDUMP) -D $< > $@ -.PHONY: boot -boot: -> echo $(AS) -> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C boot build +.PHONY: stage1 +stage1: +$(LOCAL_BUILD)/stage1.o: +> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C stage1 $@ +.PHONY: stage2 + +stage2: +$(LOCAL_BUILD)/stage2.o: +> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C stage2 $@ .PHONY: kernel kernel: -> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C kernel build +$(LOCAL_BUILD)/kernel.o: +> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C kernel $@ .PHONY: apps apps: -> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C apps build +$(LOCAL_BUILD)/apps.o: +> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C apps $@ .PHONY: clean clean: -> @rm -r $(CURRENT_DIR)/build/* 2> /dev/null; true +> $(RM) -r $(CURRENT_DIR)/build/* 2> /dev/null; true .PHONY: run run:
M
run.sh
→
run.sh
@@ -1,1 +1,1 @@
-qemu-system-i386 -drive index=0,if=floppy,format=raw,file=build/base.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm 2> log/run_err.log+qemu-system-i386 -drive index=0,if=floppy,format=raw,file=build/release/base.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm 2> log/run_err.log
A
stage1/makefile
@@ -0,0 +1,15 @@
+.RECIPEPREFIX = > + +LOCAL_BUILD = $(GLOBAL_BUILD)/stage1 + +OBJECTS := $(GLOBAL_BUILD)/stage1.o +DIRS := $(dir $(OBJECTS)) + +$(OBJECTS): | $(DIRS) +$(DIRS): +> $(MKDIR) $(DIRS) + +.PHONY: build +build: $(OBJECTS) +$(GLOBAL_BUILD)/stage1.o: stage1.s +> $(AS) -o $@ $<
A
stage2/makefile
@@ -0,0 +1,29 @@
+.RECIPEPREFIX = > + +LOCAL_BUILD := $(GLOBAL_BUILD)/stage2 + +SRC_DIR := $(shell pwd) + +C_SOURCES := $(wildcard *.c) +S_SOURCES := $(wildcard *.s) + +C_OBJECTS := $(patsubst %.c,$(LOCAL_BUILD)/%.c.o,$(C_SOURCES)) +S_OBJECTS := $(patsubst %.s,$(LOCAL_BUILD)/%.s.o,$(S_SOURCES)) +OBJECTS = $(S_OBJECTS) $(C_OBJECTS) + +DIRS := $(dir $(OBJECTS)) + +$(OBJECTS): | $(DIRS) +$(DIRS): +> $(MKDIR) $(DIRS) + +.PHONY: build +build: $(GLOBAL_BUILD)/stage2.o +$(GLOBAL_BUILD)/stage2.o: $(OBJECTS) +> $(LD) $^ -r -T link.txt -o $@ --oformat elf32-i386 + +$(LOCAL_BUILD)/%.s.o: %.s +> $(AS) -o $@ $< + +$(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) +> $(CC) -c $(CCFLAGS) -o $@ $<