commit 79ff103dda6067fe221bb9532e416f343acbdde8 from: Benjamin Stürz date: Mon Oct 07 14:52:36 2024 UTC sys: implement ring 3 commit - 5cd42ecdae41f3fa8dcabb0b4c33fc01dfc78db7 commit + 79ff103dda6067fe221bb9532e416f343acbdde8 blob - 0392e0db74d8749bc01305b5fd88746df0606704 blob + a5c4151e064dd41d86bbffd70d820f853a7e8e87 --- sys/Makefile +++ sys/Makefile @@ -28,6 +28,11 @@ sys.bin: sys.elf sys.elf: linker.ld ${OBJ} ld -o $@ -T linker.ld ${OBJ} ${LDFLAGS} +user.bin: user.asm + nasm -fbin -o $@ user.asm + .asm.o: nasm -felf32 -o $@ $< +kernel.o: user.bin + blob - be79d53efc80383547d6a0a19297bceba9872599 blob + a8010678d1c251947628cace55f8cd8ceec35ac0 --- sys/kernel.asm +++ sys/kernel.asm @@ -41,6 +41,14 @@ _entry: pop dx mov byte [bootdrv], dl + ; copy user task into 0x2000:0 + mov ax, 0x2000 + mov es, ax + xor di, di + lea si, [user] + lea cx, [user.end - user] + rep movsb + ; clear screen mov bx, 0xb800 mov es, bx @@ -137,6 +145,10 @@ _entry: mov ah, 0x86 lea dx, [i_timer] call set_irq + mov al, 0x80 + mov ah, 0xe6 + lea dx, [i_sys] + call set_irq lea bp, [convmsg] call puts @@ -168,30 +180,79 @@ _entry: lldt ax ; enter userspace, TODO: enter ring 3 - lea ax, [gdt.data - gdt] + mov ax, 0x0f ; LDT .data mov ds, ax mov es, ax - mov bx, sp - push ax ; ss - push bx ; sp + push 0x17 ; ss (LDT .stack) + push 0xfffe ; sp push 0x202 ; flags (EI | 0x02) - push (gdt.text - gdt) ; cs - push task1 ; ip + push 0x07 ; cs (LDT .text) + push 0 ; ip iret i_timer: pusha + push ds + push es + + mov ax, (gdt.data - gdt) + mov ds, ax + mov es, ax + mov al, '.' call putchar outb 0x20, 0x20 + pop es + pop ds popa iret -task1: - lea bp, [hello] +; ds:si - from +; es:di - to +; cx - count +copy_from_user: + rep movsb + ret + +i_sys: ; syscall interrupt (0x80) + push ds + push es + + push ax + mov ax, (gdt.data - gdt) + mov es, ax + pop ax + + test ax, ax + jz .print + + ; invalid interrupt + mov ax, -1 + jmp .ret + + +.print: + push cx + mov si, bx + lea di, [ubuf] + ; TODO: check that cx < sizeof(ubuf) + call copy_from_user + pop bx + mov byte [ubuf + bx], 0 + + lea ax, [gdt.data - gdt] + mov ds, ax + mov es, ax + lea bp, [ubuf] call puts - jmp $ + xor ax, ax + jmp .ret + +.ret: + pop es + pop ds + iret ; al - num ; ah - attr @@ -343,6 +404,9 @@ panic: jmp .halt section .rodata +user: + incbin "user.bin" +.end: hello: db "Hello World", 10, 0 errstr: @@ -429,6 +493,8 @@ ldt: .end: section .bss +ubuf: + resb 256 posx: resw 1 posy: