Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nico am 04. April 2008, 20:14
-
hi,
ich hab mich mal rangesetzt die ausgabe 1 durchzuarbeiten, leider aber mit
mäßigen erfolg :-(. folgendes habe ich gemacht: die zwei files boot.asm und
kernel.asm kopiert und assembliert. mit cat boot.bin kernel.bin > os.img zu-
sammengefuegt und mit dd if=os.img of=/dev/sda (externe usb festplatte)
geschrieben. nun bootet es leider nicht bzw. sehe ich nur eine blinkenden
cursor (kann also sein, dass der kernel nicht gefunden wird). ich habe das
forum nach dem fehler schon durchsucht und gefunden, dass man mal aus-
probieren sollte, den kernel auch auf eine 512-fache datei zu padden. hat
leider auch nicht funktioniert. hat jemand eine idee?
bg nico
update:
ich hab das ganze jz mal mit bochs probiert und da funktioniert alles super.
vielleicht liegt das an der externen platte?
-
[Edit: Fast vergessen - Willkommen im Forum erstmal! :)]
Kannst du denn grundsätzlich von der externen Platte booten? Also jetzt mal nicht deinen eigenen Kernel, sondern Linux, DOS oder was auch immer. Theoretisch sollte das, was in bochs oder qemu geht, auch auf realen Rechnern gehen. Aber erstens ist das nicht in allen Fällen so und zweitens besteht halt doch noch ein geringfügiger Unterschied zwischen USB-Festplatte und Diskette. ;)
PS: Wir empfehlen eigentlich immer, GRUB statt einem eigenen Bootloader zu benutzen. Ein eigener Bootloader ist ein Projekt für sich, und eigentlich willst du ja "nur" ein OS schreiben.
PPS: Das Forum macht automagisch Zeilenumbrüche, die brauchst du nicht manuell reinbauen. ;)
-
das booten funktioniert schon, ich hab das erst von einem usbstick probiert und dann von platte, da es vom usbstick doch etwas lange gedauert hat. es scheint so, dass der bootloader funktioniert, er dann aber den kernel nicht findet o.ä.
da auf den rechner sowieso ein grub läuft werd ich mir das nochma anschaun.
danke für die schnelle antwort,
bg nico
PS: zum zeilenumbruch: mein terminal hat 80 zeichen pro zeile ;-)
-
Hi,
In der Ausgabe wird ja das Laufwerk, mit dem gebootet wurde, anhand von DL erkannt. Eventuell gibt BIOS falsche Werte in DL, wenn von USB-Stick gebootet wird?
-
ich hab jz erstmal den tipp mit grub versucht, das funktioniert auch soweit, dass (glaub ich) der kernel gebootet wird. es wird aber dann gleich ein reset durchgeführt. es gibt schon einen ähnlichen thread, der mir aber nicht weiterhelfen konnte. Ich poste hier einfach mal den code (den hab ich teils aus dem tutorial und dem thread):
[Bits 32]
global _start
_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd 0x00100000 + _mbh ; physische Adresse an die die Multiboot Header geladen werden soll
dd 0x00100000 ; physische Adresse an die geladen wird, physisch 1MB
dd 0x00100000 + _end ; physische Adresse des Endes des Code & Datenteils
dd 0x00100000 + _end ; physische Adresse des Endes des BSS-Teils (momentan überhaupt kein BSS teil)
dd 0x00100000 + _start ; Entry-Point
_start:
mov ax,0x1000
mov ds,ax
mov es,ax
mov si,msg
call putstr
_stop:
jmp _stop
_end:
msg db "welcome..",13,10,0
putstr:
loadsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
nachdem ich im grub boot eintippen, wird gleich ein reboot ausgeführt. wäre schön, wenn mir jemand helfen oder nen tipp geben könnte.
bg nico
-
Ich denke es ist keine gute Idee cs, ds, usw zu verändern, bevor du deine eigene GDT initialisiert hast. Vorallem denke ich, dass Grub kein Segment 0x1000 erstellt.
-
Nur um das deutlicher zu sagen: Du bist mit deinem Kernel im Protected-Mode, nicht mehr im Realmode. Dein Code sieht aber sehr nach Code aus einem Real-Mode Tutorial aus.
edit: Im wiki befindet sich ein Tutorial für einen C Kernel mit Grub (http://lowlevel.brainsware.org/wiki/index.php/C-Kernel_mit_Grub), vllt hilft dir das weiter.
-
Und allerspätestens der int 0x10 erledigt das System.
dd 0x00100000 + _mbh ; physische Adresse an die die Multiboot Header geladen werden soll
dd 0x00100000 ; physische Adresse an die geladen wird, physisch 1MB
dd 0x00100000 + _end ; physische Adresse des Endes des Code & Datenteils
dd 0x00100000 + _end ; physische Adresse des Endes des BSS-Teils (momentan überhaupt kein BSS teil)
dd 0x00100000 + _start ; Entry-Point
Diesen Teil kannst du dir übrigens sparen, wenn du ELF benutzt.
-
jo so ist es. wenn ich das richtig verstanden habe, kann man im protected mode erstmal nur graka-ausgaben über die adresse des videospeichers machen (das wäre der punkt, wo ich versuche hinzukommen :-)) es wäre nett,
wenn mir vllt. jemand einen ansatz geben könnte, wie ich weitermachen müsste und was alles initialisiert werden müsste. Der Unterschied zum "C Kernel mit Grub" Tutorial wäre, dass ich halt den Kernel in ASM proggen möchte.
Vielen Dank für die schnellen Antworten
bg nico
-
evtl. hilft dir der Wikiartikel Textausgabe (http://lowlevel.brainsware.org/wiki/index.php/Textausgabe) weiter :-)
btw. C/C++ Code ist relativ einfach zu lesen/verstehen, insofern sollte es nicht wirklich ein Problem sein den Code in Assembler zu übersetzten.
-
so jetzt läuft's ;-) hab den code in assembler geschrieben.