parent
a0c99799e8
commit
6583b96351
|
@ -215,6 +215,18 @@ common32:
|
||||||
cmp ecx, [uKernelSize]
|
cmp ecx, [uKernelSize]
|
||||||
jbe @b
|
jbe @b
|
||||||
|
|
||||||
|
; map some memory untils 0xC03B0000 for memory allocator
|
||||||
|
@@:
|
||||||
|
mov edx, esi
|
||||||
|
or edx, 0x3
|
||||||
|
mov [edi], edx
|
||||||
|
add edi, 4
|
||||||
|
add ecx, 4096
|
||||||
|
add esi, 4096
|
||||||
|
cmp ecx, 0x3B0000
|
||||||
|
jb @b
|
||||||
|
|
||||||
|
|
||||||
; map 0xB8000 (vga) to 0xC03B0000
|
; map 0xB8000 (vga) to 0xC03B0000
|
||||||
; 0xC03B0000 >> 12 & 0x3FF == 944
|
; 0xC03B0000 >> 12 & 0x3FF == 944
|
||||||
mov dword [boot_768_page_table + 944 * 4], 0xB8000 + 0x3
|
mov dword [boot_768_page_table + 944 * 4], 0xB8000 + 0x3
|
||||||
|
@ -231,8 +243,6 @@ common32:
|
||||||
mov eax, STPDBOOT_MAGIC
|
mov eax, STPDBOOT_MAGIC
|
||||||
mov ebx, boot_structure
|
mov ebx, boot_structure
|
||||||
|
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
mov ecx, 0xC0000000
|
mov ecx, 0xC0000000
|
||||||
jmp ecx
|
jmp ecx
|
||||||
|
|
||||||
|
|
|
@ -14,3 +14,7 @@ struc BootInfo {
|
||||||
.kernel_start dd ?
|
.kernel_start dd ?
|
||||||
.kernel_size dd ?
|
.kernel_size dd ?
|
||||||
}
|
}
|
||||||
|
virtual at 0
|
||||||
|
BootInfo BootInfo
|
||||||
|
sizeof.BootInfo:
|
||||||
|
end virtual
|
||||||
|
|
|
@ -19,29 +19,38 @@ db 32 dup(0)
|
||||||
;; EBX - Boot structure address
|
;; EBX - Boot structure address
|
||||||
;;
|
;;
|
||||||
kmain:
|
kmain:
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
mov esp, stack_top
|
mov esp, stack_top
|
||||||
|
|
||||||
cmp eax, STPDBOOT_MAGIC
|
cmp eax, STPDBOOT_MAGIC
|
||||||
jne .error_magic
|
jne .error_magic
|
||||||
|
|
||||||
; init memory manager
|
; Copy boot structure
|
||||||
; init idt, gdt
|
mov ecx, sizeof.BootInfo
|
||||||
; copy boot structure
|
mov esi, ebx
|
||||||
;call vga_console_clear
|
mov edi, boot_structure
|
||||||
|
|
||||||
|
; print hello world
|
||||||
mov [0xC03B0000], dword 0x08740953
|
mov [0xC03B0000], dword 0x08740953
|
||||||
mov [0xC03B0004], dword 0x05700675
|
mov [0xC03B0004], dword 0x05700675
|
||||||
mov [0xC03B0008], dword 0x03640469
|
mov [0xC03B0008], dword 0x03640469
|
||||||
mov [0xC03B000C], dword 0x0153024F
|
mov [0xC03B000C], dword 0x0153024F
|
||||||
|
|
||||||
|
|
||||||
;KLOG_INIT
|
|
||||||
|
|
||||||
mov esi, szMsgKernelAlive
|
mov esi, szMsgKernelAlive
|
||||||
call klog
|
call klog
|
||||||
|
|
||||||
|
; init pmm (kend, 0x3B0000)
|
||||||
|
mov eax, kend
|
||||||
|
mov ebx, 0xC03B0000
|
||||||
|
call pmm_init
|
||||||
|
|
||||||
|
; init vmm
|
||||||
|
call mm_init
|
||||||
|
|
||||||
|
; map whole memory
|
||||||
|
|
||||||
|
; idt, gdt
|
||||||
|
|
||||||
|
|
||||||
.halt:
|
.halt:
|
||||||
hlt
|
hlt
|
||||||
jmp $
|
jmp $
|
||||||
|
@ -51,6 +60,7 @@ kmain:
|
||||||
call klog
|
call klog
|
||||||
jmp .halt
|
jmp .halt
|
||||||
|
|
||||||
|
include 'bootinfo.inc'
|
||||||
include 'klog.inc'
|
include 'klog.inc'
|
||||||
include 'dev/vga_console.inc'
|
include 'dev/vga_console.inc'
|
||||||
include 'mm/mm.inc'
|
include 'mm/mm.inc'
|
||||||
|
@ -58,10 +68,11 @@ kmain:
|
||||||
szMsgKernelAlive db "Kernel is alive", 0
|
szMsgKernelAlive db "Kernel is alive", 0
|
||||||
szErrorBootProtocol db "Error: wrong magic number", 0
|
szErrorBootProtocol db "Error: wrong magic number", 0
|
||||||
|
|
||||||
align 4
|
boot_structure BootInfo
|
||||||
|
|
||||||
|
align 4096
|
||||||
stack_bottom:
|
stack_bottom:
|
||||||
rb 0x4000
|
rb 0x4000
|
||||||
stack_top:
|
stack_top:
|
||||||
|
|
||||||
_end:
|
kend:
|
||||||
dd 0x0
|
|
||||||
|
|
|
@ -77,16 +77,86 @@ klog_print_date:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
klog_print_hex:
|
||||||
|
push esi
|
||||||
|
mov esi, szHexPrefix
|
||||||
|
call klog_print
|
||||||
|
pop esi
|
||||||
|
|
||||||
|
or edi, edi
|
||||||
|
jz .print_zero
|
||||||
|
push esi
|
||||||
|
mov esi, szKlogBuffer
|
||||||
|
xor cl, cl
|
||||||
|
.loop:
|
||||||
|
cmp cl, 8
|
||||||
|
je .print_number
|
||||||
|
rol edi, 4
|
||||||
|
mov eax, edi
|
||||||
|
and eax, 0xF
|
||||||
|
mov al, byte [sDigit + eax]
|
||||||
|
mov [esi], al
|
||||||
|
inc esi
|
||||||
|
inc cl
|
||||||
|
jmp .loop
|
||||||
|
.print_zero:
|
||||||
|
mov al, '0'
|
||||||
|
out dx, al
|
||||||
|
jmp .end
|
||||||
|
.print_number:
|
||||||
|
mov [esi], byte 0
|
||||||
|
mov esi, szKlogBuffer
|
||||||
|
call klog_print
|
||||||
|
pop esi
|
||||||
|
.end:
|
||||||
|
ret
|
||||||
|
|
||||||
;; Function: klog
|
;; Function: klog
|
||||||
;; Output kernel log
|
;; Output kernel log
|
||||||
klog:
|
klog:
|
||||||
call klog_print_date
|
call klog_print_date
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
mov al, [esi]
|
||||||
|
or al, al
|
||||||
|
jz .end
|
||||||
|
cmp al, '%'
|
||||||
|
jne .putchar
|
||||||
|
inc esi
|
||||||
|
mov al, [esi]
|
||||||
|
cmp al, '%'
|
||||||
|
je .putchar
|
||||||
|
cmp al, 's'
|
||||||
|
jne .check_x
|
||||||
|
mov edi, esi
|
||||||
|
pop eax
|
||||||
|
pop esi
|
||||||
|
push eax
|
||||||
call klog_print
|
call klog_print
|
||||||
|
mov esi, edi
|
||||||
|
jmp .next
|
||||||
|
.check_x:
|
||||||
|
cmp al, 'x'
|
||||||
|
jne .unknown_format
|
||||||
|
pop eax
|
||||||
|
pop edi
|
||||||
|
push eax
|
||||||
|
call klog_print_hex
|
||||||
|
jmp .next
|
||||||
|
.unknown_format:
|
||||||
|
mov al, '?'
|
||||||
|
.putchar:
|
||||||
|
out dx, al
|
||||||
|
.next:
|
||||||
|
inc esi
|
||||||
|
jmp .loop
|
||||||
|
.end:
|
||||||
mov esi, szCRLF
|
mov esi, szCRLF
|
||||||
call klog_print
|
call klog_print
|
||||||
ret
|
ret
|
||||||
|
|
||||||
szTime db '[00:00:00] ', 0
|
szTime db '[00:00:00] ', 0
|
||||||
szCRLF db CR, LF, 0
|
szCRLF db CR, LF, 0
|
||||||
|
sDigit db '0123456789ABCDEF'
|
||||||
|
szHexPrefix db '0x', 0
|
||||||
|
szKlogBuffer db '00000000', 0
|
||||||
|
|
|
@ -2,4 +2,18 @@
|
||||||
include "pmm.inc"
|
include "pmm.inc"
|
||||||
|
|
||||||
mm_init:
|
mm_init:
|
||||||
|
mov esi, szMsgMmInit
|
||||||
|
call klog
|
||||||
|
|
||||||
|
call pmm_alloc_page
|
||||||
|
mov [pKernelPgDir], eax
|
||||||
|
|
||||||
|
push eax
|
||||||
|
mov esi, szMsgMmKernelPgDir
|
||||||
|
call klog
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
szMsgMmInit db "MM: initialize", 0
|
||||||
|
szMsgMmKernelPgDir db "MM: Kernel page dir at %x", 0
|
||||||
|
pKernelPgDir dd ?
|
||||||
|
|
|
@ -1,16 +1,79 @@
|
||||||
|
;; File: pmm.inc
|
||||||
|
|
||||||
align 4
|
struc FreeItem {
|
||||||
;aPhysPageBitmap:
|
.next dd ?
|
||||||
; dd 32769 dup(0)
|
}
|
||||||
|
|
||||||
|
;; Function: pmm_init
|
||||||
|
;;
|
||||||
|
;; In:
|
||||||
|
;; EAX - Start
|
||||||
|
;; EBX - End
|
||||||
pmm_init:
|
pmm_init:
|
||||||
|
push eax
|
||||||
|
mov esi, szMsgPmmInit
|
||||||
|
call klog
|
||||||
|
pop eax
|
||||||
|
|
||||||
|
call pmm_free_range
|
||||||
ret
|
ret
|
||||||
|
|
||||||
pmm_alloc_page:
|
pmm_alloc_page:
|
||||||
|
cmp [pFreeList], 0
|
||||||
|
je .error
|
||||||
|
mov eax, [pFreeList]
|
||||||
|
mov edx, [eax]
|
||||||
|
mov [pFreeList], edx
|
||||||
ret
|
ret
|
||||||
|
.error:
|
||||||
pmm_free_range:
|
mov esi, szErrorNoMemLeft
|
||||||
|
call klog
|
||||||
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
pmm_free_page:
|
pmm_free_page:
|
||||||
|
or eax, eax
|
||||||
|
jz @f
|
||||||
|
mov edx, [pFreeList]
|
||||||
|
mov [eax], edx
|
||||||
|
mov [pFreeList], eax
|
||||||
|
@@:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;; Function: pmm_free_range
|
||||||
|
;; TODO: allignment
|
||||||
|
;; In:
|
||||||
|
;; EAX - Start
|
||||||
|
;; EBX - End
|
||||||
|
pmm_free_range:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
sub esp, 0x10
|
||||||
|
mov [ebp-4], eax
|
||||||
|
mov [ebp-8], ebx
|
||||||
|
|
||||||
|
push ebx
|
||||||
|
push eax
|
||||||
|
mov esi, szMsgPmmFreeRange
|
||||||
|
call klog
|
||||||
|
|
||||||
|
xchg bx, bx
|
||||||
|
|
||||||
|
mov esi, [ebp-4]
|
||||||
|
.loop:
|
||||||
|
mov eax, [pFreeList]
|
||||||
|
mov [esi], eax
|
||||||
|
mov [pFreeList], esi
|
||||||
|
|
||||||
|
add esi, 4096
|
||||||
|
cmp esi, [ebp-8]
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
|
||||||
|
pFreeList dd 0
|
||||||
|
szMsgPmmInit db "PMM: initialize", 0
|
||||||
|
szMsgPmmFreeRange db "PMM: add free memory range %x - %x", 0
|
||||||
|
szErrorNoMemLeft db "Error: no free memory left", 0
|
||||||
|
|
Loading…
Reference in a new issue