Autor Thema: Fragen zu Bootloader Tut  (Gelesen 4674 mal)

sov21

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« am: 26. August 2004, 18:40 »
Hallo,
hab gerade das Bootloader Tut gelesen.
Und ein paar Dinge sind mir leider noch unklar, liegt wahrscheinlich daran, daß ich ein totaler noob bin.
Also:
1. zu func_ReadFatEntry:
Wenn der Kernel über mehr als einen Sektor geht, dann wird diese Funtion doch    mehrmals aufgerufen. Dann wird ax immer wieder überschrieben, und deshalb ax immer auf den Stack gepusht?! Meine Farge, wie wird denn nun sicher gestellt, daß alle Sektoren auf dem Stack genau hintereinander liegen un nichts dazwischen, bzw nichts überschrieben wird ??

2. Wenn ich jetzt die Datei vollständig auf dem Stack habe, wie wird denn dann der code der da nun liegt zur Ausführung durch den Prozessor gebracht? Wie geht sowas generell??

Also wie ihr seht hab ich nur echt dumme Fragen.
Hoffe mir kann dennoch jemand weiter helfen.
Gruß sov21

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 26. August 2004, 20:02 »
Zu erstmal es gibt keine dummen Fragen:) mal schaun ob ich dir helfen kann
*Mal das Bootloader Tut durchles* (hab ich noch nie gemacht bisher*grins*)
OK zu 1.
ax zeigt vor aufruf der funktion immer auf den Sektor aus dem gerade gelesen werden soll, wenn die funktion aufgerufen wird, ermittelt diese anhand dieses wertes wo die funktion fortgesetzt wird, also in welchem sektor, und gibt diesen nach ax, das wird dann später wieder verwende, also könnte theoretisch sonstwie verstreut sein. Es wird ja jeder Sektor nacheinander bearbeitet, deswegen kann auch nich übersprungen oder überschreiben werden.
BSP:
Die Datei fängt in Sektor 2 an. also steht in ax am anfang der Dateiladefunktion 2
func_ReadSector liest den Sektor in ax in den Speicher.
Dann wird func_ReadFatEntry aufgerufen. die schaut nach was an stelle 2 der Fat steht(das verweist auf den nächsten sektor der Datei) und gibt den wert in ax zurück, sagen wir mal er wäre 4
so denn liest func_ReadSector wieder den sektor der in ax steht also den 4.
dann wieder func_ReadFatEntry der dann 3 ermittelt, und 3 zurückgibt.
Solange bis irgendwann FFF ermittelt wird

Zu 2.
Du schreibst die Datei nicht auf den Stack, der Interrupt der in der ReadSector Funktion verwendet wird schreibt die Daten an die Addresse die er aus ES:BX bildet. Den Code da führst du aus indem du einen Jmp dahin machst, oder es per Call aufrufst.

Ich hoffe das hat irgendwie geholfen, wenn nicht dann frag einfach nochmal und hau mich wegen meines oftmals wirren ausdrucks;)
Und btw begrüss ich dich , als Admin stellvertretend für den Rest der Comm hier, als neues Mitglied^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

sov21

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. August 2004, 20:23 »
Also noch mal zu dem Ausführen von Code.
Mal von ganz Anfang an, ob ich alles verstehe.
Also ich schreibe Assembler Befehle in eine Datei und compiliere das. Dadurch entsteht eine Datei mit Code, den der Prozessor versteht. Opcode?!
Wenn ich jetzt in meinem Bootloader diese Datei an eine ??beliebige?? freie Stelle in   ein Register schreib und dann springe ich von meinem Bootloader in diesen Code und er wird ausgeführt???
Was ist, wenn der Code größer ist als die Register an fassungsvermögen haben??
Wie geht das? Was passiert dann?
Wenn ich eine 1,5 MB große Datei hätte mit Code, wie bringe ich die zur Ausführung??
Vielen Dank für deine vorherige Antwort.
Gruß sov21

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 26. August 2004, 21:22 »
Der Code kommt nicht in die Register sondern in den Speicher. ES:BX ist ein Zeiger der auf den Speicher zeigt und dahin speichert er das und springst dahin Bsp: du schreibst die Segment:Offset kombination der addresse in die Register und machst den Beispielsweise call ES:BX , gibt viele möglichkeiten code aufzurufen. Abgesehen davon das sich das Bootloader tut nur mit disketten beschäftigt und somit eh keine 1,5 MB Platz hätten ist der rest soweit richtig. Durch den Call wird das IP register auf die neue addi gesetzt und der Code wird ausgeführt genauso wie der Code im Bootloader selbst
Die CPU lädt die nächsten bytes ein decodiert die Opcodes udn führt diese aus, lädt dann die nächsten Bytes und so weiter
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

sov21

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. August 2004, 21:54 »
Hey vielen Dank.
Jetzt weiß ich ne Menge mehr und denke ich kann jetzt weiter lernen wie das mit dem Os-Programming so läuft.
Nur noch eine Sache. Woher habt ihr erfahren, daß zB der int 13 nötig ist um Sektoren von FDD zu lesen und welche Register vorher welche werte haben müssen , bzw. in welchem was zurück gegeben wird. Wo kann man sowas nach lesen??
Ich meine wenn euer Tut nicht da wäre. Wie habt ihr selbst das rausgefunden?

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #5 am: 27. August 2004, 14:09 »
Das müsste eigentlich in jedem ganz guten Assembler-Buch drin stehen.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 27. August 2004, 15:20 »
Ralf Brown's Interruptliste:) zu finden über die Linkliste
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

sov21

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 30. August 2004, 21:00 »
Ah ja die Interruptliste sieht auf den ersten Blick vielversprechend aus.
Danke für alle Antworten und Infos.
Gruß sov21

 

Einloggen