Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: matthieuriolo am 10. April 2005, 19:01
-
Hallo zusammen
Der Anfänger sit zurück :D also ich habe mir von http://www.jay-code.de das bootloader tutorial geholt und... geht nicht ;) Wen ich neustarte kommt er zwar zu dem loader aber er wartet ungefähr 2 sekunden und startet neu. Egal ob ich nen kernel mit einpacke oder ohne...
Hier möchte ich auch noch gerade fragen wie und wo ein unterschied ist um einen bootloader auf einem anderen FAt system zu bauen. Und ich habe noch ein bisschen ein problem mit dem "zum kernel hüpfen".
Danke schön
PS: Habe zwar schon ne mail an den erfinder von den loader geschickt (TeeJay) aber das kam glaubs nie an :roll:
-
1. hast du auf der diskette eine datei kernel.bin im rootdir? wenn er die nicht findet rebootet er sowieso.
2. Hast du den Code abgetippt, kopiert oder einfach den fertigen code von der downloaddatei verwendet? Wenn nicht von der downloaddatei, code posten!!
mfg, jeb
-
ou vielleicht liegt da der fehler... ich binde sie so zusammen: Copy boot.bin+kernel.bin os.img
Aber der coe is 1:1 der gleiche ;) Werde ihn aber wahrscheinlich noch modifizieren... wieso bootet der automatisch neu? is das im Code? Dann hab ich was grausam übersehen :roll:
Und oft ist die rede von einem HexWorks.. wo finde ich das? Hab nur nen editor gefunden...
-
Ich glaub das war ein FAT12 Bootloader. Du musst nur die boot.bin mit Rawwrite oder so auf die Diskette schreiben und danach kernel.bin ganz normal per Explorer kopieren .
-
KernelNotFound:
push WORD MsgFileNotFound ;Offset der "File not Found" Meldung auf den Stack pushen
call func_PrintString ;Meldung ausgeben lassen
add sp, 2 ;1 Parameter vom Stack löschen
WaitForKeyToReboot:
mov ah, 0 ;Auf Tastendruck warten
int 0x16
Reboot:
db 0xEA ;Reboot
dw 0x0000
dw 0xFFFF
Genau, das ist der FAT12Bootloader. Zur vergewisserung noch den Code zum Rebooten.
mfg, jeb
-
Jo.
Du musst nur die boot.bin mit RawWrite auf die Diskette schreiben.
Die Kernel.bin wird ganz normal auf die Diskette kopiert.
-
und wie? Also einfach nur boot.bin mit dem copy befehl zu einem img machen? Direkt kann ja rawwrite das ned.... oder? :roll:
-
Zu einem Image machen? Es ist ja schon ein Image. Einfach mit RaWrite schreiben.
-
Da lag der bug! Noch aus einem alten Tutoriall bin ich es mir gewöhnt die beide datei in ein .img zu verwandeln. Jetzt geht es jedenfalls wunderbar! aber paar kleine fragen hab ich immer noch...
1.Wie kann man nun eben nen loader für FAT16 und FAT32 machen?
2.Was für schnick schnack könnte man sonst noch so einbauen? :twisted:
3.Wie machen die bootloader das man acuh andere systeme laden kann?
-
1. FAT16 und FAT32 unterscheiden sich in recht wenigen Details. Diese kann man ebenfalls in dem FAT Dokument von Microsoft nachlesen. Man müsste zwar für das auslesen der FAT-Einträge wohl neue Funktionen schreiben, aber einiges bleibt auch gleich. Zum Beispiel die Directory-Einträge. Jedoch kann bei FAT32 das Root-Directory eine variable Größe haben.
2. Man sollte sich gut überlegen ob der Bootloader auch andere Systeme laden können soll, oder speziell nur das eigene OS. Wenn der Loader auch noch andere Systeme laden soll, dann sollte der Loader eigentlich wirklich nichts anderes machen als den Kernel in den Speicher laden und diesen starten. Alles weitere (PM Jump, GDT usw sollte der Kernel machen).
3. Es kommt ganz auf das System an. Siehe Punkt 2. Wenn ein System wenigstens halbwegs durchdacht ist, macht es so dinge wie PM-Jump usw erst im Kernel. Damit behält man sich dann auch vor das OS mit anderen Loadern laden zu können.
-
Ich lade in meinem Bootsector 2 Dateien: loader.sys & kernel32.sys. Danach springe ich zur loader.sys in der PMode, A20, Systemcheck usw. gemacht werden. Danah wird von dort kernel32.sys aufgerufen und die loader.sys wird nicht mehr benötigt.
-
hm ok ... ich seh es schon ... langsam angehen :D noch etwas. Der bootloader is ja auch ein "programm" dieser sollte ja nachdem er den kernel geladen hat auch beendet werden. Tut er das oder hab ich da was in assembler nicht gesehen?
-
Wenn alles fertig geladen usw. ist springst du z.B. mit dem jmp-Befehl zum Kernel. Der Bootloader ist damit praktisch beendet weil der Kernel eingeltich nicht dorthin zurückspringt. Wenn man will kann man eine Endlosschleife hinter den Sprungbefehl stellen.
Beispiel aus TeeJays Bootloader:
ExecuteKernel:
mov ax, 0x1000
push ax ;Segmentadresse an welcher der Kernel ist auf den Stack pushen
mov ax, 0
push ax ;Offsetadresse des Kernels (0) auf den Stack pushen
retf ;Einen FAR-Rücksprung zum Kernel machen
Danch kannst du ein jmp $ schreiben.
-
Der Bootloader wird ja nur anfangs benötigt um den Kernel zu laden. Danach kann der im Speicher einfach überschrieben werden.
Ein Programm beenden bedeutet eigentlich nur, das seine Daten aus dem Speicher "gelöscht" werden.
-
hm ihr merkt sicher das ich noch ziemlich grün hinter den ohren bin :P Was passiert wenn ein assembler code durchgelaufen wird, sprich keine schlaufen drin. Dann führt der prozi den "speicher" aus und damit hat es sich?!?
@darkthing: Huch du machst mir angst... wird der bootloader von TeeJay nicht beendet? Weil das is doch schon ein geschwindigkeits steigerung :twisted:
-
der prozi für immer den speicher aus. und wenn in dem speicher halt 0 ist, dann führt er das aus, bis er abkackt ;)
-
<nörgeln>assembler gehört verboten... </nörgeln>
-
<widersprechen> assembler rult alles an die wand</widersprechen>
-
Du solltest bedenken das ist Leute gibt die ihr OS zu 100% in Assembler schreiben! Aber du musst ja net so der Asm-Freak werden. Im Prinzip reicht es wenn du den Bootsector in Asm schreibst und auch verstehst (das wird oft unterschätzt). Den Rest machst du dann in C oder C++.
-
Genau das hab ich auch vor :P wegen dem verstehen... *husthust* langsam langsam geht es :roll: ich ackere im moment den loader durch um genau zu wissen was der macht...
-
Du solltest bedenken das ist Leute gibt die ihr OS zu 100% in Assembler schreiben! Aber du musst ja net so der Asm-Freak werden. Im Prinzip reicht es wenn du den Bootsector in Asm schreibst und auch verstehst (das wird oft unterschätzt). Den Rest machst du dann in C oder C++.
ja, ich zum beispiel gehöre zur manschaft der deppen, die es sich besonderst schwer machen, weil sie eigendlich masuchisten sind :D:D:D
(achtung, ironie!)
-
Ist zwar stellenweise wirklich masochistisch (Filesystem & alles was Verwaltung braucht also Fenster bei GUI usw. stell ich mir schrecklich vor) aber der Kernel belegt viel weniger Speicher, ist schneller und wenn man mal was mit den Binärfiles zu tun hat findet man sich in denen stellenweise sogar zurecht.
-
ich kanns mir ned wirklich vorstellen das C/C++ kernel grösser und langsamer sind... gibs da irgend eine erklärugn wieso? Sonst muss ich doch auch so nen machosischt werden :lol:
-
ASM ist fast genauso aufgebaut wie reine Maschinensprache (nur aufgebaut!), ein C Programm/Kernel hat praktisch keine Ãhnlichkeit mit Maschinensprache (deshlab nenne man Sprachen wie C Hochsprachen). Der Compiler hat natürlich keine Vorstellung was der Code später tun soll, er übersetzt den Code einfach nur Zeile für Zeile. Es ist logisch das das nur sehr begrenzt gut geht, weshalb der Code langsamer und größer wird.
-
Mir sind gerade ein (2) paar sachen aufgefallen... Ich wollte die nachricht ändern wo sagt das es fehlgeschlagen is... error. Weiss zwar wieso aber hilft ja nicht viel ;) nun hab ich am schluss staht times 512-blabla einfach mal times 1024-bla geschrieben ... haut super nicht hin :P und ich glaube das es daran liegt das er beim kernel laden irgendwie sich selber auflistet oder so was... aber sicher bin ich mir ned... ?
Und noch was. Er sucht ja nach dem kernel ABER wieso "KERNEL BIN"? wieso nicht klein geschrieben und ein punkt dazwischen?
-
schau dir mal das FAT12 tut von TeeJay an. Dort steht folgendes: Der name wird nach der altbekannten 8+3 konvention angegeben wobei der punkt nicht mitkommt. das FAT12 Dateisystem unterscheidet nicht zwischen Gross- und Kleinschreibung.
mfg, jeb
-
Unterscheiden tut es in gewisser weiße schon. Die Dateinamen werden GROß in das Verzeichnis eingetragen. Der Treiber muss halt dafür sorgen das intern nur mit Großbuchstaben gearbeitet wird.
-
tach Leute
also ich hab mir mal die tuts von Teejay über das fat12 Dateisystem,
sowie über bootloader und kernel (lowlevel1) durchgelesen.
Und da brennen mir paar Fragen richtig krass auf der Seele:
1.)Wenn ich diesen (aus lowlevel1)bootloader und kernel auf die Diskette
mit rawrite (oder sonst was) schreibe, wird doch das Dateisystem (fat12) zerstört/überschrieben, oder?
2.)ich muss also einen Bootloader schreiben, welcher im Bootsector hinter den informationen des dateisystems [sector usw tabelle] steht, auf welchen dann der jmp befehl verweist?
3.)Bei den tut: "FAT12 Dateizugriff" ist doch solch ein bootloader (siehe 2.)
notwendig, oder? Schliesslich würde der 512byte grosse bootloder
(aus LowLevel1) den ganzen ersten (fat12-)bootsector überschreiben.
Falls die oberen Fragen/Behaubtungen stimmen gibts hier irgendwo bspcode solch eines bootloaders?
(wenn nicht, auch gut)
Für Eure Antwort wäre ich sehr dankbar
gruss :)
-
Nein, der Bootsector wird vom Dateisystem nicht gebraucht, das wäre doch viel zu umständlich...
-
Hi,
1st
Die Größe des Bootloaders wird mit der Zeile
times 512-($-$$)-2 db 0
auf 512 Bytes gepaddet. -2 deshalb, weil die Bootsignatur 0xAA55 ja noch ans offset 510 muss. Du kannst den Wert net einfach auf 1024 abändern, da der Bootloader von Teejay so ausgelegt ist, dass er in einen sector, nämlich den ersten der diskette passt.
2nd
Der Filename lautet "KERNEL BIN" und nicht "kernel.bin", weil die FAT-Namenskonvention es so vorgibT!!