Skip to content

Commit c1d0240

Browse files
committed
transfer to grub multiboot2
1 parent 5d6a291 commit c1d0240

17 files changed

Lines changed: 309 additions & 828 deletions

Makefile

Lines changed: 37 additions & 248 deletions
Original file line numberDiff line numberDiff line change
@@ -1,269 +1,58 @@
1-
# ==============================================
2-
# Makefile for KintsugiOS
3-
# ==============================================
1+
ASM = nasm
2+
CC = i386-elf-gcc
3+
LD = i386-elf-ld
4+
GRUB = grub2-mkrescue
45

5-
ASM = nasm
6-
CC = i386-elf-gcc
7-
LD = i386-elf-ld
86
SRC_DIR = src
97
BIN_DIR = bin
10-
DISKIMG_DIR = diskimgs
11-
DISKIMG_NAME = kintsugi_floppy_i386.img
12-
HDDIMG_NAME = kintsugi_hdd_i386.img
13-
FAT12_HDD_NAME = kintsugi_fat12_hdd.img
14-
ISO_NAME = KintsugiOS.iso
8+
ISO_DIR = isodir
159

16-
FAT12_TEST_FILES = test_files/README.TXT
17-
TEST_FILES_DIR = test_files
10+
CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \
11+
-nostartfiles -nodefaultlibs -Wall -Wextra -ffreestanding \
12+
-g -I$(SRC_DIR)/kernel/include
1813

19-
MKISOFS = genisoimage
20-
XORRISO = xorriso
14+
ASMFLAGS_ELF = -f elf32
2115

22-
KERNEL_OFFSET = 0x007e00
16+
C_SOURCES = $(shell find $(SRC_DIR) -name '*.c')
17+
ASM_SOURCES = $(SRC_DIR)/bootloader/kernel_entry.asm \
18+
$(SRC_DIR)/kernel/multiboot.asm \
19+
$(SRC_DIR)/kernel/cpu/interrupt.asm
2320

24-
CFLAGS = -g -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -ffreestanding -I$(SRC_DIR)/kernel/include
25-
ASMFLAGS_BIN = -f bin
26-
ASMFLAGS_ELF = -f elf
27-
LDFLAGS = -Ttext $(KERNEL_OFFSET) --oformat binary
21+
C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
22+
ASM_OBJS = $(ASM_SOURCES:$(SRC_DIR)/%.asm=$(BIN_DIR)/%.o)
2823

29-
KERNEL_ENTRY = $(BIN_DIR)/bootloader/kernel_entry.o
30-
INTERRUPT_OBJ = $(BIN_DIR)/kernel/cpu/interrupt.o
24+
OBJS = $(ASM_OBJS) $(C_OBJS)
3125

32-
C_SOURCES = $(shell find $(SRC_DIR) -name '*.c')
33-
C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
26+
KERNEL_ELF = $(BIN_DIR)/kernel.elf
27+
ISO_NAME = diskimgs/KintsugiOS.iso
3428

35-
OBJS = $(KERNEL_ENTRY) $(INTERRUPT_OBJ) $(C_OBJS)
29+
all: $(ISO_NAME)
3630

37-
RED=\033[0;31m
38-
GREEN=\033[0;32m
39-
YELLOW=\033[0;33m
40-
BLUE=\033[0;34m
41-
CYAN=\033[0;36m
42-
RESET=\033[0m
43-
44-
all: $(BIN_DIR)/kintsugios.bin
45-
46-
$(BIN_DIR)/kintsugios.bin: $(BIN_DIR)/bootsector.bin $(BIN_DIR)/kernel.bin
47-
@python getversion.py __update_version 2>/dev/null || true
48-
@printf "$(BLUE)[CAT] Cat %s %-42s -> %s$(RESET)\n" "bootsector" "kernel" "$(BIN_DIR)/kintsugios.bin"
49-
@cat $^ > $@
50-
51-
$(BIN_DIR)/bootsector.bin: $(SRC_DIR)/bootloader/bootsector.asm
52-
@printf "$(CYAN)[ASM] Compiling %-50s -> %s$(RESET)\n" "bootsector.asm" "bootsector.bin"
53-
@mkdir -p $(BIN_DIR)
54-
@$(ASM) $(ASMFLAGS_BIN) $< -o $@
55-
56-
$(BIN_DIR)/kernel.bin: $(OBJS)
57-
@printf "$(BLUE)[LD] Linking %-50s -> %s$(RESET)\n" "$^" "$@"
58-
@$(LD) $(LDFLAGS) $^ -o $@
59-
60-
$(BIN_DIR)/%.o: $(SRC_DIR)/%.asm
61-
@printf "$(CYAN)[ASM] Compiling %-50s -> %s$(RESET)\n" "$<" "$@"
62-
@mkdir -p $(dir $@)
63-
@$(ASM) $(ASMFLAGS_ELF) $< -o $@
31+
$(KERNEL_ELF): $(OBJS) $(SRC_DIR)/kernel/linker.ld
32+
$(LD) -m elf_i386 -T $(SRC_DIR)/kernel/linker.ld -o $@ $(OBJS)
6433

6534
$(BIN_DIR)/%.o: $(SRC_DIR)/%.c
66-
@printf "$(CYAN)[CC] Compiling %-50s -> %s$(RESET)\n" "$<" "$@"
6735
@mkdir -p $(dir $@)
68-
@$(CC) $(CFLAGS) -c $< -o $@
69-
70-
# ==============================================
71-
# DISK IMAGES
72-
# ==============================================
73-
74-
$(DISKIMG_DIR)/$(DISKIMG_NAME): $(BIN_DIR)/kintsugios.bin
75-
@printf "$(BLUE)[IMG] Make Floppy IMG %-50s -> %s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin" "$@"
76-
@mkdir -p $(DISKIMG_DIR)
77-
@dd if=/dev/zero of=$@.tmp bs=1024 count=1440 2>/dev/null
78-
@dd if=$< of=$@.tmp conv=notrunc 2>/dev/null
79-
@mv $@.tmp $@
80-
81-
$(DISKIMG_DIR)/$(HDDIMG_NAME):
82-
@printf "$(BLUE)[IMG] Make Empty HDD IMG %-50s -> %s$(RESET)\n" "empty disk" "$@"
83-
@mkdir -p $(DISKIMG_DIR)
84-
@dd if=/dev/zero of=$@ bs=512 count=32768 2>/dev/null # 16MB disk
85-
86-
$(DISKIMG_DIR)/$(FAT12_HDD_NAME): $(BIN_DIR)/kintsugios.bin $(FAT12_TEST_FILES)
87-
@printf "$(BLUE)[FAT12] Creating FAT12 HDD image (ATA compatible)$(RESET)\n"
88-
@mkdir -p $(DISKIMG_DIR) $(TEST_FILES_DIR)
89-
90-
@dd if=/dev/zero of=$@.tmp bs=512 count=16384 2>/dev/null
91-
92-
@printf "$(YELLOW)[FAT12] Formatting as FAT12...$(RESET)\n"
93-
@if command -v mkfs.fat >/dev/null 2>&1; then \
94-
mkfs.fat -F12 $@.tmp 2>/dev/null; \
95-
elif command -v mkdosfs >/dev/null 2>&1; then \
96-
mkdosfs -F12 $@.tmp 2>/dev/null; \
97-
else \
98-
printf "$(RED)[ERROR] Need mkfs.fat or mkdosfs! Install dosfstools.$(RESET)\n"; \
99-
exit 1; \
100-
fi
101-
102-
@printf "$(YELLOW)[FAT12] Copying test files...$(RESET)\n"
103-
@if command -v mcopy >/dev/null 2>&1; then \
104-
for file in $(FAT12_TEST_FILES); do \
105-
mcopy -i $@.tmp $$file ::/ 2>/dev/null && \
106-
printf "$(GREEN)[OK] Copied $$file$(RESET)\n" || \
107-
printf "$(YELLOW)[WARN] Failed to copy $$file$(RESET)\n"; \
108-
done; \
109-
else \
110-
printf "$(YELLOW)[WARN] mcopy not found, creating empty FAT12$(RESET)\n"; \
111-
printf "$(YELLOW)[WARN] Install mtools for file copying$(RESET)\n"; \
112-
fi
113-
114-
@mv $@.tmp $@
115-
@printf "$(GREEN)[FAT12] Created HDD with FAT12: $@ $(RESET)\n"
116-
@printf "$(YELLOW)[NOTE] This is an HDD image, not floppy! Use with -hda$(RESET)\n"
117-
118-
# ==============================================
119-
# TEST FILES CREATION
120-
# ==============================================
121-
122-
$(TEST_FILES_DIR)/TEST.TXT:
123-
@mkdir -p $(TEST_FILES_DIR)
124-
@echo "Hello from KintsugiOS FAT12 Filesystem!" > $@
125-
@echo "This file was read from the HDD using ATA PIO driver." >> $@
126-
@echo "If you see this, your FAT12 implementation works!" >> $@
127-
@printf "$(GREEN)[FILE] Created $@$(RESET)\n"
128-
129-
$(TEST_FILES_DIR)/README.TXT:
130-
@mkdir -p $(TEST_FILES_DIR)
131-
@echo "KintsugiOS" > $@
132-
@echo "====================" >> $@
133-
@echo "" >> $@
134-
@echo "This is a test file on the FAT12 HDD." >> $@
135-
@echo "The HDD is accessed via ATA PIO driver." >> $@
136-
@echo "The floppy contains the OS kernel." >> $@
137-
@echo "The HDD contains the filesystem." >> $@
138-
@printf "$(GREEN)[FILE] Created $@$(RESET)\n"
139-
140-
$(TEST_FILES_DIR)/HELLO.TXT:
141-
@mkdir -p $(TEST_FILES_DIR)
142-
@echo "Hello World from FAT12!" > $@
143-
@printf "$(GREEN)[FILE] Created $@$(RESET)\n"
144-
145-
# ==============================================
146-
# ISO CREATION
147-
# ==============================================
148-
149-
check-iso-tools:
150-
@if ! command -v $(MKISOFS) >/dev/null 2>&1 && ! command -v $(XORRISO) >/dev/null 2>&1; then \
151-
echo "Error: Neither genisoimage nor xorriso found. Install one of them to create ISO."; \
152-
exit 1; \
153-
fi
36+
$(CC) $(CFLAGS) -c $< -o $@
15437

155-
$(DISKIMG_DIR)/$(ISO_NAME): $(DISKIMG_DIR)/$(DISKIMG_NAME) check-iso-tools
156-
@printf "$(BLUE)[ISO] Creating ISO image %-50s -> %s$(RESET)\n" "$(DISKIMG_DIR)/$(DISKIMG_NAME)" "$@"
157-
@if command -v $(MKISOFS) >/dev/null 2>&1; then \
158-
$(MKISOFS) -quiet -V 'KINTSUGI_OS' -input-charset iso8859-1 -o $@ -b $(DISKIMG_NAME) -hide boot.catalog -boot-load-size 4 -no-emul-boot $(DISKIMG_DIR); \
159-
elif command -v $(XORRISO) >/dev/null 2>&1; then \
160-
$(XORRISO) -as mkisofs -b $(DISKIMG_NAME) -o $@ $(DISKIMG_DIR); \
161-
fi
162-
163-
# ==============================================
164-
# PHONY TARGETS
165-
# ==============================================
166-
167-
diskimg: $(DISKIMG_DIR)/$(DISKIMG_NAME)
168-
169-
hddimg: $(DISKIMG_DIR)/$(HDDIMG_NAME)
38+
$(BIN_DIR)/%.o: $(SRC_DIR)/%.asm
39+
@mkdir -p $(dir $@)
40+
$(ASM) $(ASMFLAGS_ELF) $< -o $@
17041

171-
fat12hdd: $(DISKIMG_DIR)/$(FAT12_HDD_NAME)
42+
$(ISO_NAME): $(KERNEL_ELF)
43+
@mkdir -p $(ISO_DIR)/boot/grub
44+
@mkdir -p diskimgs
45+
cp $(KERNEL_ELF) $(ISO_DIR)/boot/kernel.elf
46+
cp src/grub.cfg $(ISO_DIR)/boot/grub/grub.cfg
47+
$(GRUB) -o $@ $(ISO_DIR)
17248

173-
iso: $(DISKIMG_DIR)/$(ISO_NAME)
49+
run: $(ISO_NAME)
50+
qemu-system-i386 -cdrom $< -m 64
17451

175-
testfiles: $(FAT12_TEST_FILES)
52+
debug: $(KERNEL_ELF)
53+
qemu-system-i386 -cdrom $(ISO_NAME) -m 64 -s -S
17654

17755
clean:
178-
@printf "$(RED)[CLEAN] Cleaning $(BIN_DIR) and $(DISKIMG_DIR)$(RESET)\n"
179-
@rm -rf $(BIN_DIR)/* $(DISKIMG_DIR)/*
180-
181-
clean_all: clean
182-
@printf "$(RED)[CLEAN] Cleaning test files$(RESET)\n"
183-
@rm -rf $(TEST_FILES_DIR)
184-
185-
# ==============================================
186-
# RUN TARGETS (QEMU)
187-
# ==============================================
188-
189-
run_bin: $(BIN_DIR)/kintsugios.bin
190-
@printf "$(GREEN)[QEMU] Run from binary %-50s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin"
191-
@qemu-system-i386 -fda $(BIN_DIR)/kintsugios.bin -m 16
192-
193-
run_fda: $(DISKIMG_DIR)/$(DISKIMG_NAME)
194-
@printf "$(GREEN)[QEMU] Run from floppy %-50s$(RESET)\n" "$<"
195-
@qemu-system-i386 -fda $< -boot a -m 16
196-
197-
run_hdd: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME)
198-
@printf "$(GREEN)[QEMU] Run with HDD %-50s$(RESET)\n" "$<"
199-
@qemu-system-i386 -fda $< -hda $(DISKIMG_DIR)/$(HDDIMG_NAME) -boot a -m 16
200-
201-
run_fat12: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(FAT12_HDD_NAME)
202-
@printf "$(GREEN)[QEMU] Running with FAT12 HDD (MAIN TEST)$(RESET)\n"
203-
@printf "$(YELLOW)[CONFIG] Floppy: boot OS, HDD: FAT12 filesystem$(RESET)\n"
204-
@qemu-system-i386 \
205-
-fda $(DISKIMG_DIR)/$(DISKIMG_NAME) \
206-
-hda $(DISKIMG_DIR)/$(FAT12_HDD_NAME) \
207-
-boot a \
208-
-m 16 \
209-
-display sdl \
210-
-name "KintsugiOS"
211-
212-
run_iso: $(DISKIMG_DIR)/$(ISO_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME)
213-
@printf "$(GREEN)[QEMU] Run ISO %-50s$(RESET)\n" "$<"
214-
@qemu-system-i386 -hda ${DISKIMG_DIR}/$(HDDIMG_NAME) -cdrom $< -boot d -m 16
215-
216-
# ==============================================
217-
# DEBUG TARGETS
218-
# ==============================================
219-
220-
debug_fda: $(DISKIMG_DIR)/$(DISKIMG_NAME)
221-
@printf "$(GREEN)[QEMU] Debug floppy %-50s$(RESET)\n" "$<"
222-
@qemu-system-i386 -fda $< -boot a -s -S -m 16
223-
224-
debug_hdd: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME)
225-
@printf "$(GREEN)[QEMU] Debug with HDD %-50s$(RESET)\n" "$<"
226-
@qemu-system-i386 -fda $< -hda $(DISKIMG_DIR)/$(HDDIMG_NAME) -boot a -s -S -m 16
227-
228-
# DEBUG with FAT12 HDD
229-
debug_fat12: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(FAT12_HDD_NAME)
230-
@printf "$(GREEN)[QEMU] Debug with FAT12 HDD %-50s$(RESET)\n"
231-
@printf "$(YELLOW)[DEBUG] Start QEMU, then connect with: gdb -ex 'target remote localhost:1234'$(RESET)\n"
232-
@qemu-system-i386 \
233-
-fda $(DISKIMG_DIR)/$(DISKIMG_NAME) \
234-
-hda $(DISKIMG_DIR)/$(FAT12_HDD_NAME) \
235-
-boot a \
236-
-s -S \
237-
-m 16
238-
239-
debug_iso: $(DISKIMG_DIR)/$(ISO_NAME)
240-
@printf "$(GREEN)[QEMU] Debug ISO %-50s$(RESET)\n" "$<"
241-
@qemu-system-i386 -cdrom $< -boot d -s -S -m 16
242-
243-
# ==============================================
244-
# QUICK COMMANDS
245-
# ==============================================
246-
247-
quick: clean all testfiles fat12hdd run_fat12
248-
249-
re: clean all run_fat12
250-
251-
info:
252-
@echo "=== KintsugiOS Disk Images ==="
253-
@echo "Floppy (boot): $(DISKIMG_DIR)/$(DISKIMG_NAME)"
254-
@echo "Empty HDD: $(DISKIMG_DIR)/$(HDDIMG_NAME)"
255-
@echo "FAT12 HDD: $(DISKIMG_DIR)/$(FAT12_HDD_NAME)"
256-
@echo "ISO: $(DISKIMG_DIR)/$(ISO_NAME)"
257-
@echo ""
258-
@echo "=== Useful Commands ==="
259-
@echo "make run_fat12 - Run with FAT12 HDD (main test)"
260-
@echo "make quick - Clean, build, create FAT12, run"
261-
@echo "make debug_fat12 - Debug with FAT12 HDD"
262-
@echo "make testfiles - Create test files only"
263-
@echo "make fat12hdd - Create FAT12 HDD only"
56+
rm -rf $(BIN_DIR) $(ISO_DIR) diskimgs/
26457

265-
.PHONY: all diskimg hddimg fat12hdd iso testfiles \
266-
clean clean_all \
267-
run_bin run_fda run_hdd run_fat12 run_iso \
268-
debug_fda debug_hdd debug_fat12 debug_iso \
269-
check-iso-tools quick re info
58+
.PHONY: all run debug clean

install-dev.sh

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
detect_os() {
6+
if [ -f /etc/os-release ]; then
7+
. /etc/os-release
8+
case "$ID" in
9+
debian|ubuntu) OS="debian" ;;
10+
fedora) OS="fedora" ;;
11+
arch) OS="arch" ;;
12+
*) echo "Unsupported OS: $ID"; exit 1 ;;
13+
esac
14+
else
15+
echo "Cannot detect OS"; exit 1
16+
fi
17+
}
18+
19+
install_packages() {
20+
case "$OS" in
21+
debian)
22+
sudo apt-get update
23+
sudo apt-get install -y nasm qemu-system-x86 bochs bochs-x gdb grub2 xorriso mtools python3 python3-pip
24+
pip3 install pyelftools
25+
;;
26+
fedora)
27+
sudo dnf install -y nasm qemu-system-x86 bochs gdb grub2 xorriso mtools python3 python3-pip
28+
pip3 install pyelftools
29+
;;
30+
arch)
31+
sudo pacman -S --noconfirm nasm qemu bochs gdb grub xorriso mtools python python-pip
32+
pip install pyelftools
33+
;;
34+
esac
35+
}
36+
37+
setup_toolchain() {
38+
TOOLCHAIN_DIR="toolchain"
39+
TOOLCHAIN_FILE="i386-elf-15.1.0-Linux-x86_64.tar.gz"
40+
TOOLCHAIN_URL="https://github.com/lordmilko/i686-elf-tools/releases/download/15.1.0/$TOOLCHAIN_FILE"
41+
42+
if [ ! -d "$TOOLCHAIN_DIR/i386-elf-15.1.0-Linux-x86_64/bin" ]; then
43+
mkdir -p "$TOOLCHAIN_DIR"
44+
wget -O "$TOOLCHAIN_DIR/$TOOLCHAIN_FILE" "$TOOLCHAIN_URL"
45+
tar -xzf "$TOOLCHAIN_DIR/$TOOLCHAIN_FILE" -C "$TOOLCHAIN_DIR"
46+
rm "$TOOLCHAIN_DIR/$TOOLCHAIN_FILE"
47+
fi
48+
}
49+
50+
main() {
51+
detect_os
52+
echo "Installing packages for $OS..."
53+
install_packages
54+
echo "Setting up cross-compiler toolchain..."
55+
setup_toolchain
56+
TOOLCHAIN_PATH="$PWD/$TOOLCHAIN_DIR/i386-elf-15.1.0-Linux-x86_64/bin"
57+
echo "Environment ready for KintsugiOS development!"
58+
echo "Run this command to add toolchain to PATH:"
59+
echo "export PATH=\"$TOOLCHAIN_PATH:\$PATH\""
60+
}
61+
62+
main "$@"

isodir/boot/grub/grub.cfg

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
set timeout=3
2+
set default=0
3+
4+
menuentry "KintsugiOS" {
5+
insmod multiboot2
6+
multiboot2 /boot/kernel.elf
7+
boot
8+
}

0 commit comments

Comments
 (0)