Autor Thema: linux mal wieder....  (Gelesen 6716 mal)

nico

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« 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?
« Letzte Änderung: 04. April 2008, 21:38 von nico »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. April 2008, 22:50 »
[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. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nico

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. April 2008, 00:22 »
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 ;-)

jgraef

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. April 2008, 14:43 »
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?
« Letzte Änderung: 05. April 2008, 14:45 von jgraef »

nico

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. April 2008, 14:36 »
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

jgraef

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. April 2008, 15:06 »
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.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 06. April 2008, 15:20 »
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, vllt hilft dir das weiter.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. April 2008, 16:12 »
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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nico

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 06. April 2008, 16:17 »
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 06. April 2008, 16:22 »
evtl. hilft dir der Wikiartikel 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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

nico

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 09. April 2008, 15:46 »
so jetzt läuft's ;-) hab den code in assembler geschrieben.

 

Einloggen