321,7 → 321,8 |
cmp dword [LFBAddress], -1 |
jne @f |
mov [BOOT_VAR+0x901c],byte 2 |
stdcall kernel_alloc, 0x280000 |
stdcall alloc_pages, 0x280000 shr 12 |
add eax, OS_BASE |
mov [LFBAddress], eax |
ret |
@@: |
332,25 → 333,15 |
@@: |
call init_mtrr |
|
mov edx, LFB_BASE |
mov esi, [LFBAddress] |
mov edi, 0x00800000 |
mov dword [exp_lfb+4], edx |
xchg bx, bx |
|
shr edi, 12 |
mov [pg_count], edi |
shr edi, 10 |
mov eax, [LFBAddress] |
or eax, PG_LARGE+PG_UW |
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 |
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 |
mov dword [exp_lfb+4], LFB_BASE |
|
bt [cpu_caps], CAPS_PGE |
jnc @F |
359,32 → 350,7 |
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 eax, cr3 ;flush TLB |
mov cr3, eax |
|
ret |
endp |
|
563,31 → 529,73 |
|
inc [pg_data.pages_faults] |
|
; xchg bx,bx |
; jmp .exit |
|
mov ebx, [.err_addr] |
mov eax, [.err_code] |
|
cmp ebx, OS_BASE |
; xchg bx, bx |
|
cmp ebx, HEAP_BASE |
jb .user_space ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ; |
|
cmp ebx, LFB_BASE |
jb .kernel_heap |
|
cmp ebx, page_tabs |
jb .kernel_space ;ñòðàíèöà â ïàìÿòè ÿäðà |
jb .lfb |
|
cmp ebx, kernel_tabs |
jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ; |
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 |
;Îøèáêà |
jmp .fail |
shr ebx, 22 |
mov edx, [sys_pgdir + ebx*4] |
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 |
.user_space: |
test eax, PG_MAP |
jnz .err_access ;Ñòðàíèöà ïðèñóòñòâóåò |
676,7 → 684,6 |
|
;íå îáðàáàòûâàåì. Îøèáêà |
|
.core_tabs: |
.fail: |
mov esp, ebp |
popad |