From 1c8e37f63d413a559825020289178d442537449e Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Fri, 2 Jan 2026 10:09:37 +0800 Subject: dev(sell): add simple libc and implement shell please see the log for detail. --- Makefile | 71 ++++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 17 deletions(-) (limited to 'Makefile') diff --git a/Makefile b/Makefile index 715fff8..51366d5 100644 --- a/Makefile +++ b/Makefile @@ -12,14 +12,28 @@ CFLAGS := -Wall -Wextra -O2 -g -ffreestanding -nostdlib -mcmodel=medany -Iincl CXXFLAGS := $(CFLAGS) -fno-exceptions -fno-rtti -fno-use-cxa-atexit LINKER_SCRIPT := linker.ld -UPROGS_SRC := $(SRC_DIR)/user/init.cc -UPROGS_OBJ := $(BUILD_DIR)/user/entry.o $(BUILD_DIR)/user/init.o -ULIB_OBJ := $(BUILD_DIR)/user/usys.o USER_LD := $(SRC_DIR)/user/user.ld +ULIB_OBJS := $(BUILD_DIR)/user/entry.o \ + $(BUILD_DIR)/user/usys.o \ + $(BUILD_DIR)/ulib/stdio.o \ + $(BUILD_DIR)/ulib/stdlib.o \ + $(BUILD_DIR)/ulib/string.o \ + $(BUILD_DIR)/ulib/cxx.o \ + $(BUILD_DIR)/ulib/iostream.o + INITCODE_BIN := $(BUILD_DIR)/user/initcode -SRCS_S := $(shell find $(SRC_DIR) -name "*.S" -not -path "$(SRC_DIR)/user/*") -SRCS_CXX := $(shell find $(SRC_DIR) -name "*.cc" -not -path "$(SRC_DIR)/user/*") +SH_SRC := $(SRC_DIR)/user/sh.cc +SH_OBJ := $(BUILD_DIR)/user/sh.o +SH_BIN := $(BUILD_DIR)/user/sh + +INIT_SRC := $(SRC_DIR)/user/init.cc +INIT_OBJ := $(BUILD_DIR)/user/init.o +INIT_BIN := $(BUILD_DIR)/user/init + +SRCS_S := $(shell find $(SRC_DIR) -name "*.S" -not -path "$(SRC_DIR)/user/*" -not -path "$(SRC_DIR)/ulib/*") +SRCS_CXX := $(shell find $(SRC_DIR) -name "*.cc" -not -path "$(SRC_DIR)/user/*" -not -path "$(SRC_DIR)/ulib/*") + OBJS := $(SRCS_S:%.S=$(BUILD_DIR)/%.o) $(SRCS_CXX:%.cc=$(BUILD_DIR)/%.o) TARGET := $(BUILD_DIR)/kernel.elf @@ -29,26 +43,47 @@ QEMUOPTS += -device virtio-blk-device,drive=x0 -global virtio-mmio.force-legacy= .PHONY: all clean run debug -all: $(TARGET) +all: $(TARGET) fs.img + +$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.c + @mkdir -p $(dir $@) + @echo " ULIB_C $<" + @$(CC) $(CFLAGS) -c $< -o $@ + +$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.cc + @mkdir -p $(dir $@) + @echo " ULIB_CC $<" + @$(CXX) $(CXXFLAGS) -c $< -o $@ + +$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.cpp + @mkdir -p $(dir $@) + @echo " ULIB_CPP $<" + @$(CXX) $(CXXFLAGS) -c $< -o $@ $(BUILD_DIR)/user/%.o: $(SRC_DIR)/user/%.cc @mkdir -p $(dir $@) - @echo " U_CXX $<" + @echo " USER_CC $<" @$(CXX) $(CXXFLAGS) -c $< -o $@ $(BUILD_DIR)/user/%.o: $(SRC_DIR)/user/%.S @mkdir -p $(dir $@) - @echo " U_AS $<" + @echo " USER_AS $<" @$(CC) $(CFLAGS) -c $< -o $@ -$(INITCODE_BIN): $(UPROGS_OBJ) $(ULIB_OBJ) $(USER_LD) + +$(INITCODE_BIN): $(BUILD_DIR)/user/init.o $(ULIB_OBJS) $(USER_LD) @echo " U_LD $@" - @$(LD) -T $(USER_LD) -o $@.out $(UPROGS_OBJ) $(ULIB_OBJ) + @$(LD) -T $(USER_LD) -o $@.out $(BUILD_DIR)/user/init.o $(ULIB_OBJS) @$(OBJCOPY) -S -O binary $@.out $@ @$(OBJDUMP) -S $@.out > $@.asm +$(SH_BIN): $(SH_OBJ) $(ULIB_OBJS) $(USER_LD) + @echo " SH_LD $@" + @$(LD) -T $(USER_LD) -o $@ $(SH_OBJ) $(ULIB_OBJS) + @$(OBJDUMP) -S $@ > $@.asm + $(TARGET): $(OBJS) $(LINKER_SCRIPT) - @echo " LD $@" + @echo " K_LD $@" @$(LD) -T $(LINKER_SCRIPT) -o $@ $(OBJS) $(BUILD_DIR)/src/kernel/initcode.o: $(SRC_DIR)/kernel/initcode.S $(INITCODE_BIN) @@ -58,19 +93,21 @@ $(BUILD_DIR)/src/kernel/initcode.o: $(SRC_DIR)/kernel/initcode.S $(INITCODE_BIN) $(BUILD_DIR)/%.o: %.S @mkdir -p $(dir $@) - @echo " AS $<" + @echo " K_AS $<" @$(CC) $(CFLAGS) -c $< -o $@ $(BUILD_DIR)/%.o: %.cc @mkdir -p $(dir $@) - @echo " CXX $<" + @echo " K_CXX $<" @$(CXX) $(CXXFLAGS) -c $< -o $@ -fs.img: - @echo " IMG Generating fs.img (1MB)" - @dd if=/dev/zero of=fs.img bs=1M count=1 2>/dev/null +fs.img: $(SH_BIN) + @echo " IMG Generating fs.img (FAT32)" + @dd if=/dev/zero of=fs.img bs=1M count=32 2>/dev/null + @mkfs.vfat -F 32 fs.img >/dev/null + @mcopy -i fs.img $(SH_BIN) ::/sh -run: $(TARGET) fs.img +run: $(TARGET) fs.img @echo " QEMU Running..." @qemu-system-riscv64 -machine virt -nographic \ -kernel $(TARGET) -m 128M $(QEMUOPTS) -- cgit v1.2.3