[os] paging i pamięć

0

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?

0

Sam nie używam tej składni, ale po przepisaniu twojego kodu ogólnie mogę stwierdzić, że może to być spowodowane złym aktywowaniem bramki A20. tz twój kod wygląda na dość uproszczony.

Można to sprawdzić zapisując coś pod adres 0x100000 i odczytując. Odczytana wartość powinna być taka sama oczywiście, a jeżeli nie jest to bramka nie została aktywowana poprawnie.

Wklejam link do przykładowego pełnego kodu aktywowania linii a20:
http://wiki.osdev.org/A20_Line

1 użytkowników online, w tym zalogowanych: 0, gości: 1