Sun, 01 Jun 2025 15:04:17 +0200
5 files changed,
205 insertions(+),
253 deletions(-)
A
CMakeLists.txt
@@ -0,0 +1,180 @@
+cmake_minimum_required(VERSION 3.15) +project(cedos C ASM) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +function(cedos_linker_script target linker_script) + target_link_options(${target} PRIVATE + -T ${linker_script} + ) +endfunction() + +function(cedos_mapfile target_elf) + string(REPLACE ".elf" ".map" target_map ${target_elf}) + target_link_options(${target_elf} PRIVATE + LINKER:-Map=${CMAKE_BINARY_DIR}/${target_map} + ) +endfunction() + +function(cedos_print_usage target_elf) + target_link_options(${target_elf} PRIVATE + LINKER:--print-memory-usage + ) +endfunction() + +function(cedos_strip_binary target_elf) + string(REPLACE ".elf" ".bin" target_bin ${target_elf}) + add_custom_command( + TARGET ${target_elf} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary ${target_elf} ${target_bin} + COMMENT "Stripping ${target_elf} into raw binary ${target_bin}" + ) +endfunction() + +execute_process( + COMMAND git describe --abbrev=4 --dirty --always --tags + OUTPUT_VARIABLE GIT_VERSION +) +add_compile_options(-DVERSION="${GIT_VERSION}") + +list(APPEND COMMON_SRC + common/memory.c + common/string.c + common/fat12.c +) + +list(APPEND BOOT_SRC + boot/drives.s + boot/mbr.s + boot/paging.c + boot/gdt.c + boot/a20.s + boot/main.c + boot/display.s + boot/entry.s +) + +list(APPEND KERNEL_SRC + kernel/pic.c + kernel/syscall.c + kernel/drivers/console.c + kernel/drivers/graphics.s + kernel/drivers/keyboard.c + kernel/drivers/vga_console.c + kernel/drivers/graphics.c + kernel/drivers/ps2_keyboard.c + kernel/drivers/tty.c + kernel/drivers/bios_speaker.c + kernel/syscall.s + kernel/sched/sched.c + kernel/sched/stack_check.c + kernel/sched/sched.s + kernel/sched/process.c + kernel/sched/sched_strats.c + kernel/pit.c + kernel/time.c + kernel/core.c + kernel/mm/paging.c + kernel/mm/page_allocator.c + kernel/file.c + kernel/main.c + kernel/elf.c + kernel/fat.c + kernel/entry.s + kernel/pipe.c + kernel/alarm.c + kernel/interrupts.c +) + +list(APPEND LIBCEDOS_SRC + libcedos/stdio.c + libcedos/cedos.c + libcedos/start.c + libcedos/stdlib.c + libcedos/assert.c +) + +list(APPEND SHELL_APPS + imgview + mtest + shelf + gmode + hexdump + memusage + ticks + ls + kill + echo + reboot + md5 + cat +) + +if(DEFINED DEBUG) + add_compile_options(-DDEBUG) +endif() + +# Boot +add_executable(boot.elf + ${COMMON_SRC} + ${BOOT_SRC} +) + +target_include_directories(boot.elf PRIVATE + boot/ + common/ +) + +target_compile_options(boot.elf PRIVATE + -Os +) + +cedos_linker_script(boot.elf ${CMAKE_SOURCE_DIR}/boot/link.txt) +cedos_strip_binary(boot.elf) +cedos_mapfile(boot.elf) +cedos_print_usage(boot.elf) + +# Kernel +add_executable(kernel.elf + ${COMMON_SRC} + ${KERNEL_SRC} +) + +target_include_directories(kernel.elf PRIVATE + kernel/ + common/ +) + +cedos_linker_script(kernel.elf ${CMAKE_SOURCE_DIR}/kernel/link.txt) +cedos_strip_binary(kernel.elf) +cedos_mapfile(kernel.elf) +cedos_print_usage(kernel.elf) + +# libcedos +add_library(cedos STATIC + ${COMMON_SRC} + ${LIBCEDOS_SRC} +) + +target_include_directories(cedos PRIVATE + libcedos/ + common/ +) + +# shell +foreach(SHELL_APP IN LISTS SHELL_APPS) + add_executable(${SHELL_APP} + shell/${SHELL_APP}.c + ) + + target_link_libraries(${SHELL_APP} cedos) + target_include_directories(${SHELL_APP} PRIVATE + libcedos/ + common/ + ) + cedos_linker_script(${SHELL_APP} ${CMAKE_SOURCE_DIR}/shell/link.txt) + + target_link_options(${SHELL_APP} PRIVATE + LINKER:-Map=${CMAKE_BINARY_DIR}/${SHELL_APP}.map + ) +endforeach()
M
boot/link.txt
→
boot/link.txt
@@ -1,5 +1,4 @@
OUTPUT_ARCH(i386) -OUTPUT_FORMAT(binary) PAGE_SIZE = 1 << 12;@@ -17,7 +16,7 @@ SECTIONS
{ STAGE1 : AT(0x0000) { - */*.o(.mbr) + */*(.mbr) . = 510; BYTE(0x55) BYTE(0xAA)@@ -25,17 +24,17 @@ } >STAGE1_VMA
STAGE2 : AT(LOADADDR(STAGE1) + SIZEOF(STAGE1)) { - */*.o(.text) - */*.o(.rodata*) - */*.o(.data) + */*(.text) + */*(.rodata*) + */*(.data) } >STAGE2_VMA .data : AT(LOADADDR(STAGE2) + SIZEOF(STAGE2)) { } >STAGE2_VMA - .bss : + .bss : { - */*.o(.bss) + */*(.bss) } >BOOT_DATA -}+}
A
cmake/i686-elf-toolchain.cmake
@@ -0,0 +1,17 @@
+set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR i686) + +set(CMAKE_C_COMPILER i686-elf-gcc) +set(CMAKE_CXX_COMPILER i686-elf-g++) +set(CMAKE_ASM_COMPILER i686-elf-gcc) + +set(CMAKE_C_FLAGS "-ffreestanding -nostdlib -Wall -Wextra -mgeneral-regs-only") +set(CMAKE_CXX_FLAGS "-ffreestanding -nostdlib -fno-exceptions -fno-rtti -Wall -Wextra") +set(CMAKE_ASM_FLAGS "-ffreestanding -nostdlib") + +set(CMAKE_C_COMPILER_FORCED TRUE) +set(CMAKE_CXX_COMPILER_FORCED TRUE) +set(CMAKE_ASM_COMPILER_FORCED TRUE) + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +
M
kernel/link.txt
→
kernel/link.txt
@@ -1,5 +1,4 @@
OUTPUT_ARCH(i386) -OUTPUT_FORMAT(binary) PAGE_SIZE = 1 << 12;@@ -13,7 +12,7 @@ SECTIONS
{ KERNEL : AT(0x0000) { - */entry.s.o(.text) + */entry.s*(.text) */*(.text) */*(.data) */*(.rodata*)
D
makefile
@@ -1,243 +0,0 @@
-.RECIPEPREFIX = > - -# directory definitions -export CURRENT_DIR := $(shell pwd) -export ROOT_DIR := $(CURRENT_DIR) -export SOURCE_DIR := $(CURRENT_DIR)/src -export INCLUDE_DIR := $(CURRENT_DIR)/include -export BUILD_LOGS := $(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 AR := $(CROSS_COMP)ar -export OBJCOPY := $(CROSS_COMP)objcopy -export OBJDUMP := $(CROSS_COMP)objdump - -#export MAKE := make -R - -export MKDIR := mkdir -p -export RM := rm - -GLOBAL_BUILD := $(CURRENT_DIR)/build - -# common flags -CCFLAGS := $(CCFLAGS) -Wno-write-strings -CCFLAGS := $(CCFLAGS) -Qn -CCFLAGS := $(CCFLAGS) -pedantic -Wold-style-definition -CCFLAGS := $(CCFLAGS) -Wall -Wextra -fno-exceptions -CCFLAGS := $(CCFLAGS) -Werror-implicit-function-declaration -CCFLAGS := $(CCFLAGS) -nostdlib -nostartfiles -ffreestanding -CCFLAGS := $(CCFLAGS) -mgeneral-regs-only -mno-red-zone -CCFLAGS := $(CCFLAGS) --prefix=$(CROSS_COMP) - -GIT_VERSION := "$(shell git describe --abbrev=4 --dirty --always --tags)" -CCFLAGS := $(CCFLAGS) -DVERSION=\"$(GIT_VERSION)\" - - -# debug target -.PHONY: debug -debug: DEBUG := 1 - - -# release target -ifdef DEBUG -CCFLAGS := $(CCFLAGS) -D DEBUG -g -O0 -GLOBAL_BUILD := $(GLOBAL_BUILD)/debug -else -CCFLAGS := $(CCFLAGS) -O1 -GLOBAL_BUILD := $(GLOBAL_BUILD)/release -endif - -ifndef VERBOSE -.SILENT: -> echo "Silent mode active." -endif - -BUILD_OBJECTS := $(GLOBAL_BUILD)/obj -BUILD_ARTIFACTS := $(GLOBAL_BUILD)/artifacts -BUILD_LOGS := $(GLOBAL_BUILD)/logs -BUILD_MOUNT := $(GLOBAL_BUILD)/mnt - -export CCFLAGS -export GLOBAL_BUILD - -SRC_ALL := $(shell find common/ boot/ kernel/ libcedos/ shell/ -name '*.c') -ASM_ALL := $(shell find common/ boot/ kernel/ libcedos/ shell/ -name '*.s') - -OBJECTS := $(patsubst %,$(BUILD_OBJECTS)/%.o,$(SRC_ALL) $(ASM_ALL)) - - -DIRS := $(dir $(OBJECTS)) $(BUILD_ARTIFACTS) $(BUILD_LOGS) -DIRS := $(sort $(DIRS)) - -$(DIRS): -> $(MKDIR) $@ -ifndef VERBOSE -> echo "MKDIR $@" -endif - -.PHONY: build -build: $(BUILD_ARTIFACTS)/cedos.img -$(OBJECTS): $(DIRS) - -$(BUILD_OBJECTS)/%.s.o: %.s -> $(AS) -o $@ $< -ifndef VERBOSE -> echo "AS $@" -endif - -# common -OBJ_COMMON := $(filter $(BUILD_OBJECTS)/common/%,$(OBJECTS)) -$(BUILD_OBJECTS)/common/%.c.o: common/%.c -> $(CC) -c -Icommon $(CCFLAGS) -o $@ $< - - -# boot -OBJ_BOOT := $(filter $(BUILD_OBJECTS)/boot/%,$(OBJECTS)) -OUT_BOOT := $(BUILD_ARTIFACTS)/boot.elf $(BUILD_ARTIFACTS)/boot.bin - -$(BUILD_OBJECTS)/boot/%.c.o: boot/%.c -> $(CC) -c -Iboot -Icommon $(CCFLAGS) -o $@ $< -ifndef VERBOSE -> echo "CC $@" -endif - -$(BUILD_ARTIFACTS)/boot.elf: $(OBJ_BOOT) $(OBJ_COMMON) -> $(LD) $^ -T boot/link.txt -Map=$(BUILD_LOGS)/boot_mapfile.txt --oformat elf32-i386 -o $@ -ifndef VERBOSE -> echo "LD $@" -endif - -$(BUILD_ARTIFACTS)/boot.bin: $(OBJ_BOOT) $(OBJ_COMMON) -> $(LD) $^ -T boot/link.txt -Map=$(BUILD_LOGS)/boot_mapfile.txt --oformat binary -o $@ -ifndef VERBOSE -> echo "LD $@" -endif - -.PHONY: boot -boot: $(OUT_BOOT) - - -# kernel -OBJ_KERNEL := $(filter $(BUILD_OBJECTS)/kernel/%,$(OBJECTS)) -OUT_KERNEL := $(BUILD_ARTIFACTS)/kernel.elf $(BUILD_ARTIFACTS)/kernel.bin - -$(BUILD_OBJECTS)/kernel/%.c.o: kernel/%.c -> $(CC) -c -Ikernel -Icommon $(CCFLAGS) -o $@ $< -ifndef VERBOSE -> echo "CC $@" -endif - -$(BUILD_ARTIFACTS)/kernel.elf: $(OBJ_KERNEL) $(OBJ_COMMON) -> $(LD) $^ -T kernel/link.txt -Map=$(BUILD_LOGS)/kernel_mapfile.txt --oformat elf32-i386 -o $@ -ifndef VERBOSE -> echo "LD $@" -endif - -$(BUILD_ARTIFACTS)/kernel.bin: $(OBJ_KERNEL) $(OBJ_COMMON) -> $(LD) $^ -T kernel/link.txt -Map=$(BUILD_LOGS)/kernel_mapfile.txt --oformat binary -o $@ -ifndef VERBOSE -> echo "LD $@" -endif - -.PHONY: kernel -kernel: $(OUT_KERNEL) - - -# libcedos -OBJ_LIBCEDOS := $(filter $(BUILD_OBJECTS)/libcedos/%,$(OBJECTS)) -OUT_LIBCEDOS := $(BUILD_ARTIFACTS)/libcedos.a - -$(BUILD_OBJECTS)/libcedos/%.c.o: libcedos/%.c -> $(CC) -c -Ilibcedos -Icommon $(CCFLAGS) -o $@ $< -ifndef VERBOSE -> echo "CC $@" -endif - -$(BUILD_ARTIFACTS)/libcedos.a: $(OBJ_LIBCEDOS) $(OBJ_COMMON) -> $(AR) rcs $@ $^ -ifndef VERBOSE -> echo "AR $@" -endif - -.PHONY: libcedos -libcedos: $(OUT_LIBCEDOS) - - -# shell -OBJ_SHELL := $(filter $(BUILD_OBJECTS)/shell/%,$(OBJECTS)) -OUT_SHELL := $(patsubst $(BUILD_OBJECTS)/shell/%.c.o,$(BUILD_ARTIFACTS)/%,$(OBJ_SHELL)) - -SHELL_CCFLAGS += -I../libcedos/include -SHELL_LDFLAGS += -L$(BUILD_ARTIFACTS) -SHELL_LDFLAGS += -lcedos - -SHELL_LDFLAGS += -T shell/link.txt -SHELL_LDFLAGS += -Map=$(BUILD_LOGS)/$(notdir $@)_mapfile.txt -SHELL_LDFLAGS += -N - -$(BUILD_OBJECTS)/shell/%.c.o: shell/%.c -> $(CC) -c -Ishell -Ilibcedos -Icommon $(CCFLAGS) $(SHELL_CCFLAGS) -o $@ $< -ifndef VERBOSE -> echo "CC $@" -endif - -$(BUILD_ARTIFACTS)/%: $(BUILD_OBJECTS)/shell/%.c.o | $(BUILD_ARTIFACTS)/libcedos.a -> $(LD) $^ $(LDFLAGS) $(SHELL_LDFLAGS) -o $@ -ifndef VERBOSE -> echo "LD $@" -endif - -.PHONY: shell -shell: $(OUT_SHELL) - - -# disk image -$(BUILD_ARTIFACTS)/fat.img: $(filter %.bin,$(OUT_KERNEL)) $(OUT_SHELL) | $(BUILD_ARTIFACTS)/boot.bin -# > $(LD) $(OBJECTS) -r -T link.txt -Map=$(BUILD_LOGS)/elf_mapfile.txt --oformat elf32-i386 -o $@ -> dd if=/dev/zero of=$@ count=896 -> mkfs.fat -n "cedos" -S 512 -s 8 -r 64 $@ -> mkdir -p $(BUILD_MOUNT) -> sudo mount $@ $(BUILD_MOUNT) -> sudo cp $^ $(BUILD_MOUNT) -> sudo cp ./img-contents/* $(BUILD_MOUNT) || echo "No img-contents folder; Skipping." -> du -csh $(BUILD_MOUNT)/* -> sudo umount $(BUILD_MOUNT) -> rm -r $(BUILD_MOUNT) -ifndef VERBOSE -> echo "MKFS $@" -endif - -$(BUILD_ARTIFACTS)/cedos.img: $(BUILD_ARTIFACTS)/fat.img | $(MODULES) -> dd if=/dev/zero of=$@ count=904 -> parted $@ mklabel msdos -> parted $@ mkpart primary FAT32 8s 896s -s -> parted $@ set 1 boot on -> dd if=$< of=$@ seek=8 conv=notrunc -> dd bs=1 if=$(BUILD_ARTIFACTS)/boot.bin of=$@ count=446 conv=notrunc -> dd if=$(BUILD_ARTIFACTS)/boot.bin of=$@ skip=1 seek=1 count=7 conv=notrunc -> python3 binimg.py -w 256 -i $(BUILD_ARTIFACTS)/cedos.img -o $(BUILD_ARTIFACTS)/cedos.png -> parted $@ print list all -# > $(LD) $(OBJECTS) -T link.txt -Map=$(BUILD_LOGS)/bin_mapfile.txt --oformat binary --nostdlib -o $@ -ifndef VERBOSE -> echo "MKPART $@" -endif - -.PHONY: logs -logs: $(BUILD_LOGS)/base.sym $(BUILD_LOGS)/objdump.txt - -.PHONY: clean -clean: -> $(RM) -r $(CURRENT_DIR)/build/* 2> /dev/null; true - -.PHONY: run -run: -> ./run.sh $(BUILD_ARTIFACTS)/cedos.img - -.PHONY: docs -docs: -> doxygen doxygen.cfg