N
Der restliche Code (Bootsektor und Kernel) ist dann nicht von dir? Hast Du ihn dir denn ueberhaupt schonmal genauer angeschaut?
Kommt mir irgendwie ein bissel komisch vor: Ein Bootsektor schreiben, der 2 Sektoren in den Speicher laedt, diese aufrufen etc. und nun hakts auf einmal?
Egal.
Die Speichereinteilung sieht beim Booten wie folgt aus:
Die Interrupttabelle geht von 00000 bis 00400. Dort liegen von Int 00 bis Int 255 Far Pointer zu Interrupt handlers im Speicher. Folglich waere es denkbar unguenstig, dort ausfuehrbaren Code hinzuladen.
Dahinter legt das BIOS noch weitere Informationen ueber verfuegbaren Speicher, Grafikhardware, Tastaturpuffer u.ae. ab. Man koennte also sagen, dass der Speicher bis 00540 unbenutzbar ist.
Der Bootstrap wird nach 07C00 geladen, der sollte sich auch nicht selbst ueberschreiben. Ab A0000 faengt der Speicherbereich der Grafikkarte an. Der geht bis C0000. Da hinter sind meist shadows vom BIOS o.ae. also auch Tabu.
Folgende Speicherbereiche sind also belegt:
00000 bis 00540
07C00 bis 07E00
A0000 bis Ende
Dazwischen ist alles frei. (Beispiel 0800:0000 :D)
Wohin Du nun deine Binaries genau laden sollst, kann ich dir nicht sagen, da solltest Du dir selbst drueber gedanken machen, ist schliesslich dein System.
Und um ein in den Speicher geladenes Programm zu starten, springst Du am besten zu der Addresse, zu der Du es geladen hast
Hab mal versucht deinen code ein bissel umzumoebeln... (nicht getestet - wie auch)
boot.asm (+kernel)
;BIOS_LIB equ 0xF100 ;wo sollte das denn landen, bei deaktivierter A20?
;Was soll dieses BIOS_LIB ueberhaupt sein?
BIOS_LIB equ 0x0800 ;hoffentlich wird dabei nichts vom Kernel ueberschrieben?
loadkernel:
cmp dl, 27h
je Console
call floppy_prepare
bios_lib_load:
mov ax, BIOS_LIB; loads sector into memory (try ...) ;Line 131
mov es,ax
mov ah,2
mov al,1 ; loading 1 sector.
mov dx,0 ;hier wird dx auf 0 gesetzt und in Floppyprepare nach einer
;Variable*???*
mov cx,3 ; ch = cylinder number and cl = sector number 1-63
mov bx,0h
int 13h ; load it!
jc bios_lib_load; something went wrong... => try again :)
mov si, bios_loaded
call putstr
call newl
;mov ax, BIOS_LIB ;Enter the BIOS Library
;mov es, ax ;wenn es in "putstr" und "newl" nicht geaendert wird,
;muss es hier nicht nochmal gesetzt werden.
mov ax, 0h
mov bx, [putstr] ;allow BIOS to put a string ;????
mov dx, 0x7C00 ;to the Kernel Output
call [es:100h] ;Enter it!
;Du hast deinen code nach Offset 0 geladen. startet er dann im binarie auch
;wirklich bei offset 100h?? Sonst entweder den call hier aendern, oder
;den Sektor ans entsprechende Offset laden!
mov si, [es:100h]
call putstr ;????
mov si, mymsg
call putstr
call Console ; Simple Console
call Reboot
floppy_prepare:
push ds ; reset disk system
mov ax, 0 ; forces controller to recalibrate drive heads (seek to track 0)
mov dl, [bootdrv]
int 13h
pop ds
jnc floppy_ok
floppy_failed_init:
mov si, msgresetfail
call putstr
floppy_ok:
retn
[ Dieser Beitrag wurde am 09.11.2002 um 00:33 Uhr von Nobuo T editiert. ]