feat(kernel): map low memory using bitmap
This commit is contained in:
parent
7f5c45b19d
commit
a36c8b00ed
11 changed files with 235 additions and 70 deletions
|
@ -12,11 +12,16 @@ ASMINCS = sys/bootinfo.inc \
|
||||||
sys/register.inc
|
sys/register.inc
|
||||||
|
|
||||||
KERNEL = vmstupid.sys
|
KERNEL = vmstupid.sys
|
||||||
|
|
||||||
|
MM_SRCS = bootstrap.inc \
|
||||||
|
mm.inc \
|
||||||
|
pmm.inc \
|
||||||
|
vmm.inc
|
||||||
|
|
||||||
SRCS = kernel.asm \
|
SRCS = kernel.asm \
|
||||||
const.inc \
|
const.inc \
|
||||||
klog.inc \
|
klog.inc \
|
||||||
mm/mm.old.inc \
|
$(addprefix mm/, $(MM_SRCS)) \
|
||||||
mm/pmm.old.inc \
|
|
||||||
lock.inc \
|
lock.inc \
|
||||||
gdt.inc \
|
gdt.inc \
|
||||||
isr.inc \
|
isr.inc \
|
||||||
|
|
|
@ -16,3 +16,7 @@ BUILD_DATE equ "@DATE@"
|
||||||
; ------------- OTHER -----------
|
; ------------- OTHER -----------
|
||||||
CR = 0x0D
|
CR = 0x0D
|
||||||
LF = 0x0A
|
LF = 0x0A
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_COMPAT_I386 = 0
|
||||||
|
CONFIG_TRACE_PMM = 1
|
||||||
|
|
|
@ -11,6 +11,40 @@ CGA_CURSOR_LOW = 0xF
|
||||||
CGA_COLUMNS = 80
|
CGA_COLUMNS = 80
|
||||||
CGA_LINES = 24
|
CGA_LINES = 24
|
||||||
|
|
||||||
|
CGA_COLOR_FG_BLACK = 0x00
|
||||||
|
CGA_COLOR_FG_BLUE = 0x01
|
||||||
|
CGA_COLOR_FG_GREEN = 0x02
|
||||||
|
CGA_COLOR_FG_CYAN = 0x03
|
||||||
|
CGA_COLOR_FG_RED = 0x04
|
||||||
|
CGA_COLOR_FG_MAGENTA = 0x05
|
||||||
|
CGA_COLOR_FG_BROWN = 0x06
|
||||||
|
CGA_COLOR_FG_LIGHT_GRAY = 0x07
|
||||||
|
CGA_COLOR_FG_DARK_GRAY = 0x08
|
||||||
|
CGA_COLOR_FG_LIGHT_BLUE = 0x09
|
||||||
|
CGA_COLOR_FG_LIGHT_GREEN = 0x0A
|
||||||
|
CGA_COLOR_FG_LIGHT_CYAN = 0x0B
|
||||||
|
CGA_COLOR_FG_LIGHT_RED = 0x0C
|
||||||
|
CGA_COLOR_FG_LIGHT_MAGENTA = 0x0D
|
||||||
|
CGA_COLOR_FG_YELLOW = 0x0E
|
||||||
|
CGA_COLOR_FG_WHITE = 0x0F
|
||||||
|
|
||||||
|
CGA_COLOR_BG_BLACK = 0x00
|
||||||
|
CGA_COLOR_BG_BLUE = 0x10
|
||||||
|
CGA_COLOR_BG_GREEN = 0x20
|
||||||
|
CGA_COLOR_BG_CYAN = 0x30
|
||||||
|
CGA_COLOR_BG_RED = 0x40
|
||||||
|
CGA_COLOR_BG_MAGENTA = 0x50
|
||||||
|
CGA_COLOR_BG_BROWN = 0x60
|
||||||
|
CGA_COLOR_BG_LIGHT_GRAY = 0x70
|
||||||
|
CGA_COLOR_BG_DARK_GRAY = 0x80
|
||||||
|
CGA_COLOR_BG_LIGHT_BLUE = 0x90
|
||||||
|
CGA_COLOR_BG_LIGHT_GREEN = 0xA0
|
||||||
|
CGA_COLOR_BG_LIGHT_CYAN = 0xB0
|
||||||
|
CGA_COLOR_BG_LIGHT_RED = 0xC0
|
||||||
|
CGA_COLOR_BG_LIGHT_MAGENTA = 0xD0
|
||||||
|
CGA_COLOR_BG_YELLOW = 0xE0
|
||||||
|
CGA_COLOR_BG_WHITE = 0xF0
|
||||||
|
|
||||||
;; Function: cga_getpos
|
;; Function: cga_getpos
|
||||||
;;
|
;;
|
||||||
;; Out:
|
;; Out:
|
||||||
|
@ -94,7 +128,7 @@ cga_putc:
|
||||||
mov cx, [ebp-0x2]
|
mov cx, [ebp-0x2]
|
||||||
shl cx, 1
|
shl cx, 1
|
||||||
add edx, ecx
|
add edx, ecx
|
||||||
mov ah, 0x07
|
mov ah, byte [cga_color]
|
||||||
mov word [edx], ax
|
mov word [edx], ax
|
||||||
mov cx, [ebp-0x2]
|
mov cx, [ebp-0x2]
|
||||||
inc cx
|
inc cx
|
||||||
|
@ -134,3 +168,5 @@ cga_putc:
|
||||||
|
|
||||||
cga_device:
|
cga_device:
|
||||||
db 'video', 0, 0, 0
|
db 'video', 0, 0, 0
|
||||||
|
|
||||||
|
cga_color db CGA_COLOR_FG_LIGHT_GRAY
|
||||||
|
|
|
@ -46,20 +46,15 @@ kmain:
|
||||||
|
|
||||||
call mm_bootstrap
|
call mm_bootstrap
|
||||||
|
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
; init pmm (kend, 0x400000)
|
|
||||||
mov eax, kend
|
|
||||||
mov ebx, 0xC0400000
|
|
||||||
call pmm_init
|
call pmm_init
|
||||||
|
|
||||||
; init vmm
|
; init vmm
|
||||||
call mm_init
|
;call mm_init
|
||||||
|
|
||||||
mov eax, 0xC0400000
|
;mov eax, 0xC0400000
|
||||||
mov ebx, [stBootInfo.high_mem]
|
;mov ebx, [stBootInfo.high_mem]
|
||||||
add ebx, KERNEL_VIRT_BASE
|
;add ebx, KERNEL_VIRT_BASE
|
||||||
call pmm_free_range
|
;call pmm_free_range
|
||||||
|
|
||||||
;mov eax, [stBootInfo.low_mem]
|
;mov eax, [stBootInfo.low_mem]
|
||||||
;call heap_init
|
;call heap_init
|
||||||
|
@ -121,8 +116,7 @@ kmain:
|
||||||
include 'klog.inc'
|
include 'klog.inc'
|
||||||
include 'dev/console.inc'
|
include 'dev/console.inc'
|
||||||
include 'dev/dev.inc'
|
include 'dev/dev.inc'
|
||||||
include 'mm/bootstrap.inc'
|
include 'mm/mm.inc'
|
||||||
include 'mm/mm.old.inc'
|
|
||||||
include 'lock.inc'
|
include 'lock.inc'
|
||||||
include 'gdt.inc'
|
include 'gdt.inc'
|
||||||
include 'syscall.inc'
|
include 'syscall.inc'
|
||||||
|
|
|
@ -4,6 +4,12 @@
|
||||||
|
|
||||||
COM1 = 0x3F8
|
COM1 = 0x3F8
|
||||||
|
|
||||||
|
macro TRACE {
|
||||||
|
mov byte [cga_color], CGA_COLOR_FG_CYAN
|
||||||
|
call klog
|
||||||
|
mov byte [cga_color], CGA_COLOR_FG_LIGHT_GRAY
|
||||||
|
}
|
||||||
|
|
||||||
;; Function: _klog_print_str
|
;; Function: _klog_print_str
|
||||||
;;
|
;;
|
||||||
;; In: EAX - Null-terminated string to print
|
;; In: EAX - Null-terminated string to print
|
||||||
|
@ -213,7 +219,7 @@ klog:
|
||||||
; display log time
|
; display log time
|
||||||
call _klog_print_time
|
call _klog_print_time
|
||||||
|
|
||||||
mov ecx, 4
|
mov ecx, 8
|
||||||
.begin:
|
.begin:
|
||||||
mov al, [esi]
|
mov al, [esi]
|
||||||
or al, al
|
or al, al
|
||||||
|
@ -299,6 +305,8 @@ klog:
|
||||||
mov eax, szCRLF
|
mov eax, szCRLF
|
||||||
call _klog_print_str
|
call _klog_print_str
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
|
||||||
leave
|
leave
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ mm_bootstrap:
|
||||||
|
|
||||||
mov eax, 0x400000 + (1023 * PAGE_SIZE)
|
mov eax, 0x400000 + (1023 * PAGE_SIZE)
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
szMsgMmBootstrap db "MM: boostrap", 0
|
szMsgMmBootstrap db "MM: boostrap", 0
|
||||||
|
|
9
kernel/mm/mm.inc
Normal file
9
kernel/mm/mm.inc
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
MM_KERNEL_PTE_BASE = 0xFFC00000
|
||||||
|
|
||||||
|
include '../sys/mmu.inc'
|
||||||
|
include 'bootstrap.inc'
|
||||||
|
include 'pmm.inc'
|
||||||
|
include 'vmm.inc'
|
||||||
|
|
||||||
|
mm_init:
|
||||||
|
ret
|
|
@ -1,34 +0,0 @@
|
||||||
MM_PTE_BASE = 0xFFC00000
|
|
||||||
MM_VIRT_TEMP = 0xD0000000
|
|
||||||
|
|
||||||
;; EAX - Physical address to map
|
|
||||||
mm_map_temp:
|
|
||||||
mov ecx, MM_PTE_BASE + (MM_VIRT_TEMP shr 12)
|
|
||||||
or eax, 0x3
|
|
||||||
mov [ecx], eax
|
|
||||||
|
|
||||||
if COMPAT_I386
|
|
||||||
mov eax, 0x40000 + (1023 * PAGE_SIZE)
|
|
||||||
mov cr3, eax
|
|
||||||
else
|
|
||||||
mov eax, MM_VIRT_TEMP
|
|
||||||
invlpg [eax]
|
|
||||||
end if
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
mm_unmap_temp:
|
|
||||||
mov ecx, MM_PTE_BASE + (MM_VIRT_TEMP shr 12)
|
|
||||||
mov dword [ecx], 0
|
|
||||||
|
|
||||||
if COMPAT_I386
|
|
||||||
mov eax, 0x40000 + (1023 * PAGE_SIZE)
|
|
||||||
mov cr3, eax
|
|
||||||
else
|
|
||||||
mov eax, MM_VIRT_TEMP
|
|
||||||
invlpg [eax]
|
|
||||||
end if
|
|
||||||
ret
|
|
||||||
|
|
||||||
mm_init:
|
|
||||||
ret
|
|
|
@ -8,6 +8,13 @@
|
||||||
;; > └─────┘ └─────┘
|
;; > └─────┘ └─────┘
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
;;; MARK: macros and structs
|
||||||
|
|
||||||
|
;; Constant: PMM_VIRT_TEMP
|
||||||
|
PMM_VIRT_TEMP = 0xD0000000
|
||||||
|
PMM_BITMAP_USED = 0x0
|
||||||
|
PMM_BITMAP_FREE = 0x1
|
||||||
|
|
||||||
;; Macro: PAGE_ALIGN_UP reg
|
;; Macro: PAGE_ALIGN_UP reg
|
||||||
macro PAGE_ALIGN_UP reg {
|
macro PAGE_ALIGN_UP reg {
|
||||||
add reg, PAGE_SIZE - 1
|
add reg, PAGE_SIZE - 1
|
||||||
|
@ -26,37 +33,128 @@ struc PMMFreeRange {
|
||||||
}
|
}
|
||||||
DEFN PMMFreeRange
|
DEFN PMMFreeRange
|
||||||
|
|
||||||
|
;;; MARK: private functions
|
||||||
|
|
||||||
;; Function: _pmm_map_temp_page
|
;; Function: _pmm_map_temp_page
|
||||||
;;
|
;;
|
||||||
|
;; In:
|
||||||
|
;; EAX - physical address to map at <PMM_VIRT_TEMP>
|
||||||
_pmm_map_temp_page:
|
_pmm_map_temp_page:
|
||||||
|
mov ecx, MM_KERNEL_PTE_BASE + (PMM_VIRT_TEMP shr 12) * 4
|
||||||
|
or eax, 0x3
|
||||||
|
mov [ecx], eax
|
||||||
|
|
||||||
|
if CONFIG_COMPAT_I386
|
||||||
|
mov eax, 0x40000 + (1023 * PAGE_SIZE)
|
||||||
|
mov cr3, eax
|
||||||
|
else
|
||||||
|
mov eax, PMM_VIRT_TEMP
|
||||||
|
invlpg [eax]
|
||||||
|
end if
|
||||||
ret
|
ret
|
||||||
|
|
||||||
_pmm_unmap_temp_page:
|
_pmm_unmap_temp_page:
|
||||||
|
mov ecx, MM_KERNEL_PTE_BASE + (PMM_VIRT_TEMP shr 12) * 4
|
||||||
|
mov dword [ecx], 0
|
||||||
|
|
||||||
|
if CONFIG_COMPAT_I386
|
||||||
|
mov eax, 0x40000 + (1023 * PAGE_SIZE)
|
||||||
|
mov cr3, eax
|
||||||
|
else
|
||||||
|
mov eax, PMM_VIRT_TEMP
|
||||||
|
invlpg [eax]
|
||||||
|
end if
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;; Function: _pmm_init_region
|
||||||
|
;;
|
||||||
|
;; Add new memory region to the linked list.
|
||||||
|
;;
|
||||||
|
;; In:
|
||||||
|
;; EAX - Start
|
||||||
|
;; EDX - End
|
||||||
|
;;
|
||||||
_pmm_init_region:
|
_pmm_init_region:
|
||||||
push ebp
|
push ebp
|
||||||
mov ebp, esp
|
mov ebp, esp
|
||||||
|
|
||||||
|
push edi
|
||||||
|
push esi
|
||||||
|
|
||||||
|
mov edi, eax
|
||||||
|
mov esi, edx
|
||||||
|
|
||||||
|
push edx
|
||||||
push eax
|
push eax
|
||||||
call _pmm_map_temp_page
|
mov eax, szMsgPmmFreeRange
|
||||||
|
call klog
|
||||||
pop eax
|
pop eax
|
||||||
|
pop edx
|
||||||
|
|
||||||
|
call _pmm_map_temp_page
|
||||||
|
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
mov [MM_VIRT_TEMP], edx
|
mov [PMM_VIRT_TEMP], esi
|
||||||
mov [MM_VIRT_TEMP + PMMFreeRange.next], ecx
|
mov [PMM_VIRT_TEMP + PMMFreeRange.next], ecx
|
||||||
mov ecx, [pPMMFreeListHead]
|
mov ecx, [pPmmFreeListHead]
|
||||||
or ecx, ecx
|
or ecx, ecx
|
||||||
jz @f
|
jz @f
|
||||||
mov [MM_VIRT_TEMP + PMMFreeRange.next], ecx
|
mov [PMM_VIRT_TEMP + PMMFreeRange.next], ecx
|
||||||
@@:
|
@@:
|
||||||
mov [pPMMFreeListHead], eax
|
mov [pPmmFreeListHead], edi
|
||||||
|
|
||||||
call _pmm_unmap_temp_page
|
call _pmm_unmap_temp_page
|
||||||
|
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
|
||||||
leave
|
leave
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
_pmm_init_low_memory:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
mov eax, [stBootInfo.low_mem]
|
||||||
|
push eax
|
||||||
|
xor eax, eax
|
||||||
|
push eax
|
||||||
|
mov eax, szMsgPmmFreeRange
|
||||||
|
call klog
|
||||||
|
add esp, 8
|
||||||
|
|
||||||
|
; clear bitmap
|
||||||
|
push edi
|
||||||
|
xor eax, eax
|
||||||
|
mov ecx, 8
|
||||||
|
mov edi, au32PmmLowMemBitmap
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov edi, au32PmmLowMemBitmap
|
||||||
|
xor eax, eax
|
||||||
|
xor ecx, ecx
|
||||||
|
@@:
|
||||||
|
add eax, PAGE_SIZE
|
||||||
|
cmp eax, [stBootInfo.low_mem]
|
||||||
|
jg @f
|
||||||
|
mov ebx, 1
|
||||||
|
shl ebx, cl
|
||||||
|
or [edi], ebx
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, 32
|
||||||
|
jb @b
|
||||||
|
xor ecx, ecx
|
||||||
|
add edi, 4
|
||||||
|
jmp @b
|
||||||
|
|
||||||
|
@@:
|
||||||
|
pop edi
|
||||||
|
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
|
||||||
|
;;; MARK: public functions
|
||||||
|
|
||||||
;; Function: pmm_alloc
|
;; Function: pmm_alloc
|
||||||
;;
|
;;
|
||||||
;; In:
|
;; In:
|
||||||
|
@ -64,7 +162,18 @@ _pmm_init_region:
|
||||||
;;
|
;;
|
||||||
;; Out:
|
;; Out:
|
||||||
;; EAX - first page physical address, 0 on error
|
;; EAX - first page physical address, 0 on error
|
||||||
|
;;
|
||||||
pmm_alloc:
|
pmm_alloc:
|
||||||
|
mov eax, [pPmmFreeListHead]
|
||||||
|
or eax, eax
|
||||||
|
jnz @f
|
||||||
|
mov edx, ENOMEM
|
||||||
|
ret ; no memory left :'(
|
||||||
|
@@:
|
||||||
|
call _pmm_map_temp_page
|
||||||
|
|
||||||
|
call _pmm_unmap_temp_page
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;; Function: pmm_alloc_page
|
;; Function: pmm_alloc_page
|
||||||
|
@ -84,33 +193,47 @@ pmm_alloc_page:
|
||||||
pmm_free:
|
pmm_free:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;; Function: _pmm_init_region
|
|
||||||
;;
|
|
||||||
;; Add new memory region to the linked list.
|
|
||||||
;;
|
|
||||||
;; In:
|
|
||||||
;; EAX - Start
|
|
||||||
;; EDX - End
|
|
||||||
;;
|
|
||||||
|
|
||||||
;; Function: pmm_init
|
;; Function: pmm_init
|
||||||
;;
|
;;
|
||||||
;; Out:
|
;; Out:
|
||||||
;; EAX - return -1 on error
|
;; EAX - return -1 on error
|
||||||
pmm_init:
|
pmm_init:
|
||||||
mov eax, szMsgMmInit
|
mov eax, szMsgPmmInit
|
||||||
call klog
|
call klog
|
||||||
|
|
||||||
mov eax, kend
|
call _pmm_init_low_memory
|
||||||
|
|
||||||
|
if CONFIG_TRACE_PMM
|
||||||
|
mov byte [cga_color], CGA_COLOR_FG_BLUE
|
||||||
|
push dword [au32PmmLowMemBitmap + 28]
|
||||||
|
push dword [au32PmmLowMemBitmap + 24]
|
||||||
|
push dword [au32PmmLowMemBitmap + 20]
|
||||||
|
push dword [au32PmmLowMemBitmap + 16]
|
||||||
|
push dword [au32PmmLowMemBitmap + 12]
|
||||||
|
push dword [au32PmmLowMemBitmap + 8]
|
||||||
|
push dword [au32PmmLowMemBitmap + 4]
|
||||||
|
push dword [au32PmmLowMemBitmap]
|
||||||
|
|
||||||
|
mov eax, szTracePmmBitmap
|
||||||
|
|
||||||
|
TRACE
|
||||||
|
|
||||||
|
add esp, 32
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov eax, kend - KERNEL_VIRT_BASE
|
||||||
PAGE_ALIGN_UP eax
|
PAGE_ALIGN_UP eax
|
||||||
|
|
||||||
mov edx, 0x400000
|
mov edx, 0x400000
|
||||||
sub edx, eax
|
sub edx, eax
|
||||||
|
|
||||||
jle @f
|
jle @f
|
||||||
cmp edx, PAGE_SIZE
|
cmp edx, PAGE_SIZE
|
||||||
jle @f
|
jle @f
|
||||||
|
|
||||||
mov edx, 0x400000
|
mov edx, 0x400000
|
||||||
|
|
||||||
call _pmm_init_region
|
call _pmm_init_region
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
|
@ -122,10 +245,19 @@ pmm_init:
|
||||||
xor eax, eax ; TODO: check if enough memory and so on
|
xor eax, eax ; TODO: check if enough memory and so on
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;;; MARK: variables
|
||||||
|
|
||||||
;; Variable: pPMMFreeListHead
|
;; Variable: pPMMFreeListHead
|
||||||
;; Hold first free list entry physical address
|
;; Hold first free list entry physical address
|
||||||
pPMMFreeListHead dd 0
|
pPmmFreeListHead dd 0
|
||||||
|
|
||||||
|
au32PmmLowMemBitmap rd 8
|
||||||
|
|
||||||
szMsgPmmInit db "PMM: initialize", 0
|
szMsgPmmInit db "PMM: initialize", 0
|
||||||
szMsgPmmFreeRange db "PMM: add free memory region %x - %x", 0
|
szMsgPmmFreeRange db "PMM: add free memory region %x - %x", 0
|
||||||
szErrorNoMemLeft db "Error(PMM): no free memory left", 0
|
szErrorNoMemLeft db "Error(PMM): no free memory left", 0
|
||||||
|
if CONFIG_TRACE_PMM
|
||||||
|
szTracePmmBitmap db "Trace(PMM): low memory bitmap", CR, LF, \
|
||||||
|
" %x", CR, LF, " %x", CR, LF, " %x", CR, LF, " %x", CR, LF, \
|
||||||
|
" %x", CR, LF, " %x", CR, LF, " %x", CR, LF, " %x", 0
|
||||||
|
end if
|
||||||
|
|
|
@ -1,2 +1,13 @@
|
||||||
ENXIO = 6
|
;; File: errno.inc
|
||||||
|
|
||||||
|
;; Constant: ENODEV
|
||||||
|
;; No such device.
|
||||||
ENODEV = 19
|
ENODEV = 19
|
||||||
|
|
||||||
|
;; Constant: ENOMEM
|
||||||
|
;; Not enough space.
|
||||||
|
ENOMEM = 20
|
||||||
|
|
||||||
|
;; Constant: ENXIO
|
||||||
|
;; No such device or address.
|
||||||
|
ENXIO = 6
|
||||||
|
|
Loading…
Reference in a new issue