feat(boot+shell): add bootable disk image, unified scheduler and interactive user-space shell

- Implement Limine v8 boot protocol requests in dedicated PT_LOAD RW segment
- Configure IOPL=3 and SSE in arch setup for Ring 3 drivers and libc
- Unify scheduler context switching via switch_to and preempt_tick
- Support dual-source keyboard/serial input in sys_key_read
- Add automated 'make image' and 'make run' targets for instant QEMU launch
- Complete interactive UNIX-like shell (osh) with built-in commands & ramdisk
This commit is contained in:
RarDog
2026-09-02 19:47:57 +03:00
parent ca3555bd09
commit eed05c1eca
17 changed files with 452 additions and 217 deletions
+71 -24
View File
@@ -18,11 +18,12 @@ LIB_DIR := lib
HAL_DIR := hal
SERVERS_DIR := servers
KERNEL_DIR := kernel
ISO_DIR := $(BUILD_DIR)/iso_root
LIMINE_DIR := boot/limine
# Common Freestanding Flags
COMMON_FLAGS := -Wall -Wextra -O2 -ffreestanding -fno-stack-protector \
-fno-pie -no-pie -mno-red-zone -m64 \
-mno-sse -mno-sse2 -mno-avx \
-I$(INCLUDE_DIR) -I$(LIB_DIR)/libc/include
CFLAGS := $(COMMON_FLAGS) -std=c11
@@ -35,18 +36,20 @@ INIT_SERVER := $(BUILD_DIR)/init_server.elf
UART_DRIVER := $(BUILD_DIR)/uart_driver.elf
SH_SERVER := $(BUILD_DIR)/sh.elf
PROCMGR := $(BUILD_DIR)/procmgr.elf
DISK_IMG := $(BUILD_DIR)/opencoreC.img
LIBC_OBJS := $(BUILD_DIR)/string.o $(BUILD_DIR)/syscalls.o $(BUILD_DIR)/stdlib.o
.PHONY: all kernel libc hal servers iso run clean help
.PHONY: all kernel libc hal servers image run clean help limine-setup
all: kernel libc hal servers
@mkdir -p $(BUILD_DIR)
@cp $(KERNEL_BIN) $(KERNEL_ELF)
@echo "======================================================="
@echo " [SUCCESS] opencoreC Skeleton Build Complete!"
@echo " [SUCCESS] opencoreC Build Complete!"
@echo " Kernel: $(KERNEL_ELF)"
@echo " Servers: $(INIT_SERVER), $(UART_DRIVER), $(SH_SERVER), $(PROCMGR)"
@echo " Servers: $(INIT_SERVER), $(UART_DRIVER), $(SH_SERVER)"
@echo " Run: make image && make run"
@echo "======================================================="
kernel:
@@ -90,25 +93,60 @@ servers: libc hal
@$(LD) -T $(CONFIG_DIR)/user.ld -nostdlib -static -o $(PROCMGR) \
$(BUILD_DIR)/procmgr_main.o $(BUILD_DIR)/ipc.o $(LIBC_OBJS)
# Staging Limine Boot ISO directory
iso: all
@mkdir -p $(ISO_DIR)/boot $(ISO_DIR)/EFI/BOOT
@cp $(KERNEL_ELF) $(ISO_DIR)/boot/
@cp $(INIT_SERVER) $(ISO_DIR)/boot/
@cp $(UART_DRIVER) $(ISO_DIR)/boot/
@cp $(SH_SERVER) $(ISO_DIR)/boot/
@cp limine.conf $(ISO_DIR)/boot/limine.conf
@cp limine.cfg $(ISO_DIR)/boot/limine.cfg
@echo "[ISO] Staged boot files in $(ISO_DIR)/"
# Download and build the Limine bootloader host tool
limine-setup:
@if [ ! -d "$(LIMINE_DIR)" ]; then \
echo "[LIMINE] Cloning Limine v8 binary branch..."; \
git clone https://github.com/limine-bootloader/limine.git --branch=v8.x-binary --depth=1 $(LIMINE_DIR); \
fi
@echo "[LIMINE] Building host installer tool..."
@$(MAKE) -C $(LIMINE_DIR) limine
run: all
@echo "[QEMU] Launching opencoreC in QEMU (SMP 4 Cores, Serial stdio)..."
@$(QEMU) -M q35 -smp 4 -m 512M \
-serial stdio \
-display none \
# Build a 64 MiB bootable FAT32 disk image with Limine BIOS/UEFI
image: all limine-setup
@echo "[IMAGE] Creating bootable disk image (64 MiB FAT32)..."
@dd if=/dev/zero of=$(DISK_IMG) bs=1M count=64 2>/dev/null
@parted -s $(DISK_IMG) mklabel msdos mkpart primary fat32 2048s 100% set 1 boot on 2>/dev/null
@mformat -F -i $(DISK_IMG)@@1M ::
@mmd -i $(DISK_IMG)@@1M ::/boot ::/EFI ::/EFI/BOOT
@# Kernel and userspace servers
@mcopy -i $(DISK_IMG)@@1M $(KERNEL_ELF) ::/boot/
@mcopy -i $(DISK_IMG)@@1M $(INIT_SERVER) ::/boot/
@mcopy -i $(DISK_IMG)@@1M $(UART_DRIVER) ::/boot/
@mcopy -i $(DISK_IMG)@@1M $(SH_SERVER) ::/boot/
@# Bootloader config
@mcopy -i $(DISK_IMG)@@1M limine.conf ::/
@mcopy -i $(DISK_IMG)@@1M limine.cfg ::/
@mcopy -i $(DISK_IMG)@@1M limine.conf ::/boot/
@mcopy -i $(DISK_IMG)@@1M limine.cfg ::/boot/
@# Limine bootloader files
@mcopy -i $(DISK_IMG)@@1M $(LIMINE_DIR)/limine-bios.sys ::/
@mcopy -i $(DISK_IMG)@@1M $(LIMINE_DIR)/limine-bios.sys ::/boot/
@mcopy -i $(DISK_IMG)@@1M $(LIMINE_DIR)/BOOTX64.EFI ::/EFI/BOOT/
@# Install Limine Stage 1 into MBR
@$(LIMINE_DIR)/limine bios-install $(DISK_IMG) 2>&1 | grep -v "^Physical\|^Installing\|^Stage\|^Reminder"
@echo "[IMAGE] Done: $(DISK_IMG) (BIOS + UEFI bootable)"
# Launch QEMU with serial terminal (keyboard works via -serial stdio)
run: image
@echo "[QEMU] Launching opencoreC (SMP 4 cores, Serial terminal)..."
@echo "[QEMU] Type 'help' for commands. Ctrl+A X to exit QEMU."
@echo "-------------------------------------------------------"
@$(QEMU) \
-M q35 \
-smp 4 \
-m 512M \
-serial mon:stdio \
-no-reboot \
-no-shutdown \
-kernel $(KERNEL_ELF)
-display none \
-drive file=$(DISK_IMG),format=raw
# Run without rebuilding image (faster iteration)
qemu: $(DISK_IMG)
@echo "[QEMU] Quick launch from existing image..."
@echo "[QEMU] Type 'help'. Ctrl+A X to exit."
@$(QEMU) -M q35 -smp 4 -m 512M -serial mon:stdio -no-reboot -display none \
-drive file=$(DISK_IMG),format=raw
clean:
@echo "[CLEAN] Removing build directory and cargo target..."
@@ -116,7 +154,16 @@ clean:
help:
@echo "opencoreC Microkernel Build System"
@echo ""
@echo "Targets:"
@echo " make all - Build kernel, HAL, libc, and all user servers"
@echo " make run - Launch QEMU with SMP 4 Cores & Serial output"
@echo " make clean - Clean build artifacts"
@echo " make all - Build kernel, HAL, libc, and all user servers"
@echo " make image - Create bootable disk image (build/opencoreC.img)"
@echo " make run - Build image and launch in QEMU (interactive serial)"
@echo " make qemu - Quick relaunch without rebuild"
@echo " make limine-setup - Download/build Limine bootloader"
@echo " make clean - Remove all build artifacts"
@echo ""
@echo "QEMU Controls:"
@echo " Type commands in the terminal (serial I/O)"
@echo " Ctrl+A then X -> exit QEMU"
@echo " Ctrl+A then C -> QEMU monitor"