forked from KolibriOS/kolibrios
d8e9ce1559
git-svn-id: svn://kolibrios.org@1 a494cfbc-eb01-0410-851d-a64ba20cac60
218 lines
5.3 KiB
PHP
218 lines
5.3 KiB
PHP
virtual at 0
|
|
physical_mem_block:
|
|
.start rd 1
|
|
.size rd 1
|
|
.flags rd 1 ;0-free, pid-used.
|
|
.sizeof:
|
|
end virtual
|
|
max_physical_mem_blocks = 24
|
|
uglobal
|
|
num_physical_mem_blocks rd 1
|
|
physical_mem_blocks rd 3*max_physical_mem_blocks
|
|
endg
|
|
Init_Physical_Memory_Manager:
|
|
pushad
|
|
mov edi,physical_mem_blocks
|
|
mov ecx,3*max_physical_mem_blocks
|
|
xor eax,eax
|
|
cld
|
|
rep stosd
|
|
mov dword [num_physical_mem_blocks],2
|
|
mov [physical_mem_blocks+physical_mem_block.start],0x60000
|
|
mov [physical_mem_blocks+physical_mem_block.size],0x20000 ;128Kb
|
|
mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.start],0x780000
|
|
mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.size],0x80000 ;512Kb
|
|
popad
|
|
ret
|
|
Insert_Block:
|
|
;input:
|
|
; eax - handle
|
|
;output:
|
|
; none
|
|
push eax ecx esi edi
|
|
sub eax,[num_physical_mem_blocks]
|
|
neg eax
|
|
mov edi,physical_mem_block.sizeof
|
|
imul eax,edi
|
|
shr eax,2
|
|
mov ecx,eax
|
|
mov esi,[num_physical_mem_blocks]
|
|
imul esi,edi
|
|
add esi,physical_mem_blocks
|
|
lea edi,[esi+physical_mem_block.sizeof]
|
|
std
|
|
rep movsd
|
|
pop edi esi ecx eax
|
|
ret
|
|
Delete_Block:
|
|
;input:
|
|
; eax - handle
|
|
;output:
|
|
; none
|
|
pushad
|
|
mov edi,eax
|
|
sub eax,[num_physical_mem_blocks]
|
|
neg eax
|
|
dec eax
|
|
mov esi,physical_mem_block.sizeof
|
|
imul eax,esi
|
|
imul edi,esi
|
|
add edi,physical_mem_blocks
|
|
lea esi,[edi+physical_mem_block.sizeof]
|
|
mov ecx,eax
|
|
shr ecx,2
|
|
cld
|
|
rep movsd
|
|
popad
|
|
ret
|
|
Allocate_Physical_Block:
|
|
;input:
|
|
; eax - size
|
|
;output:
|
|
; eax - address or 0 if not enough memory.
|
|
pushad
|
|
cmp [num_physical_mem_blocks],max_physical_mem_blocks
|
|
jge .error
|
|
mov ebx,eax
|
|
xor eax,eax
|
|
mov esi,physical_mem_blocks
|
|
.loop:
|
|
cmp dword [esi+physical_mem_block.flags],0
|
|
jnz .next
|
|
cmp [esi+physical_mem_block.size],ebx
|
|
jg .addblock
|
|
jz .noaddblock
|
|
.next:
|
|
inc eax
|
|
add esi,physical_mem_block.sizeof
|
|
cmp eax,[num_physical_mem_blocks]
|
|
jl .loop
|
|
.error:
|
|
popad
|
|
xor eax,eax
|
|
ret
|
|
.noaddblock:
|
|
mov eax,[esi+physical_mem_block.start]
|
|
mov [esp+28],eax
|
|
mov eax,[0x3010]
|
|
mov eax,[eax+0x4]
|
|
mov [esi+physical_mem_block.flags],eax
|
|
popad
|
|
ret
|
|
.addblock:
|
|
call Insert_Block
|
|
inc dword [num_physical_mem_blocks]
|
|
mov eax,[esi+physical_mem_block.start]
|
|
mov [esp+28],eax
|
|
mov ecx,[0x3010]
|
|
mov ecx,[ecx+0x4]
|
|
mov [esi+physical_mem_block.flags],ecx
|
|
mov ecx,[esi+physical_mem_block.size]
|
|
mov [esi+physical_mem_block.size],ebx
|
|
sub ecx,ebx
|
|
mov [esi+physical_mem_block.sizeof+physical_mem_block.size],ecx
|
|
add ebx,[esi+physical_mem_block.start]
|
|
mov [esi+physical_mem_block.sizeof+physical_mem_block.start],ebx
|
|
mov dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0
|
|
popad
|
|
ret
|
|
Free_Physical_Block:
|
|
;input:
|
|
; eax - address
|
|
;output:
|
|
; none
|
|
pushad
|
|
test eax,eax
|
|
jz .ret
|
|
mov ebx,eax
|
|
xor eax,eax
|
|
mov esi,physical_mem_blocks
|
|
.loop:
|
|
cmp ebx,[esi+physical_mem_block.start]
|
|
jz .endloop
|
|
inc eax
|
|
add esi,physical_mem_block.sizeof
|
|
cmp eax,[num_physical_mem_blocks]
|
|
jl .loop
|
|
jmp .ret
|
|
.endloop:
|
|
mov dword [esi+physical_mem_block.flags],0
|
|
test eax,eax
|
|
jz .no_union_previous
|
|
cmp dword [esi-physical_mem_block.sizeof+physical_mem_block.flags],0
|
|
jnz .no_union_previous
|
|
mov ebx,[esi-physical_mem_block.sizeof+physical_mem_block.start]
|
|
add ebx,[esi-physical_mem_block.sizeof+physical_mem_block.size]
|
|
cmp ebx,[esi+physical_mem_block.start]
|
|
jnz .no_union_previous
|
|
mov ebx,[esi+physical_mem_block.size]
|
|
add [esi-physical_mem_block.sizeof+physical_mem_block.size],ebx
|
|
call Delete_Block
|
|
dec eax
|
|
dec [num_physical_mem_blocks]
|
|
.no_union_previous:
|
|
inc eax
|
|
cmp eax,[num_physical_mem_blocks]
|
|
jge .no_union_next
|
|
cmp dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0
|
|
jnz .no_union_next
|
|
mov ebx,[esi+physical_mem_block.start]
|
|
add ebx,[esi+physical_mem_block.size]
|
|
cmp ebx,[esi+physical_mem_block.sizeof+physical_mem_block.start]
|
|
jnz .no_union_next
|
|
mov ebx,[esi+physical_mem_block.sizeof+physical_mem_block.size]
|
|
add [esi+physical_mem_block.size],ebx
|
|
call Delete_Block
|
|
dec [num_physical_mem_blocks]
|
|
.no_union_next:
|
|
.ret:
|
|
popad
|
|
ret
|
|
|
|
sys_allocate_physical_block:
|
|
;eax - subfunction number
|
|
mov eax,ebx
|
|
call Allocate_Physical_Block
|
|
mov [esp+36],eax
|
|
ret
|
|
sys_free_physical_block:
|
|
;eax - subfunction number
|
|
mov eax,ebx
|
|
call Free_Physical_Block
|
|
ret
|
|
sys_set_buffer:
|
|
add ecx,std_application_base_address
|
|
isys_set_buffer: ;for using in kernel
|
|
;eax - subfunction number
|
|
;ebx - physical address
|
|
;ecx - buffer start
|
|
;edx - buffer size
|
|
lea edi,[ebx+second_base_address]
|
|
mov esi,ecx
|
|
mov ecx,edx
|
|
rep movsb
|
|
ret
|
|
sys_get_buffer:
|
|
add ecx,std_application_base_address
|
|
isys_get_buffer: ;for using in kernel
|
|
;eax - subfunction number
|
|
;ebx - physical address
|
|
;ecx - buffer start
|
|
;edx - buffer size
|
|
mov edi,ecx
|
|
lea esi,[ebx+second_base_address]
|
|
mov ecx,edx
|
|
rep movsb
|
|
ret
|
|
sys_internal_services:
|
|
cmp eax,4
|
|
jle sys_sheduler
|
|
cmp eax,5
|
|
jz sys_allocate_physical_block
|
|
cmp eax,6
|
|
jz sys_free_physical_block
|
|
cmp eax,7
|
|
jz sys_set_buffer
|
|
cmp eax,8
|
|
jz sys_get_buffer
|
|
ret |