os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 528b0c16fe05c98cefbef0c6faab4f6819d02991
parent 6769ced179395019001757ab499fa95d3da4fb97
Author: erai <erai@omiltem.net>
Date:   Wed, 14 May 2025 14:19:31 -0400

mbr loader

Diffstat:
M.gitignore | 1+
Mbuild.sh | 10+---------
Akernel.sh | 26++++++++++++++++++++++++++
Mkernel.x86_64.om | 31+++++++++++++++++++++----------
Ambr.asm | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 222 insertions(+), 19 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -9,3 +9,4 @@ !cc0.c !check.py !pxe.asm +!mbr.asm diff --git a/build.sh b/build.sh @@ -1,12 +1,9 @@ #!/bin/sh MACHINE="$(uname -m)" + LIBS="bufio.om lib.om alloc.om syscall.om syscall.${MACHINE}.om" CRYPTO="ed25519.om sha512.om sha256.om chacha20.om poly1305.om aes.om rsa.om" -CC="cc1.om type.om as.om decl.om node.om" -SSHD="chacha20.om poly1305.om sha256.om sha512.om ed25519.om sshd.om" -SHELL="echo.om cmp.om rm.om ls.om cat.om xxd.om mv.om mkdir.om cpio.om sh.om" -BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1" ./cc1 -m ${MACHINE} ${LIBS} echo.om -o echo -n echo.lines -G echo.call ./cc1 -m ${MACHINE} ${LIBS} cmp.om -o cmp -n cmp.lines -G cmp.call @@ -19,8 +16,3 @@ BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1" ./cc1 -m ${MACHINE} ${LIBS} cpio.om -o cpio -n cpio.lines -G cpio.call ./cc1 -m ${MACHINE} ${LIBS} sh.om -o sh -n sh.lines -G sh.call ./cc1 -m ${MACHINE} ${LIBS} ${CRYPTO} sshd.om -o sshd -n sshd.lines -G sshd.call - -for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs -if [ "${MACHINE}" = "x86_64" ]; then - ./cc1 -m ${MACHINE} kernel.x86_64.om -o kernel.x86_64 -n kernel.x86_64.lines -G kernel.x86_64.call -fi diff --git a/kernel.sh b/kernel.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +MACHINE="x86_64" + +LIBS="bufio.om lib.om alloc.om syscall.om syscall.${MACHINE}.om" +CRYPTO="ed25519.om sha512.om sha256.om chacha20.om poly1305.om aes.om rsa.om" +BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1" + +./cc1 -m ${MACHINE} ${LIBS} echo.om -o echo -n echo.lines -G echo.call +./cc1 -m ${MACHINE} ${LIBS} cmp.om -o cmp -n cmp.lines -G cmp.call +./cc1 -m ${MACHINE} ${LIBS} rm.om -o rm -n rm.lines -G rm.call +./cc1 -m ${MACHINE} ${LIBS} mv.om -o mv -n mv.lines -G mv.call +./cc1 -m ${MACHINE} ${LIBS} mkdir.om -o mkdir -n mkdir.lines -G mkdir.call +./cc1 -m ${MACHINE} ${LIBS} ls.om -o ls -n ls.lines -G ls.call +./cc1 -m ${MACHINE} ${LIBS} cat.om -o cat -n cat.lines -G cat.call +./cc1 -m ${MACHINE} ${LIBS} xxd.om -o xxd -n xxd.lines -G xxd.call +./cc1 -m ${MACHINE} ${LIBS} cpio.om -o cpio -n cpio.lines -G cpio.call +./cc1 -m ${MACHINE} ${LIBS} sh.om -o sh -n sh.lines -G sh.call +./cc1 -m ${MACHINE} ${LIBS} ${CRYPTO} sshd.om -o sshd -n sshd.lines -G sshd.call + +for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs +./cc1 -m ${MACHINE} kernel.${MACHINE}.om -o kernel.${MACHINE} -n kernel.${MACHINE}.lines -G kernel.${MACHINE}.call + +nasm -f bin mbr.asm -o mbr +cat mbr kernel.${MACHINE} > disk +truncate -s '>2M' disk diff --git a/kernel.x86_64.om b/kernel.x86_64.om @@ -277,7 +277,7 @@ func memcmp(a: *byte, b: *byte, n: int): int { } } -func bytesum(a: *byte, n: int): byte { +func bytesum(a: *byte, n: int): int { var i: int; var x: byte; @@ -285,7 +285,7 @@ func bytesum(a: *byte, n: int): byte { x = 0 as byte; loop { if i == n { - return x; + return x as int; } x = x + a[i]; @@ -4775,8 +4775,11 @@ func task_init(t: *task) { // open("/dev/null") => 0 // open("/dev/tty") => 1 // dup(1) => 2 - if vexec("/init", nil, nil) != 0 { - kdie("failed to exec init"); + //if vexec("/init", nil, nil) != 0 { + // kdie("failed to exec init"); + //} + loop { + yield(); } } @@ -4848,6 +4851,13 @@ func _kstart(mb: int) { mmap_start = mmap[i * 3]; mmap_end = mmap_start + mmap[i * 3 + 1]; + kputh(mmap_start); + kputc('-'); + kputh(mmap_end); + kputc(' '); + kputh8(mmap[i * 3 + 2] & 15); + kputc('\n'); + if i + 1 < mmap_count { if mmap_end > mmap[i * 3 + 3] { kdie("OVERLAP"); @@ -5006,15 +5016,16 @@ func _kstart(mb: int) { global.lapic = lapic; pci = map_pci(pcip); - //scan_pci(pci, show_pcidev); - scan_pci(pci, init_realtek); - scan_pci(pci, init_ahci); + scan_pci(pci, show_pcidev); + //scan_pci(pci, init_realtek); + //scan_pci(pci, init_ahci); + - tcp_listen(22, tcp_ssh); + //tcp_listen(22, tcp_ssh); - parse_initramfs(); + //parse_initramfs(); - spawn(task_init, "init", nil); + //spawn(task_init, "init", nil); // Wait for interrupts kputs("zzz\n"); diff --git a/mbr.asm b/mbr.asm @@ -0,0 +1,173 @@ + bits 16 + org 0x7c00 + +_start: + ; Disable interrupts to relocate + cli + + ; Direction forward + cld + + ; Clear the segments + xor ax, ax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, 0x2000 + + ; Enable A20 + in al, 0x92 + or al, 0x02 + out 0x92, al + + ; Allocate load header + sub sp, 32 + 16 + mov ebp, esp + + ; Extended Read + lea si, [bp + 32] + mov dword [si + 0], 0x00100010 ; descriptor size and block count + mov dword [si + 4], 0x00002000 ; buffer address and segment + mov dword [si + 8], 1 ; lba + mov dword [si + 12], 0 + mov ah, 0x42 + mov dl, 0x80 + int 0x13 + + ; Parse the header + mov edi, 0x00002000 + mov cx, 0x800 +.next_magic: + mov eax, 0x1badb002 + repne scasd + cmp cx, 8 + jb fail + add eax, [di] + add eax, [di + 4] + test eax, eax + jnz .next_magic + + ; Check the header has load fields + test word [di + 4], 1 + jz fail + + ; Copy the header to bp + xor esi, esi + lea si, [di - 4] + mov di, bp + mov cx, 8 + rep movsd + + ; load_offset = si - 0x2020 + load_addr - header_addr + mov eax, [bp + 16] + sub eax, [bp + 12] + add eax, esi + sub eax, 0x2020 + + ; Check load_offset < 8k + mov ecx, 0x2000 + sub ecx, eax + jb fail + + ; Copy first page + mov edi, [bp + 16] + mov esi, 0x2000 + add esi, eax + +.copy_page: + a32 rep movsb + cmp edi, [bp + 20] + jae .load_done + + lea si, [bp + 32] + add dword [si + 8], 16 + mov ah, 0x42 + mov dl, 0x80 + int 0x13 + + mov esi, 0x2000 + mov ecx, 0x2000 + jmp .copy_page +.load_done: + + ; Boot info header + sub sp, 128 + mov ebp, esp + mov dword [bp], 0x40 + + ; Find the memory map + xor ebx, ebx + mov edi, 0x2100 + mov [bp + 48], edi + add edi, 4 +.next_mmap: + mov edx, 0x534d4150 + mov eax, 0xe820 + mov ecx, 20 + int 0x15 + mov edx, 0x534d4150 + cmp eax, edx + jnz fail + mov [di - 4], ecx + add dword [bp + 44], 24 + add di, 24 + test ebx, ebx + jnz .next_mmap + + ; Create GDT + mov esi, 0x2000 + ; Null segment + mov dword [si + 0], 0 + mov dword [si + 4], 0 + ; Code segment + mov dword [si + 8], 0x0000ffff + mov dword [si + 12], 0x00cf9b00 + ; Data segment + mov dword [si + 16], 0x0000ffff + mov dword [si + 20], 0x00cf9300 + + ; Load the GDT + sub sp, 6 + mov edi, esp + mov word [di + 0], 23 + mov dword [di + 2], esi + lgdt [edi] + add sp, 6 + + ; Enter protected mode + cli + mov eax, cr0 + or al, 1 + mov cr0, eax + jmp 8:_prot + bits 32 + +fail: + hlt + jmp fail + +_prot: + ; Load protected segments + mov ax, 16 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, esp + + ; Jump to the kernel + mov eax, 0x2badb002 + mov ebx, ebp + mov edx, [bp + 28 + 128] + jmp edx + + times (446 - ($ - _start)) db 0x90 + + ; Partition table + times (510 - ($ - _start)) db 0x00 + ; Signature + db 0x55 + db 0xaa