Witam.
Napisałem mini systemik który na celu ma uruchomić stronicowanie pamięci, gdyż na starszym laptopie są pewne problemy(posiada 64MB).
Gdy tworze w pamięci "katalog" i "tablice" poniżej 1MB to wszystko działa, lecz gdy przekrocze 1MB to na starszy komputer już sobie nie radzi(pojawia się całkiem czarny ekran), a na emulatorach, troche lepszych kompach wszystko działa.
.text
.global start
.code16
start:
jmp code
msg:
.string "0 - step\x0"
# Global Descriptor Table size 6B+40B=46B
gdt: # size 8B*5=40B
.quad 0x0000000000000000 # null descriptor
.quad 0x00cf9a000000ffff # cs
.quad 0x00cf92000000ffff # ds
.quad 0x0000000000000000 # reserved for further use
.quad 0x0000000000000000 # reserved for further use
gdt_p: # size 2B+4B=6B
.word 40
.long gdt
code:
xorw %ax, %ax
movw %ax, %ds # ds = 0x0000
movw %ax, %ss # ss = 0x0000
movw $0x1000,%sp # sp = 0x1000
movw $0xb800,%ax
movw %ax, %es # es = 0xb800
movw $msg, %si
xorw %di, %di
cld
movb $0x00, %al
movw $(80*25*2),%cx
_clear: stosb
loop _clear
xorw %di, %di
movb $0x03, %al
1: cmp $0, (%si)
je 1f
movsb
stosb
jmp 1b
1:
cli
enable_a20:
inb $0x64, %al
testb $0x2, %al
jnz enable_a20
# load gdt
lgdt gdt_p
# protect mode
movl %cr0, %eax
orl $0x1, %eax
movl %eax, %cr0
ljmp $0x08, $entry
# 32bits code
.code32
entry:
movl $0x10, %eax
movl %eax, %ds
movl %eax, %es
incb 0xb8000 # step 1
#########################################PAGING################################
# 0x1000 dir
# 0x2000 tab
xorl %ebx, %ebx
movl $0x2000,%edi # TUTAJ
movl $0x1000,%esi # TUTAJ
movl %edi, %eax
orl $0x07, %eax
movl %eax, (%esi) # [dir] = tab | 3
fill_table:
movl %ebx, %eax
orl $0x07, %eax
movl %eax, (%edi) # [edi] = ebx | 3
addl $4096, %ebx # ebx += 4k
addl $0x4, %edi
cmpl $0x400000,%ebx
jne fill_table
incb 0xb8000 # step 2
movl $0x1000, %eax # TUTAJ
movl %eax, %cr3
incb 0xb8000 # step 3
movl %cr0, %eax
orl $0x80000000, %eax
movl %eax, %cr0
incb 0xb8000 # step 4
f: ljmp $0x08, $f
.org 0x1fe, 0x90
.word 0xaa55
Powinien wyświetlić się napis "4 - step" jeśli wszystko poszło ok, i tak sie dzieje. Po "dopisaniu" dwóch zer tam gdzie oznaczyłem jako "tutaj" aby adres był powyżej 1MB to już "systemik" nie działa.
Co jest nie tak?