forked from KolibriOS/kolibrios
redesigned memory layout
git-svn-id: svn://kolibrios.org@839 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1146b67279
commit
0490e63747
@ -184,6 +184,20 @@ end virtual
|
|||||||
|
|
||||||
TSS_SIZE equ (128+8192)
|
TSS_SIZE equ (128+8192)
|
||||||
|
|
||||||
|
HEAP_BASE equ 0x80000000
|
||||||
|
|
||||||
|
HEAP_MIN_SIZE equ 0x01000000
|
||||||
|
|
||||||
|
LFB_BASE equ 0xDF000000
|
||||||
|
|
||||||
|
page_tabs equ 0xDF800000
|
||||||
|
app_page_tabs equ 0xDF800000
|
||||||
|
|
||||||
|
OS_TEMP equ 0xDFC00000
|
||||||
|
|
||||||
|
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
|
||||||
|
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
|
||||||
|
|
||||||
OS_BASE equ 0xE0000000
|
OS_BASE equ 0xE0000000
|
||||||
|
|
||||||
window_data equ OS_BASE
|
window_data equ OS_BASE
|
||||||
@ -318,16 +332,6 @@ end virtual
|
|||||||
|
|
||||||
sys_pgmap equ (OS_BASE+0x047F000)
|
sys_pgmap equ (OS_BASE+0x047F000)
|
||||||
|
|
||||||
HEAP_BASE equ (OS_BASE+0x0800000)
|
|
||||||
HEAP_MIN_SIZE equ 0x01000000
|
|
||||||
|
|
||||||
page_tabs equ 0xFDC00000
|
|
||||||
app_page_tabs equ 0xFDC00000
|
|
||||||
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
|
|
||||||
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
|
|
||||||
|
|
||||||
LFB_BASE equ 0xFE000000
|
|
||||||
|
|
||||||
|
|
||||||
new_app_base equ 0;
|
new_app_base equ 0;
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ macro remove_from_used op
|
|||||||
}
|
}
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc init_kernel_heap
|
init_kernel_heap:
|
||||||
|
|
||||||
mov ecx, 64/4
|
mov ecx, 64/4
|
||||||
mov edi, mem_block_list
|
mov edi, mem_block_list
|
||||||
@ -102,59 +102,39 @@ proc init_kernel_heap
|
|||||||
not eax
|
not eax
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
|
stdcall alloc_pages, dword 32
|
||||||
|
add eax, OS_BASE
|
||||||
|
|
||||||
mov [mem_block_start], mem_block_map
|
mov [mem_block_start], mem_block_map
|
||||||
mov [mem_block_end], mem_block_map+512
|
mov [mem_block_end], mem_block_map+512
|
||||||
mov [mem_block_arr], HEAP_BASE
|
mov [mem_block_arr], eax
|
||||||
|
|
||||||
mov eax, mem_used.fd-MEM_LIST_OFFSET
|
mov ebx, mem_used.fd-MEM_LIST_OFFSET
|
||||||
mov [mem_used.fd], eax
|
mov [mem_used.fd], ebx
|
||||||
mov [mem_used.bk], eax
|
mov [mem_used.bk], ebx
|
||||||
|
|
||||||
stdcall alloc_pages, dword 32
|
xor edx, edx
|
||||||
mov ecx, 32
|
|
||||||
mov edx, eax
|
|
||||||
mov edi, HEAP_BASE
|
|
||||||
.l1:
|
|
||||||
stdcall map_page,edi,edx,PG_SW
|
|
||||||
add edi, 0x1000
|
|
||||||
add edx, 0x1000
|
|
||||||
dec ecx
|
|
||||||
jnz .l1
|
|
||||||
|
|
||||||
mov edi, HEAP_BASE
|
mov [eax+block_next], edx
|
||||||
mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
|
mov [eax+block_prev], edx
|
||||||
xor eax, eax
|
mov [eax+list_fd], edx
|
||||||
mov [edi+block_next], ebx
|
mov [eax+list_bk], edx
|
||||||
mov [edi+block_prev], eax
|
mov [eax+block_base], HEAP_BASE
|
||||||
mov [edi+list_fd], eax
|
mov [eax+block_size], page_tabs-HEAP_BASE
|
||||||
mov [edi+list_bk], eax
|
mov [eax+block_flags], FREE_BLOCK
|
||||||
mov [edi+block_base], HEAP_BASE
|
|
||||||
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
|
|
||||||
mov [edi+block_flags], USED_BLOCK
|
|
||||||
|
|
||||||
mov [ebx+block_next], eax
|
mov [heap_size], page_tabs-HEAP_BASE
|
||||||
mov [ebx+block_prev], eax
|
mov [heap_free], page_tabs-HEAP_BASE
|
||||||
mov [ebx+list_fd], eax
|
|
||||||
mov [ebx+list_bk], eax
|
|
||||||
mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
|
|
||||||
|
|
||||||
mov ecx, [MEM_AMOUNT]
|
mov [mem_block_mask], edx
|
||||||
sub ecx, (HEAP_BASE - OS_BASE + 4096*MEM_BLOCK_SIZE)
|
|
||||||
mov [heap_size], ecx
|
|
||||||
mov [heap_free], ecx
|
|
||||||
mov [ebx+block_size], ecx
|
|
||||||
mov [ebx+block_flags], FREE_BLOCK
|
|
||||||
|
|
||||||
mov [mem_block_mask], eax
|
|
||||||
mov [mem_block_mask+4],0x80000000
|
mov [mem_block_mask+4],0x80000000
|
||||||
|
|
||||||
mov [mem_block_list+63*4], ebx
|
mov [mem_block_list+63*4], eax
|
||||||
mov byte [mem_block_map], 0xFC
|
mov byte [mem_block_map], 0xFE
|
||||||
and [heap_mutex], 0
|
and [heap_mutex], 0
|
||||||
mov [heap_blocks], 4095
|
mov [heap_blocks], 4096
|
||||||
mov [free_blocks], 4095
|
mov [free_blocks], 4096
|
||||||
ret
|
ret
|
||||||
endp
|
|
||||||
|
|
||||||
; param
|
; param
|
||||||
; eax= required size
|
; eax= required size
|
||||||
@ -329,7 +309,7 @@ proc alloc_kernel_space stdcall, size:dword
|
|||||||
je .m_eq_size
|
je .m_eq_size
|
||||||
|
|
||||||
call alloc_mem_block
|
call alloc_mem_block
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz .error
|
jz .error
|
||||||
|
|
||||||
mov esi, eax ;esi - splitted block
|
mov esi, eax ;esi - splitted block
|
||||||
@ -340,7 +320,7 @@ proc alloc_kernel_space stdcall, size:dword
|
|||||||
mov [edi+block_prev], esi
|
mov [edi+block_prev], esi
|
||||||
mov [esi+list_fd], 0
|
mov [esi+list_fd], 0
|
||||||
mov [esi+list_bk], 0
|
mov [esi+list_bk], 0
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz @f
|
jz @f
|
||||||
mov [eax+block_next], esi
|
mov [eax+block_next], esi
|
||||||
@@:
|
@@:
|
||||||
|
@ -321,7 +321,8 @@ proc init_LFB
|
|||||||
cmp dword [LFBAddress], -1
|
cmp dword [LFBAddress], -1
|
||||||
jne @f
|
jne @f
|
||||||
mov [BOOT_VAR+0x901c],byte 2
|
mov [BOOT_VAR+0x901c],byte 2
|
||||||
stdcall kernel_alloc, 0x280000
|
stdcall alloc_pages, 0x280000 shr 12
|
||||||
|
add eax, OS_BASE
|
||||||
mov [LFBAddress], eax
|
mov [LFBAddress], eax
|
||||||
ret
|
ret
|
||||||
@@:
|
@@:
|
||||||
@ -332,55 +333,20 @@ proc init_LFB
|
|||||||
@@:
|
@@:
|
||||||
call init_mtrr
|
call init_mtrr
|
||||||
|
|
||||||
mov edx, LFB_BASE
|
xchg bx, bx
|
||||||
mov esi, [LFBAddress]
|
|
||||||
mov edi, 0x00800000
|
|
||||||
mov dword [exp_lfb+4], edx
|
|
||||||
|
|
||||||
shr edi, 12
|
mov eax, [LFBAddress]
|
||||||
mov [pg_count], edi
|
or eax, PG_LARGE+PG_UW
|
||||||
shr edi, 10
|
mov [sys_pgdir+(LFB_BASE shr 20)], eax
|
||||||
|
add eax, 0x00400000
|
||||||
|
mov [sys_pgdir+4+(LFB_BASE shr 20)], eax
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PSE
|
mov dword [exp_lfb+4], LFB_BASE
|
||||||
jnc .map_page_tables
|
|
||||||
or esi, PG_LARGE+PG_UW
|
|
||||||
mov edx, sys_pgdir+(LFB_BASE shr 20)
|
|
||||||
@@:
|
|
||||||
mov [edx], esi
|
|
||||||
add edx, 4
|
|
||||||
add esi, 0x00400000
|
|
||||||
dec edi
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PGE
|
bt [cpu_caps], CAPS_PGE
|
||||||
jnc @F
|
jnc @F
|
||||||
or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
|
or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
|
||||||
@@:
|
@@:
|
||||||
mov dword [LFBAddress], LFB_BASE
|
|
||||||
mov eax, cr3 ;flush TLB
|
|
||||||
mov cr3, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.map_page_tables:
|
|
||||||
|
|
||||||
@@:
|
|
||||||
call alloc_page
|
|
||||||
stdcall map_page_table, edx, eax
|
|
||||||
add edx, 0x00400000
|
|
||||||
dec edi
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
mov eax, [LFBAddress]
|
|
||||||
mov edi, page_tabs + (LFB_BASE shr 10)
|
|
||||||
or eax, PG_UW
|
|
||||||
mov ecx, [pg_count]
|
|
||||||
cld
|
|
||||||
@@:
|
|
||||||
stosd
|
|
||||||
add eax, 0x1000
|
|
||||||
dec ecx
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
mov dword [LFBAddress], LFB_BASE
|
mov dword [LFBAddress], LFB_BASE
|
||||||
mov eax, cr3 ;flush TLB
|
mov eax, cr3 ;flush TLB
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
@ -563,29 +529,71 @@ proc page_fault_handler
|
|||||||
|
|
||||||
inc [pg_data.pages_faults]
|
inc [pg_data.pages_faults]
|
||||||
|
|
||||||
; xchg bx,bx
|
|
||||||
; jmp .exit
|
|
||||||
|
|
||||||
mov ebx, [.err_addr]
|
mov ebx, [.err_addr]
|
||||||
mov eax, [.err_code]
|
mov eax, [.err_code]
|
||||||
|
|
||||||
cmp ebx, OS_BASE
|
; xchg bx, bx
|
||||||
|
|
||||||
|
cmp ebx, HEAP_BASE
|
||||||
jb .user_space ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
|
jb .user_space ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
|
||||||
|
|
||||||
cmp ebx, page_tabs
|
cmp ebx, LFB_BASE
|
||||||
jb .kernel_space ;ñòðàíèöà â ïàìÿòè ÿäðà
|
jb .kernel_heap
|
||||||
|
|
||||||
cmp ebx, kernel_tabs
|
cmp ebx, page_tabs
|
||||||
jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
|
jb .lfb
|
||||||
|
|
||||||
|
cmp ebx, OS_BASE
|
||||||
|
jb .core_tabs
|
||||||
|
|
||||||
|
jmp .core_tabs
|
||||||
|
|
||||||
|
; cmp ebx, kernel_tabs
|
||||||
|
; jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
|
||||||
;ïðîñòî ñîçäàäèì îäíó
|
;ïðîñòî ñîçäàäèì îäíó
|
||||||
|
|
||||||
cmp ebx, LFB_BASE
|
|
||||||
jb .core_tabs ;òàáëèöû ñòðàíèö ÿäðà
|
|
||||||
;Îøèáêà
|
|
||||||
.lfb:
|
.lfb:
|
||||||
;îáëàñòü LFB
|
shr ebx, 22
|
||||||
;Îøèáêà
|
mov edx, [sys_pgdir + ebx*4]
|
||||||
jmp .fail
|
mov [master_tab + ebx*4], edx
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.core_tabs:
|
||||||
|
|
||||||
|
shr ebx, 12
|
||||||
|
and ebx, 0x3FF
|
||||||
|
mov edx, [master_tab + ebx*4]
|
||||||
|
test edx, PG_MAP
|
||||||
|
jz .check_ptab ;òàáëèöà ñòðàíèö íå ñîçäàíà
|
||||||
|
|
||||||
|
align 4
|
||||||
|
.kernel_heap:
|
||||||
|
|
||||||
|
shr ebx, 22
|
||||||
|
mov edx, [master_tab + ebx*4]
|
||||||
|
test edx, PG_MAP
|
||||||
|
jz .check_ptab ;òàáëèöà ñòðàíèö íå ñîçäàíà
|
||||||
|
|
||||||
|
.check_ptab:
|
||||||
|
mov edx, [sys_pgdir + ebx*4]
|
||||||
|
test edx, PG_MAP
|
||||||
|
jnz @F
|
||||||
|
|
||||||
|
call alloc_page
|
||||||
|
test eax, eax
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
lea edx, [eax + PG_UW]
|
||||||
|
lea edi, [eax + OS_BASE]
|
||||||
|
mov ecx, 1024
|
||||||
|
xor eax, eax
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov [sys_pgdir + ebx*4], edx
|
||||||
|
@@:
|
||||||
|
mov [master_tab + ebx*4], edx
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
.user_space:
|
.user_space:
|
||||||
@ -676,7 +684,6 @@ align 4
|
|||||||
|
|
||||||
;íå îáðàáàòûâàåì. Îøèáêà
|
;íå îáðàáàòûâàåì. Îøèáêà
|
||||||
|
|
||||||
.core_tabs:
|
|
||||||
.fail:
|
.fail:
|
||||||
mov esp, ebp
|
mov esp, ebp
|
||||||
popad
|
popad
|
||||||
|
@ -578,21 +578,18 @@ term9:
|
|||||||
.nodebug:
|
.nodebug:
|
||||||
popad
|
popad
|
||||||
|
|
||||||
mov ebx, [.slot]
|
|
||||||
shl ebx, 8
|
|
||||||
push ebx
|
|
||||||
mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
|
|
||||||
|
|
||||||
stdcall kernel_free, ebx
|
|
||||||
|
|
||||||
pop ebx
|
|
||||||
mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
|
|
||||||
stdcall kernel_free, ebx
|
|
||||||
|
|
||||||
mov edi, [.slot]
|
mov edi, [.slot]
|
||||||
shl edi, 8
|
shl edi, 8
|
||||||
add edi,SLOT_BASE
|
add edi,SLOT_BASE
|
||||||
|
|
||||||
|
mov eax,[edi+APPDATA.pl0_stack]
|
||||||
|
sub eax, OS_BASE
|
||||||
|
call free_page
|
||||||
|
|
||||||
|
mov eax,[edi+APPDATA.cur_dir]
|
||||||
|
sub eax, OS_BASE
|
||||||
|
call free_page
|
||||||
|
|
||||||
mov eax, [edi+APPDATA.io_map]
|
mov eax, [edi+APPDATA.io_map]
|
||||||
cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
|
cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
|
||||||
je @F
|
je @F
|
||||||
|
@ -138,8 +138,6 @@ proc fs_execute
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jz .err_hdr
|
jz .err_hdr
|
||||||
|
|
||||||
;mov esi, new_process_loading
|
|
||||||
;call sys_msg_board_str ; write message to message board
|
|
||||||
DEBUGF 1,"%s",new_process_loading
|
DEBUGF 1,"%s",new_process_loading
|
||||||
|
|
||||||
.wait_lock:
|
.wait_lock:
|
||||||
@ -189,6 +187,7 @@ proc fs_execute
|
|||||||
loop .copy_process_name_loop
|
loop .copy_process_name_loop
|
||||||
.copy_process_name_done:
|
.copy_process_name_done:
|
||||||
|
|
||||||
|
|
||||||
mov ebx, cr3
|
mov ebx, cr3
|
||||||
mov [save_cr3], ebx
|
mov [save_cr3], ebx
|
||||||
|
|
||||||
@ -388,9 +387,8 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jz .fail
|
jz .fail
|
||||||
mov [dir_addr], eax
|
mov [dir_addr], eax
|
||||||
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
|
|
||||||
|
|
||||||
mov edi, [tmp_task_pdir]
|
lea edi, [eax + OS_BASE]
|
||||||
mov ecx, (OS_BASE shr 20)/4
|
mov ecx, (OS_BASE shr 20)/4
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
cld
|
cld
|
||||||
@ -400,15 +398,15 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
|||||||
mov esi, sys_pgdir+(OS_BASE shr 20)
|
mov esi, sys_pgdir+(OS_BASE shr 20)
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
mov eax, [dir_addr]
|
mov edi, [dir_addr]
|
||||||
or eax, PG_SW
|
lea eax, [edi+PG_SW]
|
||||||
mov [edi-4096+(page_tabs shr 20)], eax
|
mov [edi+OS_BASE+(page_tabs shr 20)], eax
|
||||||
|
|
||||||
and eax, -4096
|
and eax, -4096
|
||||||
call set_cr3
|
call set_cr3
|
||||||
|
|
||||||
mov edx, [app_tabs]
|
mov edx, [app_tabs]
|
||||||
mov edi, new_app_base
|
xor edi, edi
|
||||||
@@:
|
@@:
|
||||||
call alloc_page
|
call alloc_page
|
||||||
test eax, eax
|
test eax, eax
|
||||||
@ -419,9 +417,7 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
|||||||
dec edx
|
dec edx
|
||||||
jnz @B
|
jnz @B
|
||||||
|
|
||||||
mov edi, new_app_base
|
mov edi, page_tabs
|
||||||
shr edi, 10
|
|
||||||
add edi, page_tabs
|
|
||||||
|
|
||||||
mov ecx, [app_tabs]
|
mov ecx, [app_tabs]
|
||||||
shl ecx, 10
|
shl ecx, 10
|
||||||
@ -430,13 +426,11 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
|||||||
|
|
||||||
mov ecx, [img_pages]
|
mov ecx, [img_pages]
|
||||||
mov ebx, PG_UW
|
mov ebx, PG_UW
|
||||||
mov edx, new_app_base
|
|
||||||
mov esi, [img_base]
|
mov esi, [img_base]
|
||||||
mov edi, new_app_base
|
|
||||||
shr esi, 10
|
shr esi, 10
|
||||||
shr edi, 10
|
|
||||||
add esi, page_tabs
|
add esi, page_tabs
|
||||||
add edi, page_tabs
|
xor edx, edx
|
||||||
|
mov edi, page_tabs
|
||||||
.remap:
|
.remap:
|
||||||
lodsd
|
lodsd
|
||||||
or eax, ebx ; force user level r/w access
|
or eax, ebx ; force user level r/w access
|
||||||
@ -467,8 +461,6 @@ else
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
|
|
||||||
|
|
||||||
dec [pg_data.pg_mutex]
|
dec [pg_data.pg_mutex]
|
||||||
mov eax, [dir_addr]
|
mov eax, [dir_addr]
|
||||||
ret
|
ret
|
||||||
@ -543,17 +535,20 @@ proc destroy_app_space stdcall, pg_dir:dword
|
|||||||
;if there isn't threads then clear memory.
|
;if there isn't threads then clear memory.
|
||||||
|
|
||||||
mov eax, [pg_dir]
|
mov eax, [pg_dir]
|
||||||
and eax, not 0xFFF
|
and eax, -4096
|
||||||
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
|
add eax, OS_BASE
|
||||||
mov esi, [tmp_task_pdir]
|
mov [tmp_task_pdir], eax
|
||||||
mov edi, (OS_BASE shr 20)/4
|
mov esi, eax
|
||||||
|
mov edi, (HEAP_BASE shr 20)/4
|
||||||
.destroy:
|
.destroy:
|
||||||
mov eax, [esi]
|
mov eax, [esi]
|
||||||
test eax, 1
|
test eax, 1
|
||||||
jz .next
|
jz .next
|
||||||
and eax, not 0xFFF
|
and eax, not 0xFFF
|
||||||
stdcall map_page,[tmp_task_ptab],eax,dword PG_SW
|
add eax, OS_BASE
|
||||||
stdcall destroy_page_table, [tmp_task_ptab]
|
|
||||||
|
stdcall destroy_page_table, eax
|
||||||
|
|
||||||
mov eax, [esi]
|
mov eax, [esi]
|
||||||
call free_page
|
call free_page
|
||||||
.next:
|
.next:
|
||||||
@ -564,8 +559,6 @@ proc destroy_app_space stdcall, pg_dir:dword
|
|||||||
mov eax, [pg_dir]
|
mov eax, [pg_dir]
|
||||||
call free_page
|
call free_page
|
||||||
.exit:
|
.exit:
|
||||||
stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP
|
|
||||||
stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
|
|
||||||
dec [pg_data.pg_mutex]
|
dec [pg_data.pg_mutex]
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -951,7 +944,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
|
|||||||
pl0_stack dd ?
|
pl0_stack dd ?
|
||||||
endl
|
endl
|
||||||
|
|
||||||
stdcall kernel_alloc, RING0_STACK_SIZE+512
|
stdcall alloc_pages, (RING0_STACK_SIZE+512) shr 12
|
||||||
|
add eax, OS_BASE
|
||||||
mov [pl0_stack], eax
|
mov [pl0_stack], eax
|
||||||
|
|
||||||
lea edi, [eax+RING0_STACK_SIZE]
|
lea edi, [eax+RING0_STACK_SIZE]
|
||||||
@ -994,9 +988,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
|
|||||||
add eax, RING0_STACK_SIZE
|
add eax, RING0_STACK_SIZE
|
||||||
mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
|
mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
|
||||||
|
|
||||||
push ebx
|
call alloc_page
|
||||||
stdcall kernel_alloc, 0x1000
|
add eax, OS_BASE
|
||||||
pop ebx
|
|
||||||
mov esi,[current_slot]
|
mov esi,[current_slot]
|
||||||
mov esi,[esi+APPDATA.cur_dir]
|
mov esi,[esi+APPDATA.cur_dir]
|
||||||
mov ecx,0x1000/4
|
mov ecx,0x1000/4
|
||||||
|
@ -8,159 +8,8 @@
|
|||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
MEM_WB equ 6 ;write-back memory
|
|
||||||
MEM_WC equ 1 ;write combined memory
|
|
||||||
MEM_UC equ 0 ;uncached memory
|
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc init_mem
|
|
||||||
|
|
||||||
mov ecx, [0x2F0000 + 0x9100]
|
|
||||||
mov esi, 0x2F0000 + 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-OS_BASE], eax
|
|
||||||
mov [pg_data.mem_amount-OS_BASE], eax
|
|
||||||
|
|
||||||
shr eax, 12
|
|
||||||
mov edx, eax
|
|
||||||
mov [pg_data.pages_count-OS_BASE], eax
|
|
||||||
shr eax, 3
|
|
||||||
mov [pg_data.pagemap_size-OS_BASE], eax
|
|
||||||
|
|
||||||
add eax, (sys_pgmap-OS_BASE)+4095
|
|
||||||
and eax, not 4095
|
|
||||||
mov [tmp_page_tabs], eax
|
|
||||||
|
|
||||||
cmp edx, (OS_BASE/4096)
|
|
||||||
jbe @F
|
|
||||||
mov edx, (OS_BASE/4096)
|
|
||||||
jmp .set
|
|
||||||
@@:
|
|
||||||
cmp edx, (HEAP_MIN_SIZE/4096)
|
|
||||||
jae .set
|
|
||||||
mov edx, (HEAP_MIN_SIZE/4096)
|
|
||||||
.set:
|
|
||||||
mov [pg_data.kernel_pages-OS_BASE], edx
|
|
||||||
shr edx, 10
|
|
||||||
mov [pg_data.kernel_tables-OS_BASE], edx
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
mov edi, sys_pgdir-OS_BASE
|
|
||||||
mov ecx, 4096/4
|
|
||||||
cld
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
mov edx, (sys_pgdir-OS_BASE)+ (OS_BASE shr 20)
|
|
||||||
bt [cpu_caps-OS_BASE], CAPS_PSE
|
|
||||||
jnc .no_PSE
|
|
||||||
|
|
||||||
mov ebx, cr4
|
|
||||||
or ebx, CR4_PSE
|
|
||||||
mov eax, PG_LARGE+PG_SW
|
|
||||||
mov cr4, ebx
|
|
||||||
dec [pg_data.kernel_tables-OS_BASE]
|
|
||||||
|
|
||||||
mov [edx], eax
|
|
||||||
add eax, 0x00400000
|
|
||||||
add edx, 4
|
|
||||||
|
|
||||||
mov eax, 0x400000+PG_SW
|
|
||||||
mov ecx, [tmp_page_tabs]
|
|
||||||
sub ecx, 0x400000
|
|
||||||
shr ecx, 12 ;ecx/=4096
|
|
||||||
jmp .map_low
|
|
||||||
.no_PSE:
|
|
||||||
mov eax, PG_SW
|
|
||||||
mov ecx, [tmp_page_tabs]
|
|
||||||
shr ecx, 12
|
|
||||||
.map_low:
|
|
||||||
mov edi, [tmp_page_tabs]
|
|
||||||
@@: ;
|
|
||||||
stosd
|
|
||||||
add eax, 0x1000
|
|
||||||
dec ecx
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
mov ecx, [pg_data.kernel_tables-OS_BASE]
|
|
||||||
shl ecx, 10
|
|
||||||
xor eax, eax
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
mov ecx, [pg_data.kernel_tables-OS_BASE]
|
|
||||||
mov eax, [tmp_page_tabs]
|
|
||||||
or eax, PG_SW
|
|
||||||
mov edi, edx
|
|
||||||
|
|
||||||
.map_kernel_tabs:
|
|
||||||
|
|
||||||
stosd
|
|
||||||
add eax, 0x1000
|
|
||||||
dec ecx
|
|
||||||
jnz .map_kernel_tabs
|
|
||||||
|
|
||||||
mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
|
|
||||||
|
|
||||||
mov edi, (sys_pgdir-OS_BASE)
|
|
||||||
lea esi, [edi+(OS_BASE shr 20)]
|
|
||||||
movsd
|
|
||||||
movsd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc init_page_map
|
|
||||||
|
|
||||||
mov edi, sys_pgmap-OS_BASE
|
|
||||||
mov ecx, [pg_data.pagemap_size-OS_BASE]
|
|
||||||
shr ecx, 2
|
|
||||||
or eax, -1
|
|
||||||
cld
|
|
||||||
rep stosd
|
|
||||||
|
|
||||||
mov ecx, [tmp_page_tabs]
|
|
||||||
mov edx, [pg_data.pages_count-OS_BASE]
|
|
||||||
shr ecx, 12
|
|
||||||
add ecx, [pg_data.kernel_tables-OS_BASE]
|
|
||||||
sub edx, ecx
|
|
||||||
mov [pg_data.pages_free-OS_BASE], edx
|
|
||||||
|
|
||||||
mov edi, sys_pgmap-OS_BASE
|
|
||||||
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
|
|
||||||
add edi, OS_BASE
|
|
||||||
mov [page_start-OS_BASE], edi;
|
|
||||||
|
|
||||||
mov ebx, sys_pgmap
|
|
||||||
add ebx, [pg_data.pagemap_size-OS_BASE]
|
|
||||||
mov [page_end-OS_BASE], ebx
|
|
||||||
|
|
||||||
mov [pg_data.pg_mutex-OS_BASE], 0
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
init_BIOS32:
|
init_BIOS32:
|
||||||
|
@ -215,7 +215,7 @@ B32:
|
|||||||
|
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
mov edi,0x280000
|
mov edi,0x280000
|
||||||
mov ecx,(HEAP_BASE-OS_BASE-0x280000) / 4
|
mov ecx,(0x800000-0x280000) / 4
|
||||||
cld
|
cld
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
@ -242,20 +242,31 @@ B32:
|
|||||||
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
|
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
|
||||||
|
|
||||||
call init_BIOS32
|
call init_BIOS32
|
||||||
; MEMORY MODEL
|
|
||||||
|
|
||||||
call init_mem
|
mov dword [sys_pgdir-OS_BASE], PG_LARGE+PG_SW
|
||||||
|
mov dword [sys_pgdir-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
|
||||||
|
|
||||||
call init_page_map
|
mov ecx, 32
|
||||||
|
lea edi, [sys_pgdir-OS_BASE+0xE00]
|
||||||
|
mov eax, PG_LARGE+PG_SW
|
||||||
|
@@:
|
||||||
|
stosd
|
||||||
|
add eax, 4*1024*1024
|
||||||
|
loop @B
|
||||||
|
|
||||||
|
mov ebx, cr4
|
||||||
|
or ebx, CR4_PSE
|
||||||
|
and ebx, not CR4_PAE
|
||||||
|
mov cr4, ebx
|
||||||
|
|
||||||
; ENABLE PAGING
|
; ENABLE PAGING
|
||||||
|
|
||||||
mov eax, sys_pgdir-OS_BASE
|
mov eax, sys_pgdir-OS_BASE
|
||||||
mov cr3, eax
|
mov ebx, cr0
|
||||||
|
or ebx,CR0_PG+CR0_WP
|
||||||
|
|
||||||
mov eax,cr0
|
mov cr3, eax
|
||||||
or eax,CR0_PG+CR0_WP
|
mov cr0, ebx
|
||||||
mov cr0,eax
|
|
||||||
|
|
||||||
lgdt [gdts]
|
lgdt [gdts]
|
||||||
jmp pword os_code:high_code
|
jmp pword os_code:high_code
|
||||||
@ -276,6 +287,79 @@ include 'init.inc'
|
|||||||
|
|
||||||
org OS_BASE+$
|
org OS_BASE+$
|
||||||
|
|
||||||
|
MEM_WB equ 6 ;write-back memory
|
||||||
|
MEM_WC equ 1 ;write combined memory
|
||||||
|
MEM_UC equ 0 ;uncached memory
|
||||||
|
|
||||||
|
align 4
|
||||||
|
init_mem:
|
||||||
|
|
||||||
|
mov ecx, [BOOT_VAR + 0x9100]
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
mov ecx, 0x800000 ;reserve 8 Mb
|
||||||
|
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
|
||||||
high_code:
|
high_code:
|
||||||
mov ax,os_stack
|
mov ax,os_stack
|
||||||
@ -288,10 +372,12 @@ high_code:
|
|||||||
mov fs,bx
|
mov fs,bx
|
||||||
mov gs,bx
|
mov gs,bx
|
||||||
|
|
||||||
|
mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PGE
|
bt [cpu_caps], CAPS_PGE
|
||||||
jnc @F
|
jnc @F
|
||||||
|
|
||||||
or dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL
|
or dword [sys_pgdir-OS_BASE+(OS_BASE shr 20)], PG_GLOBAL
|
||||||
|
|
||||||
mov ebx, cr4
|
mov ebx, cr4
|
||||||
or ebx, CR4_PGE
|
or ebx, CR4_PGE
|
||||||
@ -304,6 +390,14 @@ high_code:
|
|||||||
mov eax, cr3
|
mov eax, cr3
|
||||||
mov cr3, eax ; flush TLB
|
mov cr3, eax ; flush TLB
|
||||||
|
|
||||||
|
|
||||||
|
; MEMORY MODEL
|
||||||
|
|
||||||
|
call init_mem
|
||||||
|
|
||||||
|
call init_page_map
|
||||||
|
|
||||||
|
|
||||||
; SAVE REAL MODE VARIABLES
|
; SAVE REAL MODE VARIABLES
|
||||||
mov ax, [BOOT_VAR + 0x9031]
|
mov ax, [BOOT_VAR + 0x9031]
|
||||||
mov [IDEContrRegsBaseAddr], ax
|
mov [IDEContrRegsBaseAddr], ax
|
||||||
@ -455,7 +549,9 @@ high_code:
|
|||||||
lidt [idtreg]
|
lidt [idtreg]
|
||||||
|
|
||||||
call init_kernel_heap
|
call init_kernel_heap
|
||||||
stdcall kernel_alloc, RING0_STACK_SIZE+512
|
|
||||||
|
stdcall alloc_pages, (RING0_STACK_SIZE+512) shr 12
|
||||||
|
add eax, OS_BASE
|
||||||
mov [os_stack_seg], eax
|
mov [os_stack_seg], eax
|
||||||
|
|
||||||
lea esp, [eax+RING0_STACK_SIZE]
|
lea esp, [eax+RING0_STACK_SIZE]
|
||||||
@ -715,7 +811,7 @@ no_lib_load:
|
|||||||
mov [SLOT_BASE+APPDATA.cursor],eax
|
mov [SLOT_BASE+APPDATA.cursor],eax
|
||||||
mov [SLOT_BASE+APPDATA.cursor+256],eax
|
mov [SLOT_BASE+APPDATA.cursor+256],eax
|
||||||
|
|
||||||
stdcall load_pe_driver, szAtiHW
|
; stdcall load_pe_driver, szAtiHW
|
||||||
|
|
||||||
; READ TSC / SECOND
|
; READ TSC / SECOND
|
||||||
|
|
||||||
@ -743,7 +839,7 @@ no_lib_load:
|
|||||||
|
|
||||||
;call detect_devices
|
;call detect_devices
|
||||||
stdcall load_driver, szPS2MDriver
|
stdcall load_driver, szPS2MDriver
|
||||||
stdcall load_driver, szCOM_MDriver
|
; stdcall load_driver, szCOM_MDriver
|
||||||
|
|
||||||
mov esi,boot_setmouse
|
mov esi,boot_setmouse
|
||||||
call boot_log
|
call boot_log
|
||||||
@ -811,8 +907,6 @@ no_load_vrr_m:
|
|||||||
mov ebp, firstapp
|
mov ebp, firstapp
|
||||||
call fs_execute_from_sysdir
|
call fs_execute_from_sysdir
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cmp eax,2 ; continue if a process has been loaded
|
cmp eax,2 ; continue if a process has been loaded
|
||||||
je first_app_found
|
je first_app_found
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user