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 | ||||
| 
 | ||||
| KERNEL	= vmstupid.sys | ||||
| 
 | ||||
| MM_SRCS = bootstrap.inc \
 | ||||
| 			mm.inc \
 | ||||
| 			pmm.inc \
 | ||||
| 			vmm.inc | ||||
| 
 | ||||
| SRCS	= kernel.asm \
 | ||||
| 			const.inc \
 | ||||
| 			klog.inc \
 | ||||
| 			mm/mm.old.inc \
 | ||||
| 			mm/pmm.old.inc \
 | ||||
| 			$(addprefix mm/, $(MM_SRCS)) \
 | ||||
| 			lock.inc \
 | ||||
| 			gdt.inc \
 | ||||
| 			isr.inc \
 | ||||
|  |  | |||
|  | @ -16,3 +16,7 @@ BUILD_DATE     equ "@DATE@" | |||
| ; ------------- OTHER ----------- | ||||
| CR   = 0x0D | ||||
| LF   = 0x0A | ||||
| 
 | ||||
| 
 | ||||
| CONFIG_COMPAT_I386 = 0 | ||||
| CONFIG_TRACE_PMM = 1 | ||||
|  |  | |||
|  | @ -11,6 +11,40 @@ CGA_CURSOR_LOW  = 0xF | |||
| CGA_COLUMNS = 80 | ||||
| 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 | ||||
| 	;;  | ||||
| 	;; Out: | ||||
|  | @ -94,7 +128,7 @@ cga_putc: | |||
| 	mov cx, [ebp-0x2] | ||||
| 	shl cx, 1 | ||||
| 	add edx, ecx | ||||
| 	mov ah, 0x07 | ||||
| 	mov ah, byte [cga_color] | ||||
| 	mov word [edx], ax | ||||
| 	mov cx, [ebp-0x2] | ||||
| 	inc cx | ||||
|  | @ -134,3 +168,5 @@ cga_putc: | |||
| 
 | ||||
| cga_device: | ||||
| 	db 'video', 0, 0, 0 | ||||
| 
 | ||||
| cga_color db CGA_COLOR_FG_LIGHT_GRAY | ||||
|  |  | |||
|  | @ -46,20 +46,15 @@ kmain: | |||
| 
 | ||||
| 	call mm_bootstrap | ||||
| 
 | ||||
| 	xchg bx, bx | ||||
| 
 | ||||
| 	; init pmm (kend, 0x400000) | ||||
| 	mov eax, kend | ||||
| 	mov ebx, 0xC0400000 | ||||
| 	call pmm_init | ||||
| 
 | ||||
| 	; init vmm | ||||
| 	call mm_init | ||||
| 	;call mm_init | ||||
| 
 | ||||
| 	mov eax, 0xC0400000 | ||||
| 	mov ebx, [stBootInfo.high_mem] | ||||
| 	add ebx, KERNEL_VIRT_BASE | ||||
| 	call pmm_free_range | ||||
| 	;mov eax, 0xC0400000 | ||||
| 	;mov ebx, [stBootInfo.high_mem] | ||||
| 	;add ebx, KERNEL_VIRT_BASE | ||||
| 	;call pmm_free_range | ||||
| 
 | ||||
| 	;mov eax, [stBootInfo.low_mem] | ||||
| 	;call heap_init | ||||
|  | @ -121,8 +116,7 @@ kmain: | |||
| 	include 'klog.inc' | ||||
| 	include 'dev/console.inc' | ||||
| 	include 'dev/dev.inc' | ||||
| 	include 'mm/bootstrap.inc' | ||||
| 	include 'mm/mm.old.inc' | ||||
| 	include 'mm/mm.inc' | ||||
| 	include 'lock.inc' | ||||
| 	include 'gdt.inc' | ||||
| 	include 'syscall.inc' | ||||
|  |  | |||
|  | @ -4,6 +4,12 @@ | |||
| 
 | ||||
| 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 | ||||
| 	;; | ||||
| 	;; In: EAX - Null-terminated string to print | ||||
|  | @ -213,7 +219,7 @@ klog: | |||
| 	; display log time | ||||
| 	call _klog_print_time | ||||
| 
 | ||||
| 	mov ecx, 4 | ||||
| 	mov ecx, 8 | ||||
| .begin: | ||||
| 	mov al, [esi] | ||||
| 	or al, al | ||||
|  | @ -299,6 +305,8 @@ klog: | |||
| 	mov eax, szCRLF | ||||
| 	call _klog_print_str | ||||
| 
 | ||||
| 	pop esi | ||||
| 
 | ||||
| 	leave | ||||
| 	ret | ||||
| 
 | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ mm_bootstrap: | |||
| 
 | ||||
| 	mov eax, 0x400000 + (1023 * PAGE_SIZE) | ||||
| 	mov cr3, eax | ||||
|   | ||||
| 	 | ||||
| 	ret | ||||
| 
 | ||||
| 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 { | ||||
| 	add reg, PAGE_SIZE - 1 | ||||
|  | @ -26,37 +33,128 @@ struc PMMFreeRange { | |||
| } | ||||
| DEFN PMMFreeRange | ||||
| 
 | ||||
| ;;; MARK: private functions | ||||
| 
 | ||||
| 	;; Function: _pmm_map_temp_page | ||||
| 	;; | ||||
| 	;; In: | ||||
| 	;;   EAX - physical address to map at <PMM_VIRT_TEMP> | ||||
| _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 | ||||
| 
 | ||||
| _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 | ||||
| 
 | ||||
| 	;; Function: _pmm_init_region | ||||
| 	;; | ||||
| 	;; Add new memory region to the linked list. | ||||
| 	;; | ||||
| 	;; In: | ||||
| 	;;    EAX - Start | ||||
| 	;;    EDX - End | ||||
| 	;; | ||||
| _pmm_init_region: | ||||
| 	push ebp | ||||
| 	mov ebp, esp | ||||
| 
 | ||||
| 	push edi | ||||
| 	push esi | ||||
| 
 | ||||
| 	mov edi, eax | ||||
| 	mov esi, edx | ||||
| 
 | ||||
| 	push edx | ||||
| 	push eax | ||||
| 	call _pmm_map_temp_page | ||||
| 	mov eax, szMsgPmmFreeRange | ||||
| 	call klog | ||||
| 	pop eax | ||||
| 	pop edx | ||||
| 
 | ||||
| 	call _pmm_map_temp_page | ||||
| 
 | ||||
| 	xor ecx, ecx | ||||
| 	mov [MM_VIRT_TEMP], edx | ||||
| 	mov [MM_VIRT_TEMP + PMMFreeRange.next], ecx | ||||
| 	mov ecx, [pPMMFreeListHead] | ||||
| 	mov [PMM_VIRT_TEMP], esi | ||||
| 	mov [PMM_VIRT_TEMP + PMMFreeRange.next], ecx | ||||
| 	mov ecx, [pPmmFreeListHead] | ||||
| 	or ecx, ecx | ||||
| 	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 | ||||
| 
 | ||||
| 	pop edi | ||||
| 	pop esi | ||||
| 
 | ||||
| 	leave | ||||
| 	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 | ||||
| 	;;  | ||||
| 	;; In: | ||||
|  | @ -64,7 +162,18 @@ _pmm_init_region: | |||
| 	;; | ||||
| 	;; Out: | ||||
| 	;;    EAX - first page physical address, 0 on error | ||||
| 	;; | ||||
| 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 | ||||
| 
 | ||||
| 	;; Function: pmm_alloc_page | ||||
|  | @ -84,33 +193,47 @@ pmm_alloc_page: | |||
| pmm_free: | ||||
| 	ret | ||||
| 
 | ||||
| 	;; Function: _pmm_init_region | ||||
| 	;; | ||||
| 	;; Add new memory region to the linked list. | ||||
| 	;; | ||||
| 	;; In: | ||||
| 	;;    EAX - Start | ||||
| 	;;    EDX - End | ||||
| 	;; | ||||
| 
 | ||||
| 	;; Function: pmm_init | ||||
| 	;;  | ||||
| 	;; Out: | ||||
| 	;;    EAX - return -1 on error | ||||
| pmm_init: | ||||
| 	mov eax, szMsgMmInit | ||||
| 	mov eax, szMsgPmmInit | ||||
| 	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 | ||||
| 
 | ||||
| 	mov edx, 0x400000 | ||||
| 	sub edx, eax | ||||
| 
 | ||||
| 	jle @f | ||||
| 	cmp edx, PAGE_SIZE | ||||
| 	jle @f | ||||
| 
 | ||||
| 	mov edx, 0x400000 | ||||
| 
 | ||||
| 	call _pmm_init_region | ||||
| 
 | ||||
| @@: | ||||
|  | @ -122,10 +245,19 @@ pmm_init: | |||
| 	xor eax, eax ; TODO: check if enough memory and so on | ||||
| 	ret | ||||
| 
 | ||||
| ;;; MARK: variables | ||||
| 
 | ||||
| 	;; Variable: pPMMFreeListHead | ||||
| 	;; Hold first free list entry physical address | ||||
| pPMMFreeListHead dd 0 | ||||
| pPmmFreeListHead dd 0 | ||||
| 
 | ||||
| au32PmmLowMemBitmap rd 8 | ||||
| 
 | ||||
| szMsgPmmInit      db "PMM: initialize", 0 | ||||
| szMsgPmmFreeRange db "PMM: add free memory region %x - %x", 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 | ||||
| 
 | ||||
| 	;; Constant: ENOMEM | ||||
| 	;; Not enough space. | ||||
| ENOMEM = 20 | ||||
| 
 | ||||
| 	;; Constant: ENXIO | ||||
| 	;; No such device or address. | ||||
| ENXIO  = 6  | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue