commit a1cd4b7fc7a060a817c404ca38994a604035281d from: Benjamin Stürz date: Thu Oct 03 22:08:31 2024 UTC sys: complete rewrite with better linking commit - 0d35c07dfc7e6b341aadc64a253738b6285b9e6a commit + a1cd4b7fc7a060a817c404ca38994a604035281d blob - e342091e9697412790341e858ea9b0617d74aedd blob + 24455900f3df544d1a38de611ffa601f0a9fb02a --- cc/irc/.gitignore +++ cc/irc/.gitignore @@ -1,3 +1,4 @@ *.swp +*.core irc test.asm blob - 8343815d60afa69b4a0d8da66581b71e26aced45 blob + 51f794e345e354781f7566c0a4d659cd6aa7de07 --- sys/Makefile +++ sys/Makefile @@ -1,15 +1,27 @@ -.SUFFIXES: .asm .bin +.SUFFIXES: .asm .o +LDFLAGS = -s --no-pie -all: floppy.img +OBJ = loader.o kernel.o +IMG = floppy1440.img + +all: ${IMG} + +xxd: ${IMG} + xxd ${IMG} | less + clean: - rm -f floppy.img *.bin + rm -f *.o *.elf *.img -run: floppy.img - qemu-system-i386 -M pc -m 4M -fda floppy.img +run: ${IMG} + qemu-system-i386 -M pc -m 1M -fda ${IMG} -floppy.img: loader.bin kern.bin - cat loader.bin kern.bin > floppy.img +floppy1440.img: sys.elf + objcopy -O binary --pad-to $$((2880 * 512)) sys.elf floppy1440.img -.asm.bin: - nasm -fbin -o $@ $< +sys.elf: linker.ld ${OBJ} + ld -o $@ -T linker.ld ${OBJ} ${LDFLAGS} + +.asm.o: + nasm -felf32 -o $@ $< + blob - /dev/null blob + f43362a9f2965b8ba3f1a00c704bedb3e83e8584 (mode 644) --- /dev/null +++ sys/.gitignore @@ -0,0 +1,4 @@ +*.o +*.elf +*.img +*.swp blob - 0b45a1a612f911b3a57817aaac3dfcf139356a27 (mode 644) blob + /dev/null --- sys/kern.asm +++ /dev/null @@ -1,12 +0,0 @@ -[org 0] -[bits 16] -[cpu 286] - -_start: - mov ax, 0x18 - mov es, ax - mov byte [es:0], 'H' - jmp $ - -hello: - db "Hello World", 13, 10, 0 blob - 649daf4117b26c0b0bf6f6238848a68d524663b4 blob + ecbcc7999f5bade6b01fe9fba663d6cddddfe644 --- sys/loader.asm +++ sys/loader.asm @@ -1,78 +1,78 @@ -[org 0x7C00] [bits 16] [cpu 286] -KERN_BEGIN equ 0x8000 +NUM_SECTORS equ 8 + +section .boot exec write +global _start +extern _entry _start: - ; load 32KiB from floppy + mov byte [bootdrv], dl + + ; reset boot drive + xor ah, ah + mov dl, byte [bootdrv] + int 0x13 + jc error + +.loop: + ; read sectors mov ah, 0x02 - mov al, 63 - mov ch, 0 + mov al, NUM_SECTORS + xor ch, ch mov cl, 2 - mov dh, 0 - mov bx, (KERN_BEGIN >> 4) + xor dh, dh + mov dl, byte [bootdrv] + mov bx, 0x1000 mov es, bx xor bx, bx int 0x13 - jc _start + jnc .ok - ; zero out IDT - cli - cld - mov ax, 0x80 - mov es, ax - xor ax, ax - xor di, di - mov cx, (256 * 8 / 2) - rep stosw - lidt [idtr] + ; reset boot drive again + xor ah, ah + mov dl, byte [bootdrv] + int 0x13 + jnc error - ; set up GDT - lgdt [gdtr] + dec byte [tries] + jnz .loop + jmp error - smsw ax - or ax, 1 - lmsw ax - - mov ax, 0x10 +.ok: + push word [bootdrv] + mov ax, 0x1000 mov ds, ax mov es, ax - mov ss, ax - jmp 0x08:0 - -idtr: - dw (256 * 8) - 1 - dd 0x800 + jmp 0x1000:_entry -gdtr: - dw gdt.end - gdt - 1 - dd gdt +error: + lea bp, [errstr] + ; fallthrough -gdt: - dq 0 +puts: + mov al, byte [bp] + inc bp + test al, al + jz .ret - ; kernel code - dw 65535 - dw (KERN_BEGIN & 0xffff) - db (KERN_BEGIN >> 16) & 0xf - db 0x9A - dw 0 + mov ah, 0x0E + xor bx, bx + int 0x10 + jmp puts - ; kernel data - dw 65535 - dw (KERN_BEGIN & 0xffff) - db (KERN_BEGIN >> 16) & 0xf - db 0x92 - dw 0 +.ret: + ret - ; vidmem - dw 4000 - dw 0x8000 - db 0x0b - db 0x92 - dw 0 -.end: +errstr: + db "Error", 13, 10, 0 +bootdrv: + db 0 + +tries: + db 3 + times 510 - ($ - $$) db 0 dw 0xAA55 blob - /dev/null blob + afe5bebcd75abb4844da7b0e7296229b7425e083 (mode 644) --- /dev/null +++ sys/TODO @@ -0,0 +1,3 @@ +- enable A20 +- fill in GDT +- set_irq() blob - /dev/null blob + 69b9070ffb6b42d218ee011e8901e12d540393e3 (mode 644) --- /dev/null +++ sys/kernel.asm @@ -0,0 +1,76 @@ +[cpu 286] +[bits 16] +section .text +global _entry +_entry: + pop dx + mov byte [bootdrv], dl + + ; get size of conventional memory (below 640K) + int 0x12 + mov word [convmem], ax + + ; get size of extended memory (above 1M) + mov ah, 0x88 + int 0x15 + jc .noxm + mov word [highmem], ax + jmp .okxm + +.noxm: + lea bp, [xmerr] + call puts + +.okxm: + lea bp, [hello] + call puts + jmp $ + +error: + lea bp, [errstr] + ; fallthrough + +puts: + mov al, byte [ds:bp] + inc bp + test al, al + jz .ret + + mov ah, 0x0E + xor bx, bx + int 0x10 + jmp puts + +.ret: + ret + +section .rodata +hello: + db "Hello World", 13, 10, 0 +errstr: + db "Error", 13, 10, 0 +xmerr: + db "No extended memory detected", 13, 10, 0 + +idtr: + dw idt.end - idt - 1 + dd idt + +gdtr: + dw gdt.end - gdt - 1 + dd gdt + +gdt: + dq 0 +.end: + +section .bss +bootdrv: + resb 1 +convmem: + resw 1 ; in kilobytes +highmem: + resw 1 ; in kilobytes +idt: + resq 256 +.end: blob - /dev/null blob + 1a2d3779413647e249669a3b82df0ce77f38343e (mode 644) --- /dev/null +++ sys/linker.ld @@ -0,0 +1,34 @@ +ENTRY(_start) +OUTPUT_ARCH(i386:i386) +OUTPUT_FORMAT(elf32-i386) /* pretend that we are a i386 */ + +MEMORY { + BOOTSECT : ORIGIN = 0x7C00, LENGTH = 512 + ROM : ORIGIN = 0x7E00, LENGTH = 4096 + RAM : ORIGIN = 0, LENGTH = 4096 +} + +SECTIONS { + .boot : { + *(.boot) + } > BOOTSECT + + .kernel : { + *(.text) + *(.rodata) + *(.data) + *(.bss) + } > RAM AT> ROM + /* this will cause the kernel to be directly after the loader on floppy, + * while starting at 0x1000:0 in memory.*/ + + /DISCARD/ : { + *(.dynamic) + *(.gnu.hash) + *(.dynsym) + *(.dynstr) + *(.hash) + *(.comment) + } +} +