41
Lowlevel-Coding / Problem mit Paging
« am: 15. June 2006, 21:37 »
great thx. Fang' ich gleich morgen früh damit an
13. May 2024, 02:02
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
[BITS 16]
mov ax, 0x1000
mov ds, ax
mov es, axcli
call enableA20
lgdt [gdtr]
mov eax, cr0
or al, 1
mov cr0, eax
jmp codesel:PMode
[BITS 32]
PMode:
mov ax, datasel
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x90000
Paging:
.init
mov eax, 0
mov ecx, 4096*3
mov edi, 0x8000
rep stosd
.writepagedir
mov DWORD[0x8000+0],(0x9000 | 000000000111b)
mov DWORD[0x8000+3072],(0xA000 | 000000000111b)
.map0
xor ebx,ebx
xor edx,edx
.Loop1:
mov eax,edx
or eax,000000000111b
mov [0x9000+ebx],eax
add ebx,4
add edx,4096
cmp edx,4096*1024
jne .Loop1
.map768
mov DWORD[0xA000],(0xB8000 | 000000000111b)
.activate
mov eax, 0x8000
mov cr3, eax
mov eax, cr0
or eax,10000000000000000000000000000000b
mov cr0, eax
PMODETEST:
mov BYTE[0xC0000000],'P'
mov BYTE[0xC0000002],'A'
mov BYTE[0xC0000004],'G'
mov BYTE[0xC0000006],'I'
mov BYTE[0xC0000008],'N'
mov BYTE[0xC000000A],'G'
retn
enableA20:
.stage1
in al, 0x64
test al, 00000010b
jnz .stage1
.stage2
mov al, 0xD0
out 0x64, al
.stage3
in al, 0x64
test al, 00000001b
jz .stage3
.stage4:
in al, 0x64
test al, 00000010b
jnz .stage4
.stage5
mov al, 0xD1
out 0x64, al
.stage6
in al, 0x64
test al, 00000010b
jnz .stage6
.stage7
pop eax
out 0x60, al
retn
gdtr: ; Desktiptortabelle
dw gdt_end-gdt-1 ; Limit
dd gdt ; Basisadresse
gdt:
dd 0,0 ; Null-Deskriptor
codesel equ $-gdt
dw 0xFFFF; Segmentgröße 0..15
dw 0x0000; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x9A ; Zugriffsberechtigung und Typ
db 0xCF ; Zusatzinformationen und Segmentgr??e 16...19
db 0x00 ; Segmentadresse 24..31
datasel equ $-gdt
dw 0xFFFF; Segmentgröße 0..15
dw 0x0000; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x92 ; Zugriffsberechtigung und Typ
db 0xCF ; Zusatzinformationen und Segmentgr??e 16...19
db 0x00 ; Segmentadresse 24..31
gdt_end