1,5 → 1,5 |
|
tmp_page_tab equ 0x00C00000 |
tmp_page_tab equ HEAP_BASE |
|
align 4 |
proc mem_test |
18,6 → 18,7 |
cmp dword [edi], 'TEST' |
xchg ebx, dword [edi] |
je @b |
mov [MEM_AMOUNT], edi |
|
and eax, not (CR0_CD+CR0_NW) ;enable caching |
mov cr0, eax |
27,12 → 28,35 |
endp |
|
align 4 |
proc init_memEx |
proc init_mem |
|
mov eax, [MEM_AMOUNT] |
|
mov [pg_data.mem_amount], eax |
mov [pg_data.kernel_max], eax |
|
shr eax, 12 |
mov edx, eax |
mov [pg_data.pages_count], eax |
mov [pg_data.kernel_pages], eax |
|
shr eax, 3 |
mov [pg_data.pagemap_size], eax |
|
shr edx, 10 |
cmp edx, 3 |
ja @f |
inc edx ;at least 4Mb for kernel heap |
@@: |
mov [pg_data.kernel_tables], edx |
|
xor eax, eax |
mov edi, sys_pgdir |
mov ecx, 2048 |
cld |
rep stosd |
|
mov edx, sys_pgdir |
bt [cpu_caps], CAPS_PSE |
jnc .no_PSE |
|
45,71 → 69,53 |
or ebx, CR4_PGE |
@@: |
mov cr4, ebx |
sub [pg_data.kernel_tables], 2 |
|
mov dword [sys_pgdir], eax |
mov [edx], eax |
add eax, 0x00400000 |
mov dword [sys_pgdir+4], eax |
add eax, 0x00400000 |
mov dword [sys_pgdir+8], eax |
mov [edx+4], eax |
add edx, 8 |
|
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW |
|
mov ecx, [pg_data.kernel_tables] |
sub ecx, 3 ;4 |
mov eax, tmp_page_tab+PG_SW |
mov edi, sys_pgdir+12 ;16 |
|
jmp .map_kernel_tabs |
mov eax, 0x800000+PG_SW |
mov ecx, (HEAP_BASE-0x800000)/4096 |
jmp .map_low |
.no_PSE: |
mov eax, PG_SW |
mov esi, tmp_page_tab |
mov ecx, 3072/4; 4096/4 ;0x0 - 0x00FFFFFF |
mov ecx, HEAP_BASE/4096 |
.map_low: |
mov [esi], eax |
mov edi, tmp_page_tab |
@@: ; |
stosd |
add eax, 0x1000 |
mov [esi+4], eax |
add eax, 0x1000 |
mov [esi+8], eax |
add eax, 0x1000 |
mov [esi+12], eax |
add eax, 0x1000 |
add esi, 16 |
dec ecx |
jnz .map_low ;ÿäðî |
jnz @B |
|
mov ecx, [pg_data.kernel_tables] |
shl ecx, 10 |
xor eax, eax |
rep stosd |
|
mov ecx, [pg_data.kernel_tables] |
mov eax, tmp_page_tab+PG_SW |
mov edi, sys_pgdir |
mov edi, edx |
|
.map_kernel_tabs: |
|
mov [edi], eax |
stosd |
add eax, 0x1000 |
add edi, 4 |
dec ecx |
jnz .map_kernel_tabs |
|
mov edi, tmp_page_tab |
bt [cpu_caps], CAPS_PSE |
jc @F |
add edi, 3072*4 ;4096*4 ;skip low kernel memory |
@@: |
mov ecx, [pg_data.kernel_tables] |
sub ecx, 3 |
shl ecx, 10 |
xor eax, eax |
cld |
rep stosd |
|
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW |
|
ret |
endp |
|
align 4 |
proc init_page_map |
|
mov edi, sys_pgmap |
mov ecx, 384/4 |
mov ecx, (HEAP_BASE/4096)/32 ;384/4 |
mov ebx, ecx |
xor eax,eax |
cld |
rep stosd |
116,18 → 122,15 |
|
not eax |
mov ecx, [pg_data.pagemap_size] |
sub ecx, 384 |
sub ecx, ebx |
shr ecx, 2 |
rep stosd |
|
mov edi, sys_pgmap+384 |
lea edi, [sys_pgmap+ebx*4] ;+384 |
mov edx, [pg_data.pages_count] |
mov ecx, [pg_data.kernel_tables] |
bt [cpu_caps], CAPS_PSE |
jnc @f |
sub ecx, 3 |
@@: |
sub edx, 3072 |
add ecx, (HEAP_BASE/4096) and 31 |
sub edx, HEAP_BASE/4096 |
sub edx, ecx |
mov [pg_data.pages_free], edx |
|
140,9 → 143,9 |
mov ecx, ebx |
and ecx, 31 |
shl eax, cl |
mov [page_start], edi; sys_pgmap+384 |
stosd |
|
mov [page_start], sys_pgmap+384 |
mov ebx, sys_pgmap |
add ebx, [pg_data.pagemap_size] |
mov [page_end], ebx |
1348,7 → 1351,6 |
align 16 |
irq_tab rd 16 |
|
|
MEM_FreeSpace rd 1 |
|
ipc_tmp rd 1 |
1363,7 → 1365,6 |
tmp_task_ptab rd 1 |
tmp_task_data rd 1 |
|
fpu_data rd 1 |
fdd_buff rd 1 |
LFBSize rd 1 |
|
1395,6 → 1396,8 |
|
uglobal |
align 16 |
fpu_data: |
rb 512 |
|
mst MEM_STATE |
|
1406,7 → 1409,9 |
srv.fd rd 1 |
srv.bk rd 1 |
|
mem_used_list rd 1 |
mem_used.fd rd 1 |
mem_used.bk rd 1 |
|
mem_block_arr rd 1 |
mem_block_start rd 1 |
mem_block_end rd 1 |
1424,6 → 1429,7 |
event_end rd 1 |
event_uid rd 1 |
sys_page_map rd 1 |
os_stack rd 1 |
endg |
|
if 0 |