refactor: rewrite kernel's make script
authorMinep <lunaixsky@qq.com>
Thu, 20 Jul 2023 21:07:37 +0000 (22:07 +0100)
committerMinep <lunaixsky@qq.com>
Thu, 20 Jul 2023 21:07:37 +0000 (22:07 +0100)
fix: change linking script to match rewrited kernel makefile
fix: some recent exposed issues.

21 files changed:
lunaix-os/GRUB_TEMPLATE
lunaix-os/arch/i386/boot.S [moved from lunaix-os/arch/x86/boot.S with 97% similarity]
lunaix-os/arch/i386/hhk.c [moved from lunaix-os/arch/x86/hhk.c with 98% similarity]
lunaix-os/includes/hal/cpu.h
lunaix-os/includes/lunaix/common.h
lunaix-os/includes/lunaix/mm/page.h
lunaix-os/includes/usr/lunaix/signal_defs.h
lunaix-os/kernel.mk [new file with mode: 0644]
lunaix-os/kernel/asm/x86/pfault.c
lunaix-os/kernel/block/blkpart_gpt.c
lunaix-os/kernel/proc0.c
lunaix-os/kernel/process/signal.c
lunaix-os/link/linker.ld
lunaix-os/makefile
lunaix-os/makefile.ker [deleted file]
lunaix-os/makeinc/os.mkinc
lunaix-os/makeinc/qemu.mkinc
lunaix-os/makeinc/toolchain.mkinc
lunaix-os/uprog/includes/ld/elf.h [deleted file]
lunaix-os/usr/init/init.c
lunaix-os/usr/libc/makefile

index 02c932ffb40e7ed26db7d7f3e17e1817348c8650..d2dcc10e0f54ee10101a1cf6c3368994b7565ae4 100644 (file)
@@ -2,5 +2,5 @@ default=0
 timeout=0
 
 menuentry "$_OS_NAME" {
-       multiboot /boot/$_OS_NAME.bin
+       multiboot /boot/kernel.bin
 }
\ No newline at end of file
similarity index 97%
rename from lunaix-os/arch/x86/boot.S
rename to lunaix-os/arch/i386/boot.S
index d1d14ba7e8af8ded3708aab9aa81fb330d65f62a..f6550cde788b5920bd924c78f0496237f735ad3d 100644 (file)
@@ -1,7 +1,7 @@
 #define __ASM__ 1
 #include <arch/x86/boot/multiboot.h>
 
-#define MB_FLAGS    MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN
+#define MB_FLAGS    (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN)
 #define KPG_SIZE    10*4096
 
 .section .multiboot
similarity index 98%
rename from lunaix-os/arch/x86/hhk.c
rename to lunaix-os/arch/i386/hhk.c
index 49221222d3cb47a2b0285806475a37ca47ffcec3..a9cb814a8931ee7ee03548a7b986306c2ef65747 100644 (file)
@@ -85,6 +85,9 @@ _init_page(ptd_t* ptd)
     for (u32_t i = 0; i < kernel_pg_counts; i++) {
         // FIXME: 只是用作用户模式(R3)测试!
         //        在实际中,内核代码除了极少部分需要暴露给R3(如从信号返回),其余的应为R0。
+
+#warning "fixme: kernel pages should not be user-accessable"
+
         SET_PTE(ptd,
                 PG_TABLE_KERNEL,
                 kernel_pte_index + i,
index 93805d8b981d4220feba2d1d9d6269ff2428de00..694d678afd52d5a7a5388d5056c42d02f12e092c 100644 (file)
@@ -60,6 +60,14 @@ cpu_rcr3()
     return val;
 }
 
+static inline reg32
+cpu_rcr4()
+{
+    ptr_t val;
+    asm volatile("movl %%cr4,%0" : "=r"(val));
+    return val;
+}
+
 static inline reg32
 cpu_reflags()
 {
index 4b2880c4b31ae2ce701c1e7cf763366172fd5690..c9ef9e4671dda33d2307dd0ca40005e07a819b6f 100644 (file)
@@ -25,6 +25,8 @@
 #define KCODE_SEG 0x08
 #define KDATA_SEG 0x10
 
+#define KSIZE (MEM_4MB * 16)
+
 #define USTACK_SIZE MEM_4MB
 #define USTACK_TOP 0x9ffffff0
 #define USTACK_END (0x9fffffff - USTACK_SIZE + 1)
index 099bf13094fe982a5f47bdb0f412aca2bb1a09ae..9afb2ed1c9abc63e7f418955dd3729b95c83aa1a 100644 (file)
@@ -100,7 +100,7 @@ extern void __pg_mount_point;
 
 /* 四个页挂载点,两个页目录挂载点: 用于临时创建&编辑页表 */
 #define PG_MOUNT_RANGE(l1_index) (701 <= l1_index && l1_index <= 703)
-#define VMS_MOUNT_1 (KERNEL_MM_BASE + MEM_4MB)
+#define VMS_MOUNT_1 (KERNEL_MM_BASE + KSIZE)
 #define PG_MOUNT_BASE (VMS_MOUNT_1 + MEM_4MB)
 #define PG_MOUNT_1 (PG_MOUNT_BASE)
 #define PG_MOUNT_2 (PG_MOUNT_BASE + 0x1000)
index ac102ab3c8160611d57c30ae63c0e18a7afd98ff..0bd3e7051bb0a4c99cdfbd347a7e657de86850f5 100644 (file)
@@ -1,14 +1,16 @@
 #ifndef __LUNAIX_SYS_SIGNAL_DEFS_H
 #define __LUNAIX_SYS_SIGNAL_DEFS_H
 
-#define SIGSEGV 1
-#define SIGALRM 2
-#define SIGCHLD 3
+#define SIGALRM 1
+#define SIGCHLD 2
 #define SIGCLD SIGCHLD
-#define SIGINT 4
-#define SIGKILL 5
-#define SIGSTOP 6
-#define SIGCONT 7
+
+#define SIGSTOP 3
+#define SIGCONT 4
+
+#define SIGINT 5
+#define SIGSEGV 6
+#define SIGKILL 7
 #define SIGTERM 8
 
 #define SIG_BLOCK 1
diff --git a/lunaix-os/kernel.mk b/lunaix-os/kernel.mk
new file mode 100644 (file)
index 0000000..81e8921
--- /dev/null
@@ -0,0 +1,44 @@
+include os.mkinc
+include toolchain.mkinc
+
+define ksrc_dirs
+       kernel
+       hal
+       debug
+       libs
+       arch/$(ARCH)
+endef
+
+define kinc_dirs
+       includes
+       includes/usr
+endef
+
+
+kbin_dir := $(BUILD_DIR)
+kbin := $(BUILD_NAME)
+
+ksrc_files := $(foreach f, $(ksrc_dirs), $(shell find $(f) -name "*.[cS]"))
+ksrc_objs := $(addsuffix .o,$(ksrc_files))
+
+kinc_opts := $(addprefix -I,$(kinc_dirs))
+
+
+CFLAGS += -include flags.h
+
+%.S.o: %.S
+       $(call status_,AS,$<)
+       @$(CC) $(kinc_opts) -c $< -o $@
+
+%.c.o: %.c
+       $(call status_,CC,$<)
+       @$(CC) $(CFLAGS) $(kinc_opts) -c $< -o $@
+
+$(kbin): $(ksrc_objs) $(kbin_dir)
+       $(call status_,LD,$@)
+       @$(CC) -T link/linker.ld -o $(kbin) $(ksrc_objs) $(LDFLAGS)
+
+all: $(kbin)
+
+clean:
+       @rm -f $(ksrc_objs)
\ No newline at end of file
index 0d5a6fa661b908d901e625a5911f61dddabd6f3a..70d5e560da7a145ca1b154f9e52cafd749e38d26 100644 (file)
@@ -28,6 +28,7 @@ __print_panic_msg(const char* msg, const isr_param* param);
 void
 intr_routine_page_fault(const isr_param* param)
 {
+    uint32_t errcode = param->execp->err_code;
     ptr_t ptr = cpu_rcr2();
     if (!ptr) {
         goto segv_term;
@@ -50,6 +51,11 @@ intr_routine_page_fault(const isr_param* param)
         goto segv_term;
     }
 
+    if ((errcode & PG_ALLOW_USER)) {
+        // invalid access
+        goto segv_term;
+    }
+
     volatile x86_pte_t* pte = &PTE_MOUNTED(VMS_SELF, ptr >> 12);
     if (PG_IS_PRESENT(*pte)) {
         if ((hit_region->attr & COW_MASK) == COW_MASK) {
@@ -78,7 +84,7 @@ intr_routine_page_fault(const isr_param* param)
                 goto oom;
             }
 
-            *pte = *pte | pa | PG_PRESENT;
+            *pte = *pte | pa | PG_PRESENT | PG_ALLOW_USER;
             memset((void*)PG_ALIGN(ptr), 0, PG_SIZE);
             goto resolved;
         }
@@ -101,7 +107,7 @@ intr_routine_page_fault(const isr_param* param)
         }
 
         cpu_invplg((ptr_t)pte);
-        *pte = (*pte & 0xFFF) | pa | PG_PRESENT;
+        *pte = (*pte & 0xFFF) | pa | PG_PRESENT | PG_ALLOW_USER;
 
         memset((void*)ptr, 0, PG_SIZE);
 
@@ -128,13 +134,17 @@ intr_routine_page_fault(const isr_param* param)
 
 oom:
     kprintf(KERROR "out of memory\n");
+
 segv_term:
-    kprintf(KERROR "(pid: %d) Segmentation fault on %p (%p:%p)\n",
+    kprintf(KERROR "(pid: %d) Segmentation fault on %p (%p:%p,e=0x%x)\n",
             __current->pid,
             ptr,
             param->execp->cs,
-            param->execp->eip);
+            param->execp->eip,
+            param->execp->err_code);
+
     __SIGSET(__current->sig_pending, _SIGSEGV);
+
     schedule();
     // should not reach
     while (1)
index 85c87e7e51e5a973d99fb08d60587e0c6f2eac12..0bc977df9ea901f4801ca66cd120a9f6e3665a8a 100644 (file)
@@ -46,7 +46,8 @@ blkpart_parse(struct device* master, struct gpt_header* header)
         }
 
         // Convert UEFI's 512B LB representation into local LBA range.
-        u64_t slba_local = (ent->start_lba * GPT_BLKSIZE) / bdev->blk_size;
+        u64_t slba_local =
+          (ent->start_lba * GPT_BLKSIZE) / (u64_t)bdev->blk_size;
         u64_t elba_local = (ent->end_lba * GPT_BLKSIZE) / (u64_t)bdev->blk_size;
 
         kprintf("%s: guid part#%d: %d..%d\n",
index 379ebf53b87b591fa07a84be0d3bbffee7300253..bb9b3d9293e0d784774c4321170951923154029d 100644 (file)
@@ -68,7 +68,7 @@ exec_initd()
 {
     int errno = 0;
 
-    if ((errno = exec_kexecve("/mnt/lunaix-os/usr/init", NULL, NULL))) {
+    if ((errno = exec_kexecve("/mnt/lunaix-os/usr/bin/init", NULL, NULL))) {
         goto fail;
     }
 
index 9e46976e36440e17ceb23b2a05a10e4a9c5cc6f5..d12c62e176e8f1d3800a3345e94f672aa93a26d3 100644 (file)
@@ -9,22 +9,8 @@
 
 extern struct scheduler sched_ctx; /* kernel/sched.c */
 
-extern void
-_exit(int status);
-
-void __USER__
-default_sighandler_term(int signum)
-{
-    _exit(signum);
-}
-
-void* default_handlers[_SIG_NUM] = {
-    // TODO: 添加默认handler
-    [_SIGINT] = default_sighandler_term,
-    [_SIGTERM] = default_sighandler_term,
-    [_SIGKILL] = default_sighandler_term,
-    [_SIGSEGV] = default_sighandler_term,
-};
+static u32_t term_sigs =
+  (1 << SIGSEGV) | (1 << SIGINT) | (1 << SIGKILL) | (1 << SIGTERM);
 
 // Referenced in kernel/asm/x86/interrupt.S
 void*
@@ -46,13 +32,12 @@ signal_dispatch()
         return 0;
     }
 
-    // TODO: SIG{INT|TERM|KILL|SEGV} should have highest priority.
-    //       Terminate the process right here if any of unmaskable signal is
-    //       set.
-
-    if (!__current->sig_handler[sig_selected] &&
-        !default_handlers[sig_selected]) {
-        // 如果该信号没有handler,则忽略
+    if (!__current->sig_handler[sig_selected]) {
+        if ((term_sigs & (1 << sig_selected))) {
+            terminate_proc(sig_selected);
+            schedule();
+            // never return
+        }
         return 0;
     }
 
@@ -95,11 +80,6 @@ signal_dispatch()
     sig_ctx->sig_num = sig_selected;
     sig_ctx->signal_handler = __current->sig_handler[sig_selected];
 
-    if (!sig_ctx->signal_handler) {
-        // 如果没有用户自定义的Handler,则使用系统默认Handler。
-        sig_ctx->signal_handler = default_handlers[sig_selected];
-    }
-
     __SIGSET(__current->sig_inprogress, sig_selected);
 
     return sig_ctx;
index 7ea0804fe2d604444b3824e0d6fa258aa66e2289..4ea6b4eecb72d755e225800c1bdb59d6bc3753bf 100644 (file)
@@ -14,20 +14,20 @@ SECTIONS {
 
     .hhk_init_text BLOCK(4K) : {
         * (.multiboot)
-        build/obj/arch/x86/*.o (.hhk_init)
-        build/obj/arch/x86/*.o (.text)
+        arch/*.o (.hhk_init)
+        arch/*.o (.text)
     }
 
     .hhk_init_bss BLOCK(4K) : {
-        build/obj/arch/x86/*.o (.bss)
+        arch/*.o (.bss)
     }
 
     .hhk_init_data BLOCK(4K) : {
-        build/obj/arch/x86/*.o (.data)
+        arch/*.o (.data)
     }
 
     .hhk_init_rodata BLOCK(4K) : {
-        build/obj/arch/x86/*.o (.rodata)
+        arch/*.o (.rodata)
     }
     __init_hhk_end = ALIGN(4K);
 
@@ -37,33 +37,41 @@ SECTIONS {
     /* 好了,我们的内核…… */
     .text BLOCK(4K) : AT ( ADDR(.text) - 0xC0000000 ) {
         __kernel_start = .;
-        build/obj/kernel/*.o (.text)
-        build/obj/hal/*.o (.text)
+        kernel/*.o (.text)
+        hal/*.o (.text)
+        debug/*.o (.text)
+        libs/*.o (.text)
     }
 
     __usrtext_start = ALIGN(4K);
     .usrtext BLOCK(4K) : AT ( ADDR(.usrtext) - 0xC0000000 ) {
-        build/obj/kernel/*.o (.usrtext)
+        * (.usrtext)
     }
     __usrtext_end = ALIGN(4K);
 
-    .data BLOCK(4k) : AT ( ADDR(.data) - 0xC0000000 ) {
-        build/obj/kernel/*.o (.data)
-        build/obj/hal/*.o (.data)
+    .data BLOCK(4K) : AT ( ADDR(.data) - 0xC0000000 ) {
+        kernel/*.o (.data)
+        hal/*.o (.data)
+        debug/*.o (.data)
+        libs/*.o (.data)
     }
 
     .rodata BLOCK(4K) : AT ( ADDR(.rodata) - 0xC0000000 ) {
-        build/obj/kernel/*.o (.rodata)
-        build/obj/hal/*.o (.rodata)
+        kernel/*.o (.rodata)
+        hal/*.o (.rodata)
+        debug/*.o (.rodata)
+        libs/*.o (.rodata)
     }
 
     .kpg BLOCK(4K) : AT ( ADDR(.kpg) - 0xC0000000 ) {
-        build/obj/arch/x86/*.o (.kpg)
+        arch/*.o (.kpg)
     }
 
     .bss BLOCK(4K) : AT ( ADDR(.bss) - 0xC0000000 ) {
-        build/obj/kernel/*.o (.bss)
-        build/obj/hal/*.o (.bss)
+        kernel/*.o (.bss)
+        hal/*.o (.bss)
+        debug/*.o (.bss)
+        libs/*.o (.bss)
     }
 
     __kernel_end = ALIGN(4K);
index c1c800ccb68797a7630e44b7c62de4e4b1cddd35..bb105d4d808e53ee79bf8a2c79adb9bb8a55ea1b 100644 (file)
@@ -1,10 +1,24 @@
-include config/make-locations
-include config/make-os
-include config/make-cc
-include config/make-debug-tool
+mkinc_dir := $(CURDIR)/makeinc
+
+include $(mkinc_dir)/os.mkinc
+include $(mkinc_dir)/toolchain.mkinc
+include $(mkinc_dir)/qemu.mkinc
+include $(mkinc_dir)/utils.mkinc
+
+
+ARCH ?= i386
+export ARCH
 
 DEPS := $(CC) $(LD) $(AR) xorriso grub-mkrescue
 
+kbuild_dir := build
+kbin_dir := $(kbuild_dir)/bin
+os_img_dir := $(kbuild_dir)/img
+
+os_build_tag := $(OS_NAME)_$(ARCH)_$(OS_VER)
+kbin := $(kbin_dir)/kernel.bin
+kimg := $(kbuild_dir)/$(os_build_tag).iso
+
 $(DEPS):
        @echo -n "checking $@ .... "
        @if which $@ > /dev/null; then \
@@ -17,50 +31,55 @@ check-cc:
        @echo -n "checking target i686-elf.... "
        @test "`i686-elf-gcc -dumpmachine`" = "i686-elf" && echo ok || (echo "failed" && exit 1)
 
-$(OBJECT_DIR):
-       @mkdir -p $(OBJECT_DIR)
+$(kbuild_dir):
+       @mkdir -p $(kbin_dir)
+       @mkdir -p $(os_img_dir)
+       @mkdir -p $(os_img_dir)/boot
+       @mkdir -p $(os_img_dir)/boot/grub
+       @mkdir -p $(os_img_dir)/usr
 
-$(BIN_DIR):
-       @mkdir -p $(BIN_DIR)
+export BUILD_DIR=$(kbuild_dir)
+export BUILD_NAME=$(kbin)
+$(kbin):
+       $(call status,TASK,$(notdir $@))
+       @$(MAKE) $(MKFLAGS) -I $(mkinc_dir) -f kernel.mk all
 
-$(USR_DIR):
-       @mkdir -p $(USR_DIR)
+$(kimg): usr/build $(kbin)
+       $(call status,TASK,$(notdir $@))
+       @./config-grub.sh ${OS_NAME} $(os_img_dir)/boot/grub/grub.cfg
+       @cp -r usr/build/* $(os_img_dir)/usr
+       @cp $(kbin) $(os_img_dir)/boot
+       @grub-mkrescue -o $(kimg) $(os_img_dir) -- -volid "$(OS_ID) $(OS_VER)" -system_id "$(OS_NAME)"
 
-$(ISO_DIR):
-       @mkdir -p $(ISO_DIR)
-       @mkdir -p $(ISO_BOOT_DIR)
-       @mkdir -p $(ISO_GRUB_DIR)
+usr/build: user
 
 check: $(DEPS) check-cc GRUB_TEMPLATE
 
-prepare: check $(OBJECT_DIR) $(BIN_DIR) $(ISO_DIR) $(USR_DIR)
-
-usrlib: prepare makefile.usr
-       @make -f makefile.usr usr-runtime
+prepare: check $(os_img_dir)
 
-usrlib-debug: prepare makefile.usr
-       @make -f makefile.usr usr-runtime-debug
+export BUILD_MODE=release
+bootable: $(kbuild_dir) $(kimg)
 
-usr-prog: prepare usrlib makefile.prog
-       @make -f makefile.prog all
+export BUILD_MODE=debug
+bootable-debug: $(kbuild_dir) $(kimg)
 
-bootable: usr-prog usrlib makefile.ker
-       @make -f makefile.ker all
-
-bootable-debug: usr-prog usrlib-debug makefile.ker
-       @make -f makefile.ker all-debug
+user:
+       $(call status,$@)
+       @$(MAKE) $(MKFLAGS) -C usr all -I $(mkinc_dir)
 
 all: bootable
 
 instable: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT) -D__LUNAIXOS_DEBUG__
 instable: all
 
-all-debug: clean bootable-debug
-       @echo "Dumping the disassembled kernel code to $(BUILD_DIR)/kdump.txt"
-       @i686-elf-objdump -S $(BIN_DIR)/$(OS_BIN) > $(BUILD_DIR)/kdump.txt
+all-debug: bootable-debug
+       @echo "Dumping the disassembled kernel code to $(kbuild_dir)/kdump.txt"
+       @i686-elf-objdump -S $(kbin) > $(kbuild_dir)/kdump.txt
 
 clean:
-       @rm -rf $(BUILD_DIR) || exit 1
+       @rm -rf $(kbuild_dir) || exit 1
+       @$(MAKE) -C usr clean -I $(mkinc_dir)
+       @$(MAKE) -f kernel.mk clean -I $(mkinc_dir)
 
 run: $(BUILD_DIR)/$(OS_ISO)
        @qemu-system-i386 $(QEMU_OPTIONS)
@@ -68,14 +87,14 @@ run: $(BUILD_DIR)/$(OS_ISO)
        @telnet 127.0.0.1 $(QEMU_MON_PORT)
 
 debug-qemu: all-debug
-       @i686-elf-objcopy --only-keep-debug $(BIN_DIR)/$(OS_BIN) $(BUILD_DIR)/kernel.dbg
-       @qemu-system-i386 $(QEMU_OPTIONS)
+       @i686-elf-objcopy --only-keep-debug $(kbin) $(kbuild_dir)/kernel.dbg
+       @qemu-system-i386 $(call get_qemu_options,$(kimg))
        @sleep 1
        @$(QEMU_MON_TERM) -- telnet 127.0.0.1 $(QEMU_MON_PORT)
        @gdb -s $(BUILD_DIR)/kernel.dbg -ex "target remote localhost:1234"
 
 debug-qemu-vscode: all-debug
-       @i686-elf-objcopy --only-keep-debug $(BIN_DIR)/$(OS_BIN) $(BUILD_DIR)/kernel.dbg
+       @i686-elf-objcopy --only-keep-debug $(kbin) $(kbuild_dir)/kernel.dbg
        @qemu-system-i386 $(QEMU_OPTIONS)
        @sleep 0.5
        @telnet 127.0.0.1 $(QEMU_MON_PORT)
@@ -85,4 +104,4 @@ debug-bochs: all-debug
 
 debug-metal: 
        @printf "@cmc" > $(PORT)
-       @gdb -s $(BUILD_DIR)/kernel.dbg -ex "target remote $(PORT)"
\ No newline at end of file
+       @gdb -s $(kbuild_dir)/kernel.dbg -ex "target remote $(PORT)"
\ No newline at end of file
diff --git a/lunaix-os/makefile.ker b/lunaix-os/makefile.ker
deleted file mode 100644 (file)
index 05dcc13..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-include config/make-os
-include config/make-cc
-include config/make-debug-tool
-include config/make-locations
-
-SRC_DIRS := kernel \
-                       hal \
-                       debug \
-                       libs \
-                       arch \
-
-SRC_FILES := $(foreach f, $(SRC_DIRS), $(shell find $(f) -name "*.[cS]"))
-
-OBJS := $(foreach f, $(SRC_FILES), $(OBJECT_DIR)/$(f).o)
-
-$(OBJECT_DIR)/%.S.o: %.S
-       @mkdir -p $(@D)
-       @echo "  CC    $<"
-       @$(CC) $(INCLUDES) -c $< -o $@
-
-$(OBJECT_DIR)/%.c.o: %.c 
-       @mkdir -p $(@D)
-       @echo "  CC    $<"
-       @$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
-
-$(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(OBJS)
-       @echo "  LD    $(BIN_DIR)/$(OS_BIN)"
-       @$(CC) -T link/linker.ld -o $(BIN_DIR)/$(OS_BIN) $(OBJS) $(BIN_DIR)/$(USR_LIB) $(LDFLAGS)
-
-$(BUILD_DIR)/$(OS_ISO): $(BIN_DIR)/$(OS_BIN)
-       @./config-grub.sh ${OS_NAME} $(ISO_GRUB_DIR)/grub.cfg
-       @cp $(BIN_DIR)/$(OS_BIN) $(ISO_BOOT_DIR)
-       @cp -r $(USR_DIR) $(ISO_DIR)
-       @grub-mkrescue -o $(BUILD_DIR)/$(OS_ISO) $(ISO_DIR) -- -volid "$(OS_ID) $(OS_VER)" -system_id "$(OS_NAME)"
-
-all: $(BUILD_DIR)/$(OS_ISO)
-
-all-debug: O := -Og
-all-debug: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT) -D__LUNAIXOS_DEBUG__
-all-debug: LDFLAGS := -g -ffreestanding $(O) -nostdlib -lgcc
-all-debug: all
\ No newline at end of file
index 1a8ac152adaacd8acd06faad807e6406dac9dbbf..d1f0a7b59a0e5f441e360c872c9b5495039c9e30 100644 (file)
@@ -1,18 +1,5 @@
-OS_ARCH := x86
 OS_NAME := lunaix
 OS_ID := LunaixOS
 OS_VER := dev$(shell date +%Y%m%d)
-OS_BIN := $(OS_NAME).bin
-OS_ISO := $(OS_NAME).iso
-
-USR_LIB := liblxusrt.a
-
-BUILD_DIR := build
-KERNEL_DIR := kernel
-OBJECT_DIR := $(BUILD_DIR)/obj
-BIN_DIR := $(BUILD_DIR)/bin
-ISO_DIR := $(BUILD_DIR)/iso
-ISO_BOOT_DIR := $(ISO_DIR)/boot
-ISO_GRUB_DIR := $(ISO_BOOT_DIR)/grub
 
 INCLUDES := -Iincludes -Iincludes/usr
\ No newline at end of file
index 25c99c03cc439bad133226cefe5dda9d3eaa1edb..85fd982d892a2f710ae1d8debbca0c2048710c3d 100644 (file)
@@ -1,7 +1,7 @@
 QEMU_MON_TERM := gnome-terminal
 QEMU_MON_PORT := 45454
 
-QEMU_OPTIONS := -s -S -m 1G \
+get_qemu_options = -s -S -m 1G \
                                -rtc base=utc \
                                -no-reboot \
                                -machine q35 \
@@ -10,7 +10,7 @@ QEMU_OPTIONS := -s -S -m 1G \
                                -d trace:ide_dma_cb \
                                -serial tcp::12345,server,nowait\
                                -drive id=disk,file="machine/disk0.vdi",if=none \
-                               -drive id=cdrom,file="$(BUILD_DIR)/$(OS_ISO)",readonly=on,if=none,format=raw \
+                               -drive id=cdrom,file="$(1)",readonly=on,if=none,format=raw \
                                -device ahci,id=ahci \
                                -device ide-hd,drive=disk,bus=ahci.0 \
                                -device ide-cd,drive=cdrom,bus=ahci.1 \
index 42fae9fa3dfc36c517946950fd5b0cb259dcb9b4..9496c5c15c1bd17d8f3fe36a210dad3ebadb19fc 100644 (file)
@@ -23,7 +23,15 @@ OFLAGS := -fno-gcse\
                  -fno-inline-small-functions \
                  -fno-indirect-inlining
 
-CFLAGS := -std=gnu99 -ffreestanding $(O) $(OFLAGS) $(W) $(ARCH_OPT)
+CFLAGS := -std=gnu99 -ffreestanding $(OFLAGS) $(W) $(ARCH_OPT)
+
+ifeq ($(BUILD_MODE),debug)
+       O = -Og
+       CFLAGS += -g
+endif
+
+CFLAGS += $(O)
+
 LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
 
 MKFLAGS := --no-print-directory
\ No newline at end of file
diff --git a/lunaix-os/uprog/includes/ld/elf.h b/lunaix-os/uprog/includes/ld/elf.h
deleted file mode 100644 (file)
index c699605..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef __LUNAIX_LD_ELF_H
-#define __LUNAIX_LD_ELF_H
-
-typedef unsigned int elf32_ptr_t;
-typedef unsigned short elf32_hlf_t;
-typedef unsigned int elf32_off_t;
-typedef unsigned int elf32_swd_t;
-typedef unsigned int elf32_wrd_t;
-
-#define ET_NONE 0
-#define ET_EXEC 2
-#define ET_DYN 3
-
-#define PT_LOAD 1
-#define PT_DYNAMIC 2
-#define PT_INTERP 3
-
-#define PF_X 0x1
-#define PF_W 0x2
-#define PF_R 0x4
-
-#define EM_NONE 0
-#define EM_386 3
-
-#define EV_CURRENT 1
-
-// [0x7f, 'E', 'L', 'F']
-#define ELFMAGIC 0x464c457fU
-#define ELFCLASS32 1
-#define ELFCLASS64 2
-#define ELFDATA2LSB 1
-#define ELFDATA2MSB 2
-
-#define EI_CLASS 4
-#define EI_DATA 5
-
-struct elf32_ehdr
-{
-  unsigned char e_ident[16];
-  elf32_hlf_t e_type;
-  elf32_hlf_t e_machine;
-  elf32_wrd_t e_version;
-  elf32_ptr_t e_entry;
-  elf32_off_t e_phoff;
-  elf32_off_t e_shoff;
-  elf32_wrd_t e_flags;
-  elf32_hlf_t e_ehsize;
-  elf32_hlf_t e_phentsize;
-  elf32_hlf_t e_phnum;
-  elf32_hlf_t e_shentsize;
-  elf32_hlf_t e_shnum;
-  elf32_hlf_t e_shstrndx;
-};
-
-struct elf32_phdr
-{
-  elf32_wrd_t p_type;
-  elf32_off_t p_offset;
-  elf32_ptr_t p_va;
-  elf32_ptr_t p_pa;
-  elf32_wrd_t p_filesz;
-  elf32_wrd_t p_memsz;
-  elf32_wrd_t p_flags;
-  elf32_wrd_t p_align;
-};
-
-#endif /* __LUNAIX_ELF_H */
index 7e1785a4948f985740f6de49ae832c16464fa95d..e9f8a405d07894479be8acbed12d7f43a9205c09 100644 (file)
@@ -28,12 +28,16 @@ main(int argc, const char** argv)
 
     pid_t pid;
     if (!(pid = fork())) {
-        err = execve("/usr/sh", NULL, NULL);
+        err = execve("/usr/bin/signal_demo", NULL, NULL);
         printf("fail to execute (%d)\n", errno);
         _exit(err);
     }
 
-    waitpid(pid, NULL, 0);
+    waitpid(pid, &err, 0);
+
+    if (err) {
+        printf("shell exit abnormally (%d)", err);
+    }
 
     return 0;
 }
\ No newline at end of file
index 3d976cb7a0685a92605e0969cb917c3fd438e70a..41abc18d7eabf5fa33c9f5382c44504d1a8981a7 100644 (file)
@@ -32,7 +32,7 @@ $(BUILD_DIR):
        @$(CC) $(CFLAGS) $(libc_include_opt) $(global_include_opt) -c $< -o $@
 
 %.S.o: %.S
-       @$(call status_,CC,$@)
+       @$(call status_,AS,$@)
        @$(CC) $(libc_include_opt) $(global_include_opt) -c $< -o $@
 
 $(build_lib)/$(BUILD_NAME): $(obj_files)