Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 43 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,47 +1,63 @@
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

$(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

Expand All @@ -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/*
2 changes: 1 addition & 1 deletion run.sh
Original file line number Diff line number Diff line change
@@ -1 +1 @@
qemu-system-i386 -debugcon stdio -m 64M -hda build/main.img
qemu-system-i386 -debugcon stdio -m 64M -hda build/main.img
22 changes: 11 additions & 11 deletions src/bootloader/stage1/Makefile
Original file line number Diff line number Diff line change
@@ -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"
@mkdir -p $(@D)
@$(ASM) $(ASMFLAGS) boot.asm -o $(BUILD_DIR)/bootloader.bin
@echo "--> Created: bootloader.bin"
34 changes: 21 additions & 13 deletions src/bootloader/stage2/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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: " $<
41 changes: 26 additions & 15 deletions src/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand All @@ -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)"
13 changes: 6 additions & 7 deletions src/lib/Makefile
Original file line number Diff line number Diff line change
@@ -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)

Expand Down
17 changes: 17 additions & 0 deletions src/lib/compiler_rt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <stdint.h>

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;
}