]> git.dujemihanovic.xyz Git - nameless-os.git/commitdiff
Refactor Makefile, linker script, properly set up stack
authorDuje Mihanović <duje.mihanovic@skole.hr>
Sat, 7 May 2022 14:11:19 +0000 (16:11 +0200)
committerDuje Mihanović <duje.mihanovic@skole.hr>
Sat, 7 May 2022 15:04:35 +0000 (17:04 +0200)
.gitignore
Makefile
kernel/entry.s
kernel/kernel.c
kernel/linker.ld

index a45d17d6224885d66151001745629c3025c1f0b7..9fc5bb791de04c0037818d3ffd4aa4f55db8b732 100644 (file)
@@ -4,3 +4,4 @@ boot/x86/boot
 **/*.o
 **/*.bin
 **/*.elf
+**/*.dbg
index 738fb0c89192daa87e3ca2a3c2e65e1b6a43fcd7..8ffcdf86123bb9b1acee0fe0ab3746d4d339cfbb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -7,24 +7,24 @@ GIT_REV = $(shell git rev-parse --short HEAD)
 CFLAGS = -std=gnu89 -g -Iinclude/arch/x86 -ffreestanding -DGIT_COMMIT=\"$(GIT_REV)\"
 
 KERNEL_OBJ = kernel/entry.o kernel/arch/x86/tty/tty.o kernel/drivers/irq/i8259a.o kernel/arch/x86/irq/idt.o kernel/arch/x86/irq/sample_handler.o kernel/kernel.o
+BOOTLOADER_OBJ = boot/x86/mbr boot/x86/vbr-fat32 boot/x86/stage3/LOADER.BIN
 
 default: kernel/kernel.elf bootloader
 
 all: default boot/x86/disk.img
 
-bootloader: boot/x86/mbr boot/x86/vbr-fat32 boot/x86/stage3/LOADER.BIN
+bootloader: $(BOOTLOADER_OBJ)
 
 run: all
        $(QEMU) boot/x86/disk.img
 
 boot/x86/mbr: boot/x86/mbr.s
-       $(MAKE) -C boot/x86
 boot/x86/vbr-fat32: boot/x86/vbr-fat32.s boot/x86/fat32/*.s 
-       $(MAKE) -C boot/x86
 boot/x86/stage3/LOADER.BIN: boot/x86/stage3/*.s boot/x86/fat32/*.s
+$(BOOTLOADER_OBJ):
        $(MAKE) -C boot/x86
 
-boot/x86/disk.img: boot/x86/mbr boot/x86/vbr-fat32 boot/x86/stage3/LOADER.BIN boot/x86/disk.dump 
+boot/x86/disk.img: boot/x86/mbr boot/x86/vbr-fat32 boot/x86/stage3/LOADER.BIN boot/x86/disk.dump kernel/kernel.bin
        truncate -s1G boot/x86/disk.img
        sfdisk boot/x86/disk.img < boot/x86/disk.dump
        mkfs.fat -F 32 --offset 2048 boot/x86/disk.img
@@ -33,20 +33,23 @@ boot/x86/disk.img: boot/x86/mbr boot/x86/vbr-fat32 boot/x86/stage3/LOADER.BIN bo
        mcopy -i boot/x86/disk.img@@1M boot/x86/stage3/LOADER.BIN ::.
        mcopy -i boot/x86/disk.img@@1M kernel/kernel.bin ::./KERNEL.BIN
 
-kernel/kernel.bin: ${KERNEL_OBJ}
+kernel/kernel.bin: ${KERNEL_OBJ} kernel/linker.ld
        $(CC) -ffreestanding -nostdlib -o $@ -T kernel/linker.ld ${KERNEL_OBJ}
 
 kernel/entry.o: kernel/entry.s
-       $(AS) -f elf kernel/entry.s -o $@
+       $(AS) -f elf $< -o $@
 
 kernel/arch/x86/irq/sample_handler.o: kernel/arch/x86/irq/sample_handler.c
-       $(CC) $(CFLAGS) -mgeneral-regs-only -c kernel/arch/x86/irq/sample_handler.c -o $@
+       $(CC) $(CFLAGS) -mgeneral-regs-only -c $< -o $@
 
 kernel/kernel.elf: kernel/kernel.bin
        $(CC) -ffreestanding -nostdlib -o $@ -T kernel/linker.ld ${KERNEL_OBJ} -Wl,--oformat=elf32-i386
+       i686-elf-objcopy --only-keep-debug kernel/kernel.elf kernel/kernel.dbg
+       i686-elf-objcopy --add-gnu-debuglink=kernel/kernel.dbg kernel/kernel.elf
+       i686-elf-strip --strip-unneeded kernel/kernel.elf
 
 clean:
-       -rm kernel/kernel.bin kernel/kernel.elf ${KERNEL_OBJ}
+       -rm kernel/kernel.{bin,dbg,elf} ${KERNEL_OBJ}
        cd boot/x86 && $(MAKE) clean
 
 .PHONY: default all clean run bootloader
index a02df92d4703df4ada20654b433158c80ee1373f..10c95e8985955184b0b8f0afde73f5c99c692d13 100644 (file)
@@ -1,12 +1,11 @@
-; when our kernel source has functions before _start and we blindly transfer control to the beginning
-; of the kernel binary, it will wrongly execute the other functions
-; the solution is to link a small assembly routine (this) which executes a known label within the kernel
-; so that this routine comes before the kernel in the resulting binary
-; we cannot link the boot sector code and the kernel because the former needs to be a raw binary, while the
-; kernel is compiled into an ELF object file which contains some metadata on the kernel code
+bits 32
+extern kmain
+extern __STACK_BOTTOM__
 
-       bits 32 ; this is started in protected mode
-       extern _start ; the known label in the kernel source we will execute is, well, not in this assembly routine
-
-       call _start ; call the known label
-       jmp $ ; it should never return, but hang forever if it does
+global _start
+_start:
+       mov ebp, __STACK_BOTTOM__
+       mov esp, ebp
+       call kmain
+       hlt
+       jmp $-1
index e1a0df5158f3b06bfd44e8693db172d431737dbf..4c6efd8692da90d7ab15cf782846b3194e9483f7 100644 (file)
@@ -9,7 +9,7 @@ extern void keyb_handler(struct interrupt_frame *frame);
 struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
 struct idtr idtr __attribute__((aligned(0x10)));
 
-void _start(void)
+void kmain(void)
 {
        screen_clear();
        kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
index 59d0381af92cf1bf95859357d31b9e2d63b6a11f..645a82421029a638d8ea58a86e8282852af09936 100644 (file)
@@ -4,8 +4,29 @@ OUTPUT_FORMAT(binary)
 SECTIONS
 {
        . = 0x100000;
+       __KERNEL_BASE__ = .;
 
-       .text : ALIGN(0x1000) { *(.text) }
-       .data : ALIGN(0x1000) { *(.data) }
-       .bss : ALIGN(0x1000) { *(.bss) }
+       .text : ALIGN(4K) { 
+               kernel/entry.o (.text)
+               *(.text) 
+       }
+       .rodata : ALIGN(4K) { *(.rodata) }
+
+       /* .rodata is put after .text so that the read-only entry in the program
+        * header covers .rodata as well. When .rodata is after .data, that entry
+        * only covers .text, leaving .rodata in the writable program header
+        * entry. The problem with this approach is that the program header
+        * entry where .text and .rodata are is marked as executable, which
+        * would mean that .rodata should be executable too, but that doesn't
+        * matter yet because we (currently) assume that the NX bit is not
+        * supported anyway. */
+
+       .data : ALIGN(4K) { *(.data) }
+       .bss : ALIGN(4K) { 
+               *(.bss)
+               /* Reserving 16KiB for the stack. A __STACK_TOP__ is not really
+                * needed (yet). */
+               . += 16K; 
+               __STACK_BOTTOM__ = .;
+       }
 }