forked from KolibriOS/kolibrios
initial buddy allocator
git-svn-id: svn://kolibrios.org@843 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
059b851217
commit
28b0948e61
@ -332,7 +332,7 @@ end virtual
|
|||||||
|
|
||||||
LAST_PAGE equ 0x0340000
|
LAST_PAGE equ 0x0340000
|
||||||
|
|
||||||
sys_pgmap equ (OS_BASE+LAST_PAGE)
|
;sys_pgmap equ (OS_BASE+LAST_PAGE)
|
||||||
|
|
||||||
twdw equ 0x3000 ;(CURRENT_TASK-window_data)
|
twdw equ 0x3000 ;(CURRENT_TASK-window_data)
|
||||||
|
|
||||||
|
@ -577,7 +577,7 @@ proc kernel_alloc stdcall, size:dword
|
|||||||
push ebx
|
push ebx
|
||||||
stdcall alloc_pages, ebx
|
stdcall alloc_pages, ebx
|
||||||
pop ecx ; yes ecx!!!
|
pop ecx ; yes ecx!!!
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz .err
|
jz .err
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
|
@ -8,97 +8,6 @@
|
|||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc alloc_page
|
|
||||||
|
|
||||||
pushfd
|
|
||||||
cli
|
|
||||||
push ebx
|
|
||||||
mov ebx, [page_start]
|
|
||||||
mov ecx, [page_end]
|
|
||||||
.l1:
|
|
||||||
bsf eax,[ebx];
|
|
||||||
jnz .found
|
|
||||||
add ebx,4
|
|
||||||
cmp ebx, ecx
|
|
||||||
jb .l1
|
|
||||||
pop ebx
|
|
||||||
popfd
|
|
||||||
xor eax,eax
|
|
||||||
ret
|
|
||||||
.found:
|
|
||||||
btr [ebx], eax
|
|
||||||
mov [page_start],ebx
|
|
||||||
sub ebx, sys_pgmap
|
|
||||||
lea eax, [eax+ebx*8]
|
|
||||||
shl eax, 12
|
|
||||||
dec [pg_data.pages_free]
|
|
||||||
pop ebx
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc alloc_pages stdcall, count:dword
|
|
||||||
pushfd
|
|
||||||
push ebx
|
|
||||||
push edi
|
|
||||||
cli
|
|
||||||
mov eax, [count]
|
|
||||||
add eax, 7
|
|
||||||
shr eax, 3
|
|
||||||
mov [count], eax
|
|
||||||
cmp eax, [pg_data.pages_free]
|
|
||||||
ja .fail
|
|
||||||
|
|
||||||
mov ecx, [page_start]
|
|
||||||
mov ebx, [page_end]
|
|
||||||
.find:
|
|
||||||
mov edx, [count]
|
|
||||||
mov edi, ecx
|
|
||||||
.match:
|
|
||||||
cmp byte [ecx], 0xFF
|
|
||||||
jne .next
|
|
||||||
dec edx
|
|
||||||
jz .ok
|
|
||||||
inc ecx
|
|
||||||
cmp ecx,ebx
|
|
||||||
jb .match
|
|
||||||
.fail:
|
|
||||||
xor eax, eax
|
|
||||||
pop edi
|
|
||||||
pop ebx
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
.next:
|
|
||||||
inc ecx
|
|
||||||
cmp ecx, ebx
|
|
||||||
jb .find
|
|
||||||
pop edi
|
|
||||||
pop ebx
|
|
||||||
popfd
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.ok:
|
|
||||||
sub ecx, edi
|
|
||||||
inc ecx
|
|
||||||
push esi
|
|
||||||
mov esi, edi
|
|
||||||
xor eax, eax
|
|
||||||
rep stosb
|
|
||||||
sub esi, sys_pgmap
|
|
||||||
shl esi, 3+12
|
|
||||||
mov eax, esi
|
|
||||||
mov ebx, [count]
|
|
||||||
shl ebx, 3
|
|
||||||
sub [pg_data.pages_free], ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
pop ebx
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
|
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
|
||||||
push ebx
|
push ebx
|
||||||
@ -123,23 +32,24 @@ map_space: ;not implemented
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc free_page
|
proc free_page
|
||||||
|
|
||||||
;arg: eax page address
|
;arg: eax page address
|
||||||
pushfd
|
; pushfd
|
||||||
cli
|
; cli
|
||||||
shr eax, 12 ;page index
|
; shr eax, 12 ;page index
|
||||||
bts dword [sys_pgmap], eax ;that's all!
|
; bts dword [sys_pgmap], eax ;that's all!
|
||||||
cmc
|
; cmc
|
||||||
adc [pg_data.pages_free], 0
|
; adc [pg_data.pages_free], 0
|
||||||
shr eax, 3
|
; shr eax, 3
|
||||||
and eax, not 3 ;dword offset from page_map
|
; and eax, not 3 ;dword offset from page_map
|
||||||
add eax, sys_pgmap
|
; add eax, sys_pgmap
|
||||||
cmp [page_start], eax
|
; cmp [page_start], eax
|
||||||
ja @f
|
; ja @f
|
||||||
popfd
|
; popfd
|
||||||
ret
|
; ret
|
||||||
@@:
|
;@@:
|
||||||
mov [page_start], eax
|
; mov [page_start], eax
|
||||||
popfd
|
; popfd
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@ -235,9 +145,9 @@ release_pages:
|
|||||||
shr esi, 10
|
shr esi, 10
|
||||||
add esi, page_tabs
|
add esi, page_tabs
|
||||||
|
|
||||||
mov ebp, [pg_data.pages_free]
|
; mov ebp, [pg_data.pages_free]
|
||||||
mov ebx, [page_start]
|
; mov ebx, [page_start]
|
||||||
mov edx, sys_pgmap
|
; mov edx, sys_pgmap
|
||||||
@@:
|
@@:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
xchg eax, [esi]
|
xchg eax, [esi]
|
||||||
@ -245,20 +155,20 @@ release_pages:
|
|||||||
invlpg [edi]
|
invlpg [edi]
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
test eax, 1
|
; test eax, 1
|
||||||
jz .next
|
; jz .next
|
||||||
|
|
||||||
shr eax, 12
|
; shr eax, 12
|
||||||
bts [edx], eax
|
; bts [edx], eax
|
||||||
cmc
|
; cmc
|
||||||
adc ebp, 0
|
; adc ebp, 0
|
||||||
shr eax, 3
|
; shr eax, 3
|
||||||
and eax, -4
|
; and eax, -4
|
||||||
add eax, edx
|
; add eax, edx
|
||||||
cmp eax, ebx
|
; cmp eax, ebx
|
||||||
jae .next
|
; jae .next
|
||||||
|
|
||||||
mov ebx, eax
|
; mov ebx, eax
|
||||||
.next:
|
.next:
|
||||||
add edi, 0x1000
|
add edi, 0x1000
|
||||||
add esi, 4
|
add esi, 4
|
||||||
@ -1308,12 +1218,14 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
_balloc: ; gcc fastcall
|
_balloc: ; gcc fastcall
|
||||||
|
@balloc@4:
|
||||||
|
|
||||||
mov eax, [_last_page]
|
|
||||||
|
mov eax, [_pg_balloc]
|
||||||
add ecx, 4095
|
add ecx, 4095
|
||||||
and ecx, -4096
|
and ecx, -4096
|
||||||
add ecx, eax
|
add ecx, eax
|
||||||
mov [_last_page], ecx
|
mov [_pg_balloc], ecx
|
||||||
add eax, OS_BASE
|
add eax, OS_BASE
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -380,8 +380,8 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
|||||||
else
|
else
|
||||||
lea eax, [eax+ebx+2] ;all requested memory
|
lea eax, [eax+ebx+2] ;all requested memory
|
||||||
end if
|
end if
|
||||||
cmp eax, [pg_data.pages_free]
|
; cmp eax, [pg_data.pages_free]
|
||||||
ja .fail
|
; ja .fail
|
||||||
|
|
||||||
call alloc_page
|
call alloc_page
|
||||||
test eax, eax
|
test eax, eax
|
||||||
|
@ -110,7 +110,7 @@ kernel_file db 'KERNEL MNT'
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
_last_page dd LAST_PAGE
|
_pg_balloc dd LAST_PAGE
|
||||||
|
|
||||||
;supported videomodes
|
;supported videomodes
|
||||||
mode_1280_1024_32:
|
mode_1280_1024_32:
|
||||||
@ -290,6 +290,8 @@ large_block_list rd 31
|
|||||||
mem_block_mask rd 2
|
mem_block_mask rd 2
|
||||||
large_block_mask rd 1
|
large_block_mask rd 1
|
||||||
|
|
||||||
|
_z_core rd 50
|
||||||
|
|
||||||
mem_used.fd rd 1
|
mem_used.fd rd 1
|
||||||
mem_used.bk rd 1
|
mem_used.bk rd 1
|
||||||
|
|
||||||
|
@ -293,76 +293,8 @@ MEM_WB equ 6 ;write-back memory
|
|||||||
MEM_WC equ 1 ;write combined memory
|
MEM_WC equ 1 ;write combined memory
|
||||||
MEM_UC equ 0 ;uncached memory
|
MEM_UC equ 0 ;uncached memory
|
||||||
|
|
||||||
align 4
|
|
||||||
init_mem:
|
|
||||||
|
|
||||||
mov ecx, [BOOT_VAR + 0x9100]
|
include 'core/mm.asm'
|
||||||
mov esi, BOOT_VAR + 0x9104
|
|
||||||
xor eax, eax
|
|
||||||
@@:
|
|
||||||
cmp dword [esi+16], 1
|
|
||||||
jne .next
|
|
||||||
mov edx, [esi+8]
|
|
||||||
cmp eax, [esi+8]
|
|
||||||
ja .next
|
|
||||||
|
|
||||||
mov eax, [esi+8]
|
|
||||||
.next:
|
|
||||||
add esi, 20
|
|
||||||
loop @B
|
|
||||||
|
|
||||||
and eax, -4096
|
|
||||||
|
|
||||||
mov [MEM_AMOUNT], eax
|
|
||||||
mov [pg_data.mem_amount], eax
|
|
||||||
|
|
||||||
shr eax, 12
|
|
||||||
mov edx, eax
|
|
||||||
mov [pg_data.pages_count], eax
|
|
||||||
shr eax, 3
|
|
||||||
and eax, -4
|
|
||||||
mov [pg_data.pagemap_size], eax
|
|
||||||
mov ecx, eax
|
|
||||||
fastcall _balloc
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
init_page_map:
|
|
||||||
|
|
||||||
mov edi, sys_pgmap
|
|
||||||
mov ecx, [pg_data.pagemap_size]
|
|
||||||
shr ecx, 2
|
|
||||||
or eax, -1
|
|
||||||
cld
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
mov ecx, [_last_page]
|
|
||||||
mov edx, [pg_data.pages_count]
|
|
||||||
shr ecx, 12
|
|
||||||
sub edx, ecx
|
|
||||||
mov [pg_data.pages_free], edx
|
|
||||||
|
|
||||||
mov edi, sys_pgmap
|
|
||||||
mov ebx, ecx
|
|
||||||
shr ecx, 5
|
|
||||||
xor eax, eax
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
not eax
|
|
||||||
mov ecx, ebx
|
|
||||||
and ecx, 31
|
|
||||||
shl eax, cl
|
|
||||||
mov [edi], eax
|
|
||||||
mov [page_start], edi;
|
|
||||||
|
|
||||||
mov ebx, sys_pgmap
|
|
||||||
add ebx, [pg_data.pagemap_size]
|
|
||||||
mov [page_end], ebx
|
|
||||||
|
|
||||||
mov [pg_data.pg_mutex], 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
@ -398,8 +330,6 @@ high_code:
|
|||||||
|
|
||||||
; MEMORY MODEL
|
; MEMORY MODEL
|
||||||
|
|
||||||
call init_mem
|
|
||||||
|
|
||||||
mov ecx, 1280*1024
|
mov ecx, 1280*1024
|
||||||
fastcall _balloc
|
fastcall _balloc
|
||||||
mov [_display_data], eax
|
mov [_display_data], eax
|
||||||
@ -437,8 +367,8 @@ high_code:
|
|||||||
|
|
||||||
call init_kernel_heap ; FIXME initialize heap after pager
|
call init_kernel_heap ; FIXME initialize heap after pager
|
||||||
|
|
||||||
call init_page_map
|
call _init_mm
|
||||||
|
mov [pg_data.pg_mutex], 0
|
||||||
|
|
||||||
; SAVE REAL MODE VARIABLES
|
; SAVE REAL MODE VARIABLES
|
||||||
mov ax, [BOOT_VAR + 0x9031]
|
mov ax, [BOOT_VAR + 0x9031]
|
||||||
|
Loading…
Reference in New Issue
Block a user