Suche Bootsektor, der Kernel lädt.
-
Hallo!
Hat jemand zufällig den Code für einen Bootloader da, der nichts anderes tut als den Kernel (krnl.bin) auf einer Diskette zu laden? (Alles andere, wie A20, PMode,... macht mein Kernel) Den würde ich nämlich dann assemblieren und in den Bootsector der Disktette schreiben.
MfG
Thomas
-
Na wenn du schon so weit bist einen Kernel zu schreiben dann schaffste einen simplen Bootloader auch noch.
Du musst sowas in der Art schreiben:
org 0x7C00 cli mov ax, 0x9000 mov ss, ax mov sp, 0 sti [DEIN CODE ;-)] times 512-($-$$)-2 db 0 dw 0xAA55
Bei Dein Code musste deine Anweisungen rein schreiben was du laden willst, von wo, wohin, usw.
mfg
ps. alles ohne Gewähr, aber bei mir geht das so
-
Einen Bootloader habe ich schon mal geschrieben(-> Anhang). Allerdings konnte ich darin nur Code von einer ganz bestimmten Speicheraddresse laden (0x1000). Nun würde ich aber gerne den Kernel aus einer Datei laden. Bei meiner bisherigen Version, war die Diskette nämlich nach dem draufspielen des Bootloaders und des Kernels unter Windows nicht mehr zu lesen. Das liegt wahrscheinlich daran, dass ich die FAT-Tabelle überschrieben habe. Wenn ich aber nur einen Bootloader im BR habe und eine normale Datei als Kernel, dann könnte ich auch noch zusätzliche daten auf der Diskette speichern.
---
Anhang:
org 0x7C00 start: cli mov ax, 0x9000 mov ss, ax mov sp, 0 sti mov [bootdriv], dl call load mov ax, 0x1000 ; Speicherstelle des Kernels mov es, ax mov ds, ax push ax mov ax, 0 push ax retf putstr: lodsb or al,al jz putstrd mov ah,0x0E mov bx,0x0007 int 0x10 jmp putstr putstrd: retn read: mov ah, 0 int 016h retn load: push ds mov ax, 0 mov dl, [bootdriv] int 13h pop ds jc load load1: mov ax,0x1000 mov es,ax mov bx, 0 mov ah, 2 mov al, 5 mov cx, 2 mov dx, 0 int 13h jc load1 mov si, loadmsg call putstr retn bootdriv db 0 ; Das Bootlaufwerk loadmsg db "Lade...",13,10,0 times 512-($-$$)-2 db 0
-
Schau dir mal GRUB (link siehe Google) an und die Multiboot specification. Da kannst du in deinem Image ein paar Infos angeben, wohin das Image soll etc. und GRUB liefert dann ein komfortables Bootmenü, was eine Datei von gängigen Dateisystemen (FAT, Ext2, ReiserFS...) zieht, an die entsprechende Stelle in den Speicher lädt, den Protected-Mode mit 4GB-Segmenten vorinitialisiert (damit der Kernel seine eigenen Tabellen initialisieren kann) und das A20-Gate anmacht.
Das spart a) dir viel arbeit, b) macht deinen Kernel auch in Multiboot.umgebungen flexibel, c) vereinfacht das hanlding gerade auf disketten, weil du ein gängiges dateiformat benutzen kannst.
Die Multiboot-Spec gibts hier:
http://www.fifi.org/doc/grub-doc/html/multiboot.html
-
du könntest auch eine routine schreiben, die im hauptverzeichnis der diskette (folgt nach FAT und der FAT-Kopie) nach krnl.bin sucht, in dem entsprech. verzeichniseintrag den startcluster liest und in der FAT die folge-cluster liest... programmiere gerade eine FAT12/16-Unterstützung (d.h. DOS wird nicht mehr für datei-io-ops benötigt!) nur datei-schreiben klappt noch net ganz. wenn du willst, kann ich dir das mal zuschicken (is in C++ geschrieben, aber das, was du davon brauchst sind nur ein paar Zeilen C-Code, den du ohne probleme in asm übersetzen kannst...) da gibts also fertige routinen zum datei-öffnen und lesen.
cu todo
-
Original erstellt von todo:
programmiere gerade eine FAT12/16-Unterstützung (d.h. DOS wird nicht mehr für datei-io-ops benötigt!) nur datei-schreiben klappt noch net ganz. wenn du willst, kann ich dir das mal zuschicken (is in C++ geschrieben, aber das, was du davon brauchst sind nur ein paar Zeilen C-Code, den du ohne probleme in asm übersetzen kannst...) da gibts also fertige routinen zum datei-öffnen und lesen.Wäre echt total nett, wenn du mir das mal schicken könntest.
Meine E-Mail-Addy: hentai-lover@subDIMENSION.com
-
ok, schon getan...
cu todo