Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: syxce am 07. December 2005, 12:45
-
Hallo,
ich habe wieder einmal ein problem.
Ich habe einen bootloader den ich ja bereits mehrmals gepostet habe und ich möchte nun das dieser bootloader meine kernel1.bin lädt (macht er auch noch) und von dieser kernel1.bin möchte nun weiter zu einer weiteren kernel Datei, aber wie geht das, wahrscheinlich mit einem jmp Befehl ?
Der Bootloader müsste doch am Anfang alle Dateien irgendwo in den Speicher laden oder, jetzt würde ich gerne wissen wie ich eine weitere Datei in Speicher lade (mit der bootloader.bin glaube ich mal) und dann dort hin springen (von der kernel1.bin aus) kann ?
Für etwas code wäre ich sehr dankbar ?
danke
-
Ich weiß zwar nicht genau ob du das meinst, aber ich lade zB mit meinem Programm im Bootsektor den Bootloader an die Adresse 0x70000 und der läd dann alle weiteren benötigten Dateien wie zB den Kernel usw. und zum Bootloader springe ich mit:
jmp 0x7000:0x0000
MM
-
Ja das ist mir klar, aber wie lade ich eine weitere Datei in den Speciher zum Beispiel Kernel2.bin und wie lautet ann der jmp Befehl um die Datei in Assembler zu erreichen ?
danke mfg syxce
-
Ich würde denken, genauso wie der Bootsloader die erste Datei (Kernel)lädt. Du lädst dann die gewünschte Datei an eine Adresse z.B. 0x8000. Um dann dorthin zu springen schreibst du "jmp 0x8000".
Aber wenn du im PM bist, geht das nicht. Dann musst du die zu laden gewünschte Datei vor dem PM-Jump nach (wie gesagt) 0x8000 laden. Nach dem PM kannst du dann immer noch "jmp 0x800" schreiben.
Dazu müsstest du allerdings wissen, auf welchen Sektoren der Diskette sich die gewünschte Datei befindet. Am einfachsten schreibst du den Inhalt der "img-Datei" der gewünschten Datei hinten an die img-Datei deiner Hauptdatei.
Gruss
Nooooooos
-
Ich habe nur eine .img Datei falls du das mit den letzten beiden Sätzen sagen willst.
Naja meine kernel1.bin wird von der Bootloader.bin an die Addresse 0x1000 geschrieben, dass alles geschieht noch vor dem PM. Jetzte hätte ich schon probiert die kernel2.bin (c-kernel) an die Adresse 0x8000 zu schreiben und dann in der kernel1.bin mit dem Befehl jmp 0x8000 dort hin zu gelangen, das geht nicht, da ist wieder das gleiche Problem das ich schon mal hatte, der Bootloader schreibt lediglich Loading und resetet dann, als würde er an der Adresse 0x8000 nichts finden.
Hier mal mein Bootloader vll kann mir ja jemand ein Code Beispiel geben wie das funktionieren könnte, danke
org 0x7C00
start:
cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
sti
mov [bootdrv], dl
call kernel
mov ax, 0x1000
mov es, ax
mov ds, ax
push ax
mov ax,0
push ax
retf
bootdrv db 0
loadmsg db "Loading...",13,10,0
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
kernel:
push ds
mov ax, 0
mov dl, [bootdrv]
int 13h
pop ds
jc kernel
load:
mov ax,0x1000
mov es, ax
mov bx,0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load
mov si, loadmsg
call putstr
retn
times 512-($-$$)-2 db 0
dw 0AA55h