Autor Thema: Grub Error 17 in Qemu  (Gelesen 8379 mal)

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« am: 09. January 2010, 11:00 »
Hi,

ich habe die Tutorials in eurem Wiki durch gemacht. Nun scheitere ich jedoch, den Kernel irgendwo auszuprobieren. Daher habe ich den Wiki über GRUB-Image erstellen gelesen.
In Qemu wurde dann auch GRUB geladen, nur GRUB erkennt meinen Kernel nicht. Es sagt immer: Error 17: Cannot mount selected Partition.
Dann habe ich das Tutorial mal weitergelesen und noch das Menü für GRUB hinzugefügt, doch das übergeht GRUb einfach.
Ich benutzen Linux. Und das Image hat 4 Dateien: /kernel.krn /grub/stage1 /grub/stage2 /grub/menu.lst.
Wenn ich ihn GRUB bin gebe ich ein: kernel /kernel.krn

Was mache ich falsch?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 09. January 2010, 11:21 »
Benutzt du das Image auch tatsächlich als Floppy? Ich glaube nämlich, irgendwie so eine Fehlermeldung gab es, wenn man es als Festplattenimage benutzt. GRUB kann nicht mit unpartitionierten Festplatten umgehen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #2 am: 09. January 2010, 12:19 »
ich weiss nicht wie ich es benutze. Ursprünglich wollte ich den kernel direkt laden, mit qemu -kernel kernel.krn.
Das funktioniert aber nicht, da der pc mit dem ich arbeite zu wenig RAM hat. Dann habe ich es mit -no-kqemu ausprobiert, das erkennt er dann aber auch nicht.
Darum gebe ich jetzt einfach: qemu -no-kqemu img, dabei ist img das image. Und dann kommt eben dieser Error. Wie würde ich es als Floppy einbinden?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 09. January 2010, 12:24 »
-fda img
siehe auch hier
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

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #4 am: 09. January 2010, 12:36 »
Danke es klappt.

Ich habe aber noch eine Frage, warum wird mehr als Hello World! ausgegeben, erst noch einige Zahlen und noch ein: Starting Up...
Ist das von GRUB?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 09. January 2010, 12:57 »
GRUB macht einige Ausgaben, die natürlich stehen bleiben, wenn du nicht den Bildschirm löscht, d.h. mit 0 oder sowas überschreibst. Aber es könnte natürlich auch sein, dass deine Ausgabefunktion kaputt ist und deswegen weitere Sachen ausgegeben werden. Insofern würde ich dir raten den Bildschirm zu löschen.
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

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #6 am: 09. January 2010, 13:34 »
Ich schreibe jetzt gerade die Funktionen, nach denen in Teil 4 verlangt wird, zum Bildschirm clearen und Dinge auszugeben.
Wie wichtig ist dabei diese stdarg.h?

Wenn ich ein char in Form des at-Zeichens(@) im C-Quellcode habe, würd das dann auch in das richtige Codepage 437 Zeichen umgewandelt, oder muss ich das in der Funktion erledigen?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 09. January 2010, 14:26 »
Ich schreibe jetzt gerade die Funktionen, nach denen in Teil 4 verlangt wird, zum Bildschirm clearen und Dinge auszugeben. Wie wichtig ist dabei diese stdarg.h?
Die brauchst du sobald du variable Argumetnlisten (das "..." in der Argumentliste, auch Ellipsis genannt, wie bei pritnf) verwendest.

Zitat
Wenn ich ein char in Form des at-Zeichens(@) im C-Quellcode habe, würd das dann auch in das richtige Codepage 437 Zeichen umgewandelt, oder muss ich das in der Funktion erledigen?
@ gehört zu den ASCII-Zeichen, insofern hast du damit überhaupt kein Problem.
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

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #8 am: 09. January 2010, 14:34 »
Mal eine vielleicht ganz andere Frage, wie spreche ich die I/O Ports an?
Mit einer outb Funktion?
Aber wie schreibe ich die? Ich möchte nämlich den dämlichen Cursor wegbekommen, weiss aber nicht wie Ich diese Ports anspreche.
Kann mir jemand helfen?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 09. January 2010, 14:43 »
siehe wiki
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

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #10 am: 09. January 2010, 15:25 »
Das heißt die outb Funktion sollte in Assembler geschrieben werden?
Aber ich verstehe immer noch nicht wie ich die Register laden muss, damit ich Ports anspreche und welche Befehle ich überhaupt brauche.
Dazu finde ich leider nirgends etwas.

Cool-Andy

  • Gast
Gespeichert
« Antwort #11 am: 09. January 2010, 15:32 »
Zitat
Das heißt die outb Funktion sollte in Assembler geschrieben werden?

Ja, normalerweise macht man das via Inline-Assembler

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #12 am: 09. January 2010, 16:26 »
Ok, ich habe gesucht und was gefunden out oder outb?
Ich habe nun eine Funktion damit geschrieben:void outb(int port, int data)
{
asm("outb %0,%1" :: "a" (data), "d" (port));
}
Das ist jedoch noch nicht alles so richtig, oder?

Cool-Andy

  • Gast
Gespeichert
« Antwort #13 am: 09. January 2010, 16:57 »
Ich würde auf jeden Fall noch ein "volatile" nach asm hängen:
asm volatile ...
Ich weiß nicht ob man das muss. Bei Inline-Assembler habe ich es mir aber angewöhnt, weil wegen diesem Schlüsselwort bei mir schon viel Zeit für Fehlersuche drauf gegangen ist.  :-D

niknett

  • Beiträge: 30
    • Profil anzeigen
    • Gatoniel.de
Gespeichert
« Antwort #14 am: 09. January 2010, 17:04 »
Also der Fehler liegt bei mir irgendwie daran, dass der Assembler Code falsch ist. Der Compiler meldet: suffix or operands invalid for `out'.
Aber ich verstehe nicht wie die OPeranden aussehen sollen.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #15 am: 09. January 2010, 18:30 »
asm volatile("outb %%al, %%dx" :: "d" (port), "a" (value));
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 #16 am: 09. January 2010, 20:34 »
Also der Fehler liegt bei mir irgendwie daran, dass der Assembler Code falsch ist. Der Compiler meldet: suffix or operands invalid for `out'.
Aber ich verstehe nicht wie die OPeranden aussehen sollen.
Ich glaube, das Problem ist, dass die Datentypen nicht passen. Also outb hätte gern ein Byte, aber int data sind 32 Bit. Eventuell muss die Portnummer auch genau 16 Bit sein. bluecodes Variante sollte auf jeden Fall funktionieren.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen