Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Noobtotal am 24. July 2006, 11:58

Titel: Bootloader, so richtig?
Beitrag von: Noobtotal am 24. July 2006, 11:58
Hallo Leute!

Ich hab mitr nen Bootloader geschrieben. Er soll die ersten 5 Sektoren von der erstenb Diskette laden ( erste 5 Sektoren nach dem Bootsektor  :wink: )
und wenn das BIOS in CF einen Fehler meldet, dann wiederholt er den Vorgang. Könnte sich den huier bitte!!!!!!! jemand anschauen, ich hab noch keinen einsatzbereit3en Kernel zum testen. :cry:  :cry: !!!!!!!!!!


ASM ORG 0x7C00 //0x7c00 zu Adressen adieren!
int Startpunkt () //Prototypen von Funktionen.
int main ()
int getData ()

int Startpunkt () //Entrypoint wegen den Stringliteralen.
{
main (); //Sprung zu main.
return 0;
}

int main ()
{
int error = 0;
do
{
error = getData (); //Hier werden die Daten von der Diskette geaden.
}
while (error != 0); //Fehler? -> Wiederholen!
ASM mov ax,0x1000; //Segmentregister einstellen.
ASM mov ds,ax;
ASM mov es, ax;
ASM ret; //Sprung zum Kernel!
}

int getData ()
{
ASM mov al,5; //Instruktionen an Interrupt 13h!
ASM mov ah,02;
ASM mov ch,0;
ASM mov cl,2;
ASM mov dh,0;
ASM mov dl,0;
ASM mov ax,0x1000h
ASM mov es,ax;
ASM mov bx,0;
ASM int 13h; //Interrupt 13h aktivieren!
int error;
ASM lahf; // flags nach ah laden
ASM mov al, ah; // gleich nach al kopieren
ASM and al, 1; // das carry flag isolieren
ASM xor ah, ah; // ah auf 0 setzen
ASM mov error, ax;
return error; //Wert von Überprüfung zurückgeben!
}

ASM times 512-($-$$)-2 db 0; //512 Bytes ist die atei gross!
ASM dw 0x0AA55; //Bootsignatur!


edit: Hab Kommentare eingefügt! :D  :)  :D  :)  :D  :)  :D
Titel: Bootloader, so richtig?
Beitrag von: Jidder am 24. July 2006, 13:20
Mit welchem Compiler kompilierst du das?

while (error =! 0);
muss while (error != 0);
heissen.

Folgendes geht nicht, weil cf kein Register ist.
ASM mov error,cf; //Fehlerüberprüfung!

ASM lahf; // flags nach ah laden
ASM mov al, ah; // gleich nach al kopieren
ASM and al, 1; // das carry flag isolieren
ASM xor ah, ah; // ah auf 0 setzen
ASM mov error, ax;


Entweder 0x1000 oder 1000h aber nicht beides zusammen. (0x1000h)

Außerdem fehlt das h bei ASM int 13;

Alles mit Vorbehalt, weil ich deinen Compiler wie gesagt nicht kenne.
Titel: Bootloader, so richtig?
Beitrag von: Noobtotal am 24. July 2006, 13:38
Tausend Dank für deine Hilfe! Die Fehler sind korrigiert.

Der Compiler is gcc. Bis jetzt hab ih Visual C++ vrwendet, bring das mal unter Linux zum laufen :roll: .
Titel: Bootloader, so richtig?
Beitrag von: Jidder am 24. July 2006, 14:06
Also das wird mit dem GCC nicht funktionieren. Einen Bootsektor solltest du in reinem Assembler schreiben, wenn du nicht gerade masochistische Neigungen hast.
Titel: Bootloader, so richtig?
Beitrag von: bluecode am 24. July 2006, 14:08
Außerdem gibts imho die Syntax "ASM ..." beim gcc nicht. Zumindest hab ichs grad mit g++ versucht und das führt zu Fehlern.
Titel: Bootloader, so richtig?
Beitrag von: Noobtotal am 24. July 2006, 14:25
Dann kann ich also gleich den Sektor von der ersten Ausgabe übernehmen. Wenn das so weiter geht, dann schreib ich wahrscheinlich gar nichts selbst :( .
Titel: Bootloader, so richtig?
Beitrag von: Jidder am 24. July 2006, 15:09
Kannst du machen. Wenn das keine Herausforderung für dich ist, kannst du ja auch versuchen anhand der dir zur Verfügung stehenden Dokumentation der Interrupts, etc. versuchen das Ding nachzuprogrammieren.
Titel: Bootloader, so richtig?
Beitrag von: hannibal am 25. July 2006, 07:35
Ui..ich wuerde ein bisschen C ueben, bevor du es verwendest - no offence!

Lg, Alex
Titel: Bootloader, so richtig?
Beitrag von: Noobtotal am 25. July 2006, 12:06
Wieso? Sind da leicht soooooooooooooo viele Fehler drinne?
Titel: boah!!!
Beitrag von: Cheebi am 26. July 2006, 02:04
Junge... du hast wohl keine einzige Lowlevelausgabe gelesen^^
Also Follgendes:
1. gcc erstellt 32bit code. da die programmiersprache c auf 32bit ausgelegt ist.
2. 32bit code is nix im bootloader. zumindest net solange der RM an is.. und das isser von anfang an.

also meine tips: die musst du abhandeln:
1. lies nach was der Protected Mode ist
2. lies nach was 16bit- von 32bit-code unterscheidet
3. lies nach wie man PM anschaltet (PM =protectedMode)
4. lies nach welche Interrupts im RM(=RealMode) zur Verfügung stehen:
z.B.: Zeichen schreiben, Sektor lesen etc....
5. mach dir ein Konzept, was der Bootsektor machen soll:

zum Beispiel follgendes Konzept:
a) String ausgeben
b) ein paar Sektoen von der Diskette lesen
c) PM vorbereiten (GDT)
d) A20 anschalten
e) zum Codesegment springen, das gerade von diskette gelesen wurd....

6. programmiere das ganze in Assembler. weil du jetzt verstanden hast, dass das in C zu kompliziert ist. (möglich wäre es evtl. mit Turbo C, von Borland... aber BITTE vergiss das!!!!!)
7. programmiere in Assmebler oder in C den Kernel, den der Bootsektor von der Diskette geladen hat.

nun bist du sehr weit.... bis dann in 6 wochen^^

Viele Grüße,

Cheebi
Titel: Bootloader, so richtig?
Beitrag von: Noobtotal am 26. July 2006, 13:35
Dasd das so nicht geht, hab ich jetzt auch verstanden!
Titel: Bootloader, so richtig?
Beitrag von: Coffee am 28. July 2006, 11:51
so jetzt  mal langsam... lern du (NoobTotal) ein bischen besser c und asembler, dasnn frag wieder nach wenn etwas nicht funktioniert.... wir helfen gerne... aber solche fehler sollten nichtrmal am anfang auf treten...( z.b. mit cf)