diff --git a/Makefile b/Makefile index 8394c48..6dd2b68 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,35 @@ BUILD_DIR=build SRC_DIR=src + FAT=mkfs.fat ASM=nasm -CC=/home/novice/opt/cross/bin/i686-elf-gcc -LD=/home/novice/opt/cross/bin/i686-elf-ld -LIBGCC_PATH= /home/novice/opt/cross/lib/gcc/i686-elf/13.3.0 + +# LLVM toolchain +CC=clang +LD=ld.lld + +# Target architecture +TARGET=i686-elf + +# Compiler flags +CFLAGS=--target=$(TARGET) -ffreestanding -nostdlib -fno-stack-protector -m32 +LDFLAGS=-m elf_i386 + LIB_DIR=$(abspath $(SRC_DIR)/lib/) export FAT export ASM export CC export LD -export LIBGCC_PATH +export TARGET +export CFLAGS +export LDFLAGS export LIB_DIR -# + +# ---------------------- # disk image -# +# ---------------------- disk_image: $(BUILD_DIR)/main.img @@ -24,24 +37,27 @@ $(BUILD_DIR)/main.img: lib bootloader kernel chmod +x make_disk.sh ./make_disk.sh $@ 52428800 $(BUILD_DIR) -# + +# ---------------------- # bootable usb -# +# ---------------------- bootable_usb: lib bootloader kernel chmod +x make_bootable_usb.sh ./make_bootable_usb.sh $(BUILD_DIR) -# + +# ---------------------- # lib -# +# ---------------------- lib: $(MAKE) -C $(LIB_DIR) BUILD_DIR=$(abspath $(BUILD_DIR)) -# + +# ---------------------- # Bootloader -# +# ---------------------- bootloader: stage1 stage2 @@ -51,12 +67,27 @@ stage1: stage2: $(MAKE) -C $(SRC_DIR)/bootloader/stage2/ BUILD_DIR=$(abspath $(BUILD_DIR)) + +# ---------------------- +# Kernel +# ---------------------- + kernel: $(MAKE) -C $(SRC_DIR)/kernel/ BUILD_DIR=$(abspath $(BUILD_DIR)) + +# ---------------------- +# Run in emulator +# ---------------------- + run: disk_image chmod +x run.sh ./run.sh + +# ---------------------- +# Clean +# ---------------------- + clean: rm -rf build/* \ No newline at end of file diff --git a/run.sh b/run.sh index dcd8804..04ed5dd 100755 --- a/run.sh +++ b/run.sh @@ -1 +1 @@ -qemu-system-i386 -debugcon stdio -m 64M -hda build/main.img \ No newline at end of file +qemu-system-i386 -debugcon stdio -m 64M -hda build/main.img \ No newline at end of file diff --git a/src/bootloader/stage1/Makefile b/src/bootloader/stage1/Makefile index 49202ad..20e2497 100644 --- a/src/bootloader/stage1/Makefile +++ b/src/bootloader/stage1/Makefile @@ -1,17 +1,17 @@ -BUILD_DIR?=build +BUILD_DIR ?= build -ASM?=nasm -ASMFLAGS= -f elf +ASM ?= nasm +ASMFLAGS ?= -f bin # flat binary for stage1 -LIBGCC_PATH?=/home/novice/cross/i686-elf/lib/gcc/i686-elf/14.2.0 -CC?=/home/novice/cross/i686-elf/bin/i686-elf-gcc -CFLAG=-ffreestanding -nostdlib -std=c99 -g -I $(abspath $(LIBGCC_PATH)) - -LD?=/home/novice/cross/i686-elf/bin/i686-elf-ld -LDFLAG=-T linker.ld -nostdlib -L $(LIBGCC_PATH) +# LLVM toolchain (for later C stages) +CC ?= clang +LD ?= ld.lld +TARGET ?= i686-elf +# Stage1 target stage1: $(BUILD_DIR)/bootloader.bin $(BUILD_DIR)/bootloader.bin: boot.asm - @$(ASM) boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin - @echo "--> Created: bootloader.bin" \ No newline at end of file + @mkdir -p $(@D) + @$(ASM) $(ASMFLAGS) boot.asm -o $(BUILD_DIR)/bootloader.bin + @echo "--> Created: bootloader.bin" \ No newline at end of file diff --git a/src/bootloader/stage2/Makefile b/src/bootloader/stage2/Makefile index 8a0ee23..1a8a0b2 100644 --- a/src/bootloader/stage2/Makefile +++ b/src/bootloader/stage2/Makefile @@ -4,37 +4,45 @@ LIB_DIR?=lib ASM?=nasm ASMFLAGS= -f elf -LIBGCC_PATH?=/home/novice/cross/i686-elf/lib/gcc/i686-elf/14.2.0 -CC?=/home/novice/cross/i686-elf/bin/i686-elf-gcc -CFLAG=-ffreestanding -nostdlib -std=c99 -g -I $(LIB_DIR) +# LLVM toolchain +CC?=clang +LD?=ld.lld +TARGET=i686-elf -LD?=/home/novice/cross/i686-elf/bin/i686-elf-ld -LDFLAG=-T linker.ld -nostdlib -L $(LIBGCC_PATH) +CFLAG=--target=$(TARGET) -ffreestanding -nostdlib -std=c99 -g -m32 -fno-stack-protector -I $(LIB_DIR) + +LDFLAG=-T linker.ld -nostdlib -m elf_i386 SOURCES_C=$(wildcard *.c) SOURCES_ASM=$(wildcard *.asm) -OBJECTS_C=$(patsubst %.c, $(BUILD_DIR)/bootloader/c/%.obj, $(SOURCES_C)) -OBJECTS_ASM=$(patsubst %.asm, $(BUILD_DIR)/bootloader/asm/%.obj, $(SOURCES_ASM)) -LIB_OBJECT = $(wildcard $(BUILD_DIR)/lib/*.obj) \ - $(wildcard $(BUILD_DIR)/lib/*/*.obj) \ - $(wildcard $(BUILD_DIR)/lib/*/*/*.obj) \ - $(wildcard $(BUILD_DIR)/lib/*/*/*/*.obj) \ +OBJECTS_C=$(patsubst %.c,$(BUILD_DIR)/bootloader/c/%.obj,$(SOURCES_C)) +OBJECTS_ASM=$(patsubst %.asm,$(BUILD_DIR)/bootloader/asm/%.obj,$(SOURCES_ASM)) + +LIB_OBJECT = \ + $(wildcard $(BUILD_DIR)/lib/*.obj) \ + $(wildcard $(BUILD_DIR)/lib/*/*.obj) \ + $(wildcard $(BUILD_DIR)/lib/*/*/*.obj) \ + $(wildcard $(BUILD_DIR)/lib/*/*/*/*.obj) + stage2: $(BUILD_DIR)/boot0.bin + $(BUILD_DIR)/boot0.bin: $(OBJECTS_ASM) $(OBJECTS_C) @mkdir -p $(@D) - @$(LD) $(LDFLAG) -o $@ $^ $(LIB_OBJECT) -lgcc -Map $(BUILD_DIR)/boot0.map + @$(LD) $(LDFLAG) -o $@ $^ $(LIB_OBJECT) -Map $(BUILD_DIR)/boot0.map @echo "--> Created: boot0.bin" + $(BUILD_DIR)/bootloader/c/%.obj: %.c @mkdir -p $(@D) @$(CC) $(CFLAG) -c $< -o $@ @echo "--> Compiled: " $< + $(BUILD_DIR)/bootloader/asm/%.obj: %.asm @mkdir -p $(@D) @$(ASM) $(ASMFLAGS) -o $@ $< - @echo "--> Compiled: " $< + @echo "--> Compiled: " $< \ No newline at end of file diff --git a/src/kernel/Makefile b/src/kernel/Makefile index e75c550..b1492d8 100644 --- a/src/kernel/Makefile +++ b/src/kernel/Makefile @@ -4,13 +4,15 @@ LIB_DIR?=lib ASM?=nasm ASMFLAGS= -f elf -LIBGCC_PATH?=/home/novice/cross/i686-elf/lib/gcc/i686-elf/14.2.0 -CC?=/home/novice/cross/i686-elf/bin/i686-elf-gcc -CFLAG=-ffreestanding -nostdlib -std=c99 -g -I include -I $(abspath $(LIB_DIR)) +# LLVM toolchain +CC?=clang +LD?=ld.lld +TARGET=i686-elf -LD?=/home/novice/cross/i686-elf/bin/i686-elf-ld -LDFLAG=-T linker.ld -nostdlib -L $(LIBGCC_PATH) -LDFLAG-ELF=-T linker-elf.ld -nostdlib -L $(LIBGCC_PATH) +CFLAG=--target=$(TARGET) -ffreestanding -nostdlib -std=c99 -g -m32 -fno-stack-protector -I include -I $(abspath $(LIB_DIR)) + +LDFLAG=-T linker.ld -nostdlib -m elf_i386 +LDFLAG-ELF=-T linker-elf.ld -nostdlib -m elf_i386 HEADERS_C = $(wildcard *.h) \ @@ -33,38 +35,47 @@ HEADERS_ASM = $(wildcard *.inc) \ SOURCES_ASM = $(wildcard *.asm) \ $(wildcard */*.asm) \ $(wildcard */*/*.asm) \ - $(wildcard */*/*/*.asm) \ + $(wildcard */*/*/*.asm) OBJECTS_C = $(patsubst %.c, $(BUILD_DIR)/kernel/c/%.obj, $(SOURCES_C)) - OBJECTS_ASM = $(patsubst %.asm, $(BUILD_DIR)/kernel/asm/%.obj, $(SOURCES_ASM)) LIB_OBJECT = $(wildcard $(BUILD_DIR)/lib/*.obj) \ $(wildcard $(BUILD_DIR)/lib/*/*.obj) \ $(wildcard $(BUILD_DIR)/lib/*/*/*.obj) \ - $(wildcard $(BUILD_DIR)/lib/*/*/*/*.obj) \ + $(wildcard $(BUILD_DIR)/lib/*/*/*/*.obj) kernel: isr_generator $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/kernel.elf + isr_generator: @sed -i 's/\r//' hal/isr_generator.sh @./hal/isr_generator.sh hal/isrs_gen.c hal/isrs_gen.inc @echo "--> Generating: hal/isrs_gen.c hal/isrs_gen.inc" + $(BUILD_DIR)/kernel/c/%.obj: %.c $(HEADERS_C) @mkdir -p $(@D) - @$(CC) $(CFLAG) -c $< -o $@ + @$(CC) $(CFLAG) -c $< -o $@ @echo "--> Compiled: " $< + $(BUILD_DIR)/kernel/asm/%.obj: %.asm $(HEADERS_ASM) @mkdir -p $(@D) @$(ASM) $(ASMFLAGS) -o $@ $< @echo "--> Compiled: " $< -$(BUILD_DIR)/kernel.bin: $(OBJECTS_ASM) $(OBJECTS_C) - @$(LD) $(LDFLAG) -o $@ $^ $(LIB_OBJECT) -lgcc -Map $(BUILD_DIR)/kernel.map - @echo "--> Created: kernel.bin" + +# Step 1: build ELF +$(BUILD_DIR)/kernel.elf: $(OBJECTS_ASM) $(OBJECTS_C) + @$(LD) $(LDFLAG-ELF) -o $@ $^ $(LIB_OBJECT) -Map $(BUILD_DIR)/kernel.map + @echo "--> Created: kernel.elf" + +# Step 2: generate flat binary from ELF +$(BUILD_DIR)/kernel.bin: $(BUILD_DIR)/kernel.elf + @llvm-objcopy -O binary $< $@ + @echo "--> Created: kernel.bin" $(BUILD_DIR)/kernel.elf: $(OBJECTS_ASM) $(OBJECTS_C) - @$(LD) $(LDFLAG-ELF) -o $@ $^ $(LIB_OBJECT) -lgcc - @echo "--> Created: kernel.elf (for debugging)" + @$(LD) $(LDFLAG-ELF) -o $@ $^ $(LIB_OBJECT) + @echo "--> Created: kernel.elf (for debugging)" \ No newline at end of file diff --git a/src/lib/Makefile b/src/lib/Makefile index 76441ca..05db3f0 100644 --- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -1,17 +1,16 @@ BUILD_DIR?=build ASM?=nasm -ASMFLAGS= -f elf +ASMFLAGS=-f elf32 -LIBGCC_PATH?=/home/novice/cross/i686-elf/lib/gcc/i686-elf/14.2.0 -CC?=/home/novice/cross/i686-elf/bin/i686-elf-gcc -CFLAG=-ffreestanding -nostdlib -std=c99 -g -I $(abspath $(LIBGCC_PATH)) +# LLVM toolchain +CC?=clang +TARGET=i686-elf -LD?=/home/novice/cross/i686-elf/bin/i686-elf-ld -LDFLAG=-T linker.ld -nostdlib -L $(LIBGCC_PATH) +CFLAG=--target=$(TARGET) -m32 -ffreestanding -nostdlib -fno-stack-protector -fno-pic -std=c99 -g SOURCES_C=$(wildcard *.c) -OBJECTS_C=$(patsubst %.c, $(BUILD_DIR)/lib/c/%.obj, $(SOURCES_C)) +OBJECTS_C=$(patsubst %.c,$(BUILD_DIR)/lib/c/%.obj,$(SOURCES_C)) lib: $(OBJECTS_C) diff --git a/src/lib/compiler_rt.c b/src/lib/compiler_rt.c new file mode 100644 index 0000000..8ba43fc --- /dev/null +++ b/src/lib/compiler_rt.c @@ -0,0 +1,17 @@ +#include + +uint64_t __udivdi3(uint64_t n, uint64_t d) { + uint64_t q = 0; + while (n >= d) { + n -= d; + q++; + } + return q; +} + +uint64_t __umoddi3(uint64_t n, uint64_t d) { + while (n >= d) { + n -= d; + } + return n; +} \ No newline at end of file