/kernel/trunk/core/heap.inc |
---|
613,6 → 613,7 |
mov esi, [PROC_BASE+APPDATA.mem_size+ebx] |
add esi, 4095 |
and esi, not 4095 |
mov [PROC_BASE+APPDATA.mem_size+ebx], esi |
mov eax, HEAP_TOP |
mov [PROC_BASE+APPDATA.heap_base+ebx], esi |
mov [PROC_BASE+APPDATA.heap_top+ebx], eax |
664,7 → 665,7 |
shr edx, 12 |
mov [pages_tab+edx*4], eax |
@@: |
@@: |
or ecx, USED_BLOCK |
mov [pages_tab+ebx*4], ecx |
shr ecx, 12 |
676,6 → 677,14 |
dec ecx |
jnz @B |
mov edx, [CURRENT_TASK] |
shl edx, 8 |
mov ebx, [alloc_size] |
add ebx, 0xFFF |
and ebx, not 0xFFF |
add ebx, [PROC_BASE+APPDATA.mem_size+edx] |
call update_mem_size |
mov eax, esi |
add eax, 4096 |
sub eax, new_app_base |
702,6 → 711,7 |
test esi, esi |
jz .exit |
xor ebx, ebx |
sub esi, 4096 |
shr esi, 12 |
mov eax, [pages_tab+esi*4] |
715,6 → 725,7 |
inc esi |
sub ecx, 4096 |
shr ecx, 12 |
mov ebx, ecx |
.release: |
xor eax, eax |
xchg eax, [pages_tab+esi*4] |
726,10 → 737,13 |
dec ecx |
jnz .release |
.not_used: |
mov ebx, [CURRENT_TASK] |
shl ebx, 8 |
mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base |
mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top |
mov edx, [CURRENT_TASK] |
shl edx, 8 |
mov esi, dword [edx+PROC_BASE+APPDATA.heap_base]; heap_base |
mov edi, dword [edx+PROC_BASE+APPDATA.heap_top]; heap_top |
sub ebx, [edx+PROC_BASE+APPDATA.mem_size] |
neg ebx |
call update_mem_size |
add esi, new_app_base |
add edi, new_app_base |
shr esi, 12 |
/kernel/trunk/core/memory.inc |
---|
475,33 → 475,9 |
jb @B |
.update_size: |
mov ebx, [new_size] |
call update_mem_size |
mov ebx, [new_size] |
mov [PROC_BASE+0x8c+edx],ebx |
;search threads and update |
;application memory size infomation |
mov ecx,[PROC_BASE+0xb8+edx] |
mov eax,2 |
.search_threads: |
;eax = current slot |
;ebx = new memory size |
;ecx = page directory |
cmp eax,[TASK_COUNT] |
jg .search_threads_end |
mov edx,eax |
shl edx,5 |
cmp word [CURRENT_TASK+edx+0xa],9 ;if slot empty? |
jz .search_threads_next |
shl edx,3 |
cmp [PROC_BASE+edx+0xb8],ecx ;if it is our thread? |
jnz .search_threads_next |
mov [PROC_BASE+edx+0x8c],ebx ;update memory size |
.search_threads_next: |
inc eax |
jmp .search_threads |
.search_threads_end: |
xor eax, eax |
dec [pg_data.pg_mutex] |
ret |
561,7 → 537,7 |
add esi, 0x1000 |
cmp esi, edi |
jna @B |
jb @B |
jmp .update_size |
.exit: |
571,6 → 547,37 |
ret |
endp |
update_mem_size: |
; in: edx = slot shl 8 |
; ebx = new memory size |
; destroys eax,ecx,edx |
mov [PROC_BASE+APPDATA.mem_size+edx],ebx |
;search threads and update |
;application memory size infomation |
mov ecx,[PROC_BASE+APPDATA.dir_table+edx] |
mov eax,2 |
.search_threads: |
;eax = current slot |
;ebx = new memory size |
;ecx = page directory |
cmp eax,[TASK_COUNT] |
jg .search_threads_end |
mov edx,eax |
shl edx,5 |
cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
jz .search_threads_next |
shl edx,3 |
cmp [PROC_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
jnz .search_threads_next |
mov [PROC_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
.search_threads_next: |
inc eax |
jmp .search_threads |
.search_threads_end: |
ret |
; param |
; eax= linear address |
; |