still need to read, parse root directory to find kernel and need to put boot signature at 0x7dfe to jump around
This commit is contained in:
commit
aeff38fe15
4 changed files with 278 additions and 0 deletions
4
doc/design/kernel_functions.txt
Normal file
4
doc/design/kernel_functions.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
allocate:
|
||||||
|
ax in: number of pages
|
||||||
|
dx in: process id
|
||||||
|
ebx out: address, or 0x0000_0000 on failure
|
16
doc/design/memory_map.txt
Normal file
16
doc/design/memory_map.txt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
0x0000 - 0x03ff : interrupt vector table
|
||||||
|
0x0400 - 0x04ff : bios data area
|
||||||
|
0x0500 - 0x05ff : structure pointers
|
||||||
|
0x00 dword : fat pointer
|
||||||
|
0x0600 - 0x1fff : not assigned
|
||||||
|
0x2000 - 0x3fff : memory map
|
||||||
|
for each word : 1 page
|
||||||
|
0x0000 = free
|
||||||
|
0x0001 = unavailable
|
||||||
|
0x0002 = kernel
|
||||||
|
other = process number
|
||||||
|
|
||||||
|
0x4000 - 0x6fff : not assigned
|
||||||
|
0x7000 - 0x7bff : bootloader scratch
|
||||||
|
0x7000 : memory map bios buffer
|
||||||
|
0x7c00 - 0x7fff : bootloader
|
12
makefile
Normal file
12
makefile
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
floppy: out bootloader
|
||||||
|
mkfs.fat -C -f 1 -F 12 -n "PORTLAND OS" -R 2 -S 512 out/floppy.img 1440
|
||||||
|
dd if=obj/bootloader.bin of=out/floppy.img bs=1 seek=62 conv=notrunc
|
||||||
|
|
||||||
|
bootloader: obj
|
||||||
|
nasm src/bootloader.bin -o obj/bootloader.bin
|
||||||
|
|
||||||
|
obj:
|
||||||
|
mkdir -p obj
|
||||||
|
|
||||||
|
out:
|
||||||
|
mkdir -p out
|
246
src/bootloader.asm
Normal file
246
src/bootloader.asm
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
;Copyright 2019 Benji Dial
|
||||||
|
|
||||||
|
;Permission to use, copy, modify, and/or distribute this
|
||||||
|
;software for any purpose with or without fee is hereby
|
||||||
|
;granted, provided that the above copyright notice and this
|
||||||
|
;permission notice appear in all copies.
|
||||||
|
|
||||||
|
;THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS
|
||||||
|
;ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||||
|
;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
||||||
|
;EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
;INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
;WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
;WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
;TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
|
||||||
|
;USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
pointers:
|
||||||
|
.fat equ 0x0500
|
||||||
|
|
||||||
|
fat_header:
|
||||||
|
.oem_name equ 0x7c03;mkfs.fat - ignored
|
||||||
|
.bytes_per_sector equ 0x7c0b;0x0200 - assumed
|
||||||
|
.sectors_per_cluster equ 0x7c0d;0x01 - assumed
|
||||||
|
.reserved_sectors equ 0x7c0e;0x0002 - other values handled
|
||||||
|
.n_fats equ 0x7c10;0x01 - assumed
|
||||||
|
.directory_entries equ 0x7c11; -
|
||||||
|
.n_sectors equ 0x7c13;0x0b40 -
|
||||||
|
.media_type equ 0x7c15; -
|
||||||
|
.sectors_per_fat equ 0x7c16; - handled
|
||||||
|
.sectors_per_track equ 0x7c18;0x0012 -
|
||||||
|
.sides equ 0x7c1a;0x0002 -
|
||||||
|
.hidden_sectors equ 0x7c1c;0x0000_0000 - assumed
|
||||||
|
.long_sectors equ 0x7c20;0x0000_0000 - assumed
|
||||||
|
.drive_number equ 0x7c24; - ignored, used as scratch
|
||||||
|
.flags equ 0x7c25; - ignored
|
||||||
|
.signature equ 0x7c26;0x29 - halts on other values
|
||||||
|
.id equ 0x7c27; - ignored
|
||||||
|
.label equ 0x7c2b;PORTLAND OS - assumed
|
||||||
|
.fs_type equ 0x7c36;FAT12 - assumed
|
||||||
|
|
||||||
|
org 0x7c3e
|
||||||
|
bits 16
|
||||||
|
|
||||||
|
in al, 0x92
|
||||||
|
or al, 0x02
|
||||||
|
out 0x92, al
|
||||||
|
|
||||||
|
mov ah, 0x42
|
||||||
|
mov si, dap
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
mov byte [fat_header.drive_number], dl
|
||||||
|
|
||||||
|
memory:
|
||||||
|
mov bx, 0x2010
|
||||||
|
mov eax, 0x0001_0001
|
||||||
|
.clear:
|
||||||
|
mov dword [bx], eax
|
||||||
|
add bx, 4
|
||||||
|
test bx, 0x4000
|
||||||
|
jne .clear
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
mov es, ax
|
||||||
|
mov si, 0x7000
|
||||||
|
xor ebx, ebx
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
mov eax, 0x0000_e820
|
||||||
|
mov ecx, 24
|
||||||
|
mov edx, 0x534d_4150
|
||||||
|
int 0x15
|
||||||
|
jc .done
|
||||||
|
|
||||||
|
test cl, 24
|
||||||
|
jne .not_24
|
||||||
|
|
||||||
|
test byte [0x7014], 0x01
|
||||||
|
jz .loop
|
||||||
|
|
||||||
|
.not_24:
|
||||||
|
test dword [0x7010], 1
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
test byte [0x7003], 0
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
test dword [0x7004], 0
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
test dword [0x700c], 0
|
||||||
|
je .check_lower
|
||||||
|
|
||||||
|
mov dword [0x7008], 0xffff_ffff
|
||||||
|
|
||||||
|
.check_lower:
|
||||||
|
test dword [0x7008], 0
|
||||||
|
je .loop
|
||||||
|
|
||||||
|
mov edx, ebx
|
||||||
|
mov ebx, dword [0x7000]
|
||||||
|
mov eax, ebx
|
||||||
|
add eax, dword [0x7008]
|
||||||
|
jnc .pagify
|
||||||
|
mov eax, 0xffff_ffff
|
||||||
|
|
||||||
|
.pagify:
|
||||||
|
dec ebx
|
||||||
|
shr ebx, 12
|
||||||
|
inc ebx
|
||||||
|
shr eax, 12
|
||||||
|
dec eax
|
||||||
|
|
||||||
|
test eax, 0xffff_f000
|
||||||
|
jz .maxed
|
||||||
|
mov eax, 0x0000_0fff
|
||||||
|
|
||||||
|
.maxed:
|
||||||
|
inc eax
|
||||||
|
test eax, ebx
|
||||||
|
je .next
|
||||||
|
|
||||||
|
shl ebx, 1
|
||||||
|
or ebx, 0x2000
|
||||||
|
shl eax, 1
|
||||||
|
add eax, 0x2000
|
||||||
|
mov ecx, eax
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
.free_loop:
|
||||||
|
mov word [ebx], ax
|
||||||
|
add ebx, 2
|
||||||
|
test ebx, ecx
|
||||||
|
jne .free_loop
|
||||||
|
|
||||||
|
.next:
|
||||||
|
mov ebx, edx
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.done:
|
||||||
|
mov dword [0x2000], 0x0002_0002
|
||||||
|
mov dword [0x2004], 0x0002_0002
|
||||||
|
mov dword [0x2008], 0x0002_0002
|
||||||
|
mov dword [0x200c], 0x0002_0002
|
||||||
|
|
||||||
|
test byte [fat_header.signature], 0x29
|
||||||
|
jne halt
|
||||||
|
|
||||||
|
mov ax, word [fat_header.sectors_per_fat]
|
||||||
|
mov word [dap.length], ax
|
||||||
|
|
||||||
|
dec ax
|
||||||
|
shr ax, 3
|
||||||
|
inc ax
|
||||||
|
|
||||||
|
fat_allocate:
|
||||||
|
mov bx, 0x200e
|
||||||
|
xor cx, cx
|
||||||
|
mov dx, 0x2200
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
add bx, 2
|
||||||
|
test bx, dx
|
||||||
|
je halt
|
||||||
|
|
||||||
|
test word [bx], 0x0000
|
||||||
|
je .eq
|
||||||
|
|
||||||
|
xor cx, cx
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.eq:
|
||||||
|
inc cx
|
||||||
|
test cx, ax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
dec ax
|
||||||
|
shl ax, 1
|
||||||
|
sub bx, ax
|
||||||
|
mov dx, bx
|
||||||
|
|
||||||
|
mov ax, 0x0002
|
||||||
|
.mark_loop:
|
||||||
|
mov word [bx], ax
|
||||||
|
loop .mark_loop
|
||||||
|
|
||||||
|
mov bx, dx
|
||||||
|
and ebx, 0x0000_dfff
|
||||||
|
shl ebx, 12
|
||||||
|
|
||||||
|
mov dword [pointers.fat], ebx
|
||||||
|
|
||||||
|
mov dl, byte [fat_header.drive_number]
|
||||||
|
mov ax, word [fat_header.reserved_sectors]
|
||||||
|
mov word [dap.start], ax
|
||||||
|
mov word [dap.offset], bx
|
||||||
|
shr ebx, 16
|
||||||
|
and bx, 0xf000
|
||||||
|
mov word [dap.segment], bx
|
||||||
|
|
||||||
|
mov ah, 0x42
|
||||||
|
mov si, dap
|
||||||
|
int 0x15
|
||||||
|
|
||||||
|
mov ebx, dword [pointers.fat]
|
||||||
|
|
||||||
|
;fat loaded - load kernel
|
||||||
|
|
||||||
|
cli
|
||||||
|
|
||||||
|
lgdt [gdt]
|
||||||
|
mov eax, cr0
|
||||||
|
or al, 0x01
|
||||||
|
mov cr0, eax
|
||||||
|
jmp 0x08:pmode
|
||||||
|
|
||||||
|
gdt:
|
||||||
|
dw 0x28
|
||||||
|
dd gdt + 6
|
||||||
|
dq 0x0000_0000_0000_0000
|
||||||
|
dq 0x0040_9a00_0000_7fff;0x000000 - 0x007fff
|
||||||
|
dq 0x0040_9200_0000_7fff
|
||||||
|
dq 0x00c0_9a00_8000_0ff7;0x008000 - 0xffffff
|
||||||
|
dq 0x00c0_9200_8000_0ff7
|
||||||
|
|
||||||
|
dap:
|
||||||
|
dw 0x0010
|
||||||
|
.length dw 0x0001
|
||||||
|
.offset dw 0x7e00
|
||||||
|
.segment dw 0x0000
|
||||||
|
.start dq 1
|
||||||
|
|
||||||
|
allocate:
|
||||||
|
;TODO
|
||||||
|
ret
|
||||||
|
|
||||||
|
halt:
|
||||||
|
cli
|
||||||
|
.hlt:
|
||||||
|
hlt
|
||||||
|
jmp .hlt
|
||||||
|
|
||||||
|
bits 32
|
||||||
|
pmode:
|
||||||
|
|
Reference in a new issue