Wed, 01 Mar 2023 15:43:11 +0100
10 files changed,
98 insertions(+),
55 deletions(-)
M
README.md
→
README.md
@@ -3,8 +3,9 @@ Simple x86 operating system written in assembly and C.
## Software Requirements * GNU make -* GCC Cross Compiler + matching binutils, tailored for freestanding i686-elf-targets +* [https://wiki.osdev.org/GCC_Cross-Compiler](GCC Cross Compiler + matching binutils), tailored for freestanding i686-elf-targets * Doxygen: If you want to build the documentation +* QEMU: To emulate an x86 system ## Make commands ### Debug build@@ -13,8 +14,11 @@
### Release build ```make build``` +### Run (in an emulator) +```make run``` + ### Clear output directories -```make clear``` +```make clean``` ### Build documentation: ```make docs```
M
apps/makefile
→
apps/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld -T link.txt -r $(wildcard $(LOCAL_BUILD)/*.o) -o $(GLOBAL_BUILD)/apps.o --oformat elf32-i386 +> $(LD) -T link.txt -r $(wildcard $(LOCAL_BUILD)/*.o) -o $(GLOBAL_BUILD)/apps.o --oformat elf32-i386 .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c -I$(INCLUDE_DIR) --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $< +> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
boot/makefile
→
boot/makefile
@@ -17,4 +17,4 @@ build: folder $(SUBDIRS)
.PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build+> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build
M
boot/stage1/makefile
→
boot/stage1/makefile
@@ -2,4 +2,4 @@ .RECIPEPREFIX = >
.PHONY: build build: boot.s -> $(GCC_PREFIX)as -o $(GLOBAL_BUILD)/boot_stage1.o boot.s +> $(AS) -o $(GLOBAL_BUILD)/boot_stage1.o boot.s
M
boot/stage2/makefile
→
boot/stage2/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld $(wildcard $(LOCAL_BUILD)/*.o) -r -T link.txt -o $(GLOBAL_BUILD)/boot_stage2.o --oformat elf32-i386 +> $(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 +> $(MKDIR) $(LOCAL_BUILD) 2> /dev/null; true .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $<+> $(CC) -c $(CCFLAGS) -o $@ $<
M
kernel/drivers/makefile
→
kernel/drivers/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/drivers.o --oformat elf32-i386 +> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/drivers.o --oformat elf32-i386 .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c -I$(INCLUDE_DIR) --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $< +> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
kernel/makefile
→
kernel/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld $(LOCAL_BUILD)/*.o -r -o $(GLOBAL_BUILD)/kernel.o --oformat elf32-i386 +> $(LD) $(LOCAL_BUILD)/*.o -r -o $(GLOBAL_BUILD)/kernel.o --oformat elf32-i386 .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c -I$(INCLUDE_DIR) --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $< +> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
kernel/mm/makefile
→
kernel/mm/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/mm.o --oformat elf32-i386 +> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/mm.o --oformat elf32-i386 .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c -I$(INCLUDE_DIR) --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $< +> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
kernel/sched/makefile
→
kernel/sched/makefile
@@ -10,18 +10,18 @@ SUBDIRS = $(wildcard */.)
.PHONY: build build: folder $(SUBDIRS) $(OBJECTS) -> $(GCC_PREFIX)ld $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/sched.o --oformat elf32-i386 +> $(LD) $(wildcard $(LOCAL_BUILD)/*.o) -r -o $(GLOBAL_BUILD)/sched.o --oformat elf32-i386 .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: $(SUBDIRS) $(SUBDIRS): -> make -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build +> $(MAKE) -C $@ GLOBAL_BUILD=$(LOCAL_BUILD) build $(LOCAL_BUILD)/%.s.o: %.s -> $(GCC_PREFIX)as -o $@ $< +> $(AS) -o $@ $< $(LOCAL_BUILD)/%.c.o: %.c $(wildcard *.h) -> $(GCC_PREFIX)gcc -c -I$(INCLUDE_DIR) --prefix=$(GCC_PREFIX) $(GCC_OPTIONS) -o $@ $< +> $(CC) -c -I$(INCLUDE_DIR) $(CCFLAGS) -o $@ $<
M
makefile
→
makefile
@@ -1,36 +1,79 @@
.RECIPEPREFIX = > -export CURRENT_DIR = $(shell pwd) -export INCLUDE_DIR = $(CURRENT_DIR)/include -export LOG_DIR = $(CURRENT_DIR)/log +# directory definitions +export CURRENT_DIR := $(shell pwd) +export ROOT_DIR := $(CURRENT_DIR) +export INCLUDE_DIR := $(CURRENT_DIR)/include +export LOG_DIR := $(CURRENT_DIR)/log + +# path to cross compiler +export CROSS_COMP := $(HOME)/opt/cross/bin/i686-elf- + +export CC := $(CROSS_COMP)gcc +export LD := $(CROSS_COMP)ld +export AS := $(CROSS_COMP)as +export OBJCOPY := $(CROSS_COMP)objcopy +export OBJDUMP := $(CROSS_COMP)objdump + +#export MAKE := make -R + +export MKDIR := mkdir -p + +GLOBAL_BUILD := $(CURRENT_DIR)/build + +# common flags +CCFLAGS := $(CCFLAGS) -Wno-write-strings +CCFLAGS := $(CCFLAGS) -Qn +CCFLAGS := $(CCFLAGS) -Wall -Wextra -fno-exceptions +CCFLAGS := $(CCFLAGS) -nostdlib -nostartfiles -ffreestanding +CCFLAGS := $(CCFLAGS) -mgeneral-regs-only -mno-red-zone +CCFLAGS := $(CCFLAGS) --prefix=$(CROSS_COMP) -export GCC_PREFIX = $(HOME)/opt/cross/bin/i686-elf- -GLOBAL_BUILD = $(CURRENT_DIR)/build +# debug target +.PHONY: debug +debug: DEBUG := 1 + + +# release target ifdef DEBUG -GCC_OPTIONS = -D DEBUG -g -O0 -Wno-write-strings -Qn -Wall -Wextra -fno-exceptions -nostdlib -nostartfiles -ffreestanding -mgeneral-regs-only -mno-red-zone -LOCAL_BUILD = $(GLOBAL_BUILD)/debug +CCFLAGS := $(CCFLAGS) -D DEBUG -g -O0 +GLOBAL_BUILD := $(GLOBAL_BUILD)/debug else -GCC_OPTIONS = -O1 -Wno-write-strings -Qn -Wall -Wextra -fno-exceptions -nostdlib -nostartfiles -ffreestanding -mgeneral-regs-only -mno-red-zone -LOCAL_BUILD = $(GLOBAL_BUILD)/release +CCFLAGS := $(CCFLAGS) -O1 +GLOBAL_BUILD := $(GLOBAL_BUILD)/release endif -export GCC_OPTIONS +LOCAL_BUILD := $(GLOBAL_BUILD)/components + +export CCFLAGS +export GLOBAL_BUILD .PHONY: folder folder: -> @mkdir -p $(LOCAL_BUILD) +> $(MKDIR) $(LOCAL_BUILD) .PHONY: build -build: boot kernel apps -> @mkdir $(LOCAL_BUILD) 2> /dev/null; true -> $(GCC_PREFIX)ld $(LOCAL_BUILD)/*.o -T link.txt -Map=$(LOG_DIR)/mapfile.txt -o $(GLOBAL_BUILD)/base.o -> $(GCC_PREFIX)objcopy --only-keep-debug $(GLOBAL_BUILD)/base.o $(LOG_DIR)/base.sym -> $(GCC_PREFIX)objcopy -O binary $(GLOBAL_BUILD)/base.o $(GLOBAL_BUILD)/base.img -> $(GCC_PREFIX)objdump -D $(GLOBAL_BUILD)/base.o > $(LOG_DIR)/objdump.txt +build: $(GLOBAL_BUILD)/base.img + +$(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.img: $(GLOBAL_BUILD)/base.o +> $(OBJCOPY) -O binary $(GLOBAL_BUILD)/base.o $(GLOBAL_BUILD)/base.img + +.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 + +$(LOG_DIR)/objdump.txt: $(GLOBAL_BUILD)/base.o +> $(OBJDUMP) -D $(GLOBAL_BUILD)/base.o > $(LOG_DIR)/objdump.txt .PHONY: boot boot: +> echo $(AS) > $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C boot build .PHONY: kernel@@ -48,10 +91,6 @@
.PHONY: run run: > ./run.sh - -.PHONY: debug -debug: -> $(MAKE) DEBUG=1 build .PHONY: docs docs: