Autor Thema: Textausgabe  (Gelesen 4986 mal)

yoda

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 10. April 2012, 12:18 »
Hallo,
ich habe jetzt eine weile im Real Mode herumexperimentiert und habe jetzt angefangen einen Multiboot Kernel zu bauen. Dieser wird auch von Grub2 erkannt, aber ich scheitere einfach an der Textausgabe. Wenn ich von dem Assemblerteil in den C-Teil springe, dann müsste ich doch mit folgendem Code ein hellblaues A auf den Bildschirm schreiben können:
unsigned short* video = (unsigned short* )0xa8000;
*video = (((unsigned short )3) << 8) | (unsigned short )'a';
Ich schreibe übrigens an die Adresse 0xa8000, weil der Kernel nach dem Laden ja bei 0x10000 liegt. Wenn ich das dann aber in Virtualbox ausprobiere, dann startet Grub das System, und nichts passiert. Hat jemand eine Idee?
There are 10 kinds of people, those who can and those who can't read binary.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. April 2012, 13:20 »
Ich schreibe übrigens an die Adresse 0xa8000, weil der Kernel nach dem Laden ja bei 0x10000 liegt. Wenn ich das dann aber in Virtualbox ausprobiere, dann startet Grub das System, und nichts passiert. Hat jemand eine Idee?
Wo dein Kernel liegt ist irrelevant. Wenn ich das richtig verstanden habe, hast du die GDT noch nicht angepasst und Paging auch noch nicht eingeschaltet. Damit ist die Basis der Segmente bei 0 und alle Adressen werden 1:1 als physische Adressen übernommen. Du landest also mit 0xa8000 nicht bei 0xb8000 wo du hin willst sondern bei 0xa8000.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

yoda

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. April 2012, 13:45 »
Danke, erstmal. Aber ich hab's auch schon mit 0xb8000 ausprobiert und ich dachte, dass grub die GDT so initialisiert, dass man mit der Adresse 0 bei 0x10000 landet. Andere Ideen?  :?
There are 10 kinds of people, those who can and those who can't read binary.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. April 2012, 13:53 »
0xb8000 ist aber richtig. Multiboot garantiert dir Basis 0 und Limit 4 GB für alle Segmente (oder jedenfalls für alle Segmente, für die es was garantiert - bei fs und gs bin ich mir unsicher).

Dein Kernel landet übrigens ziemlich sicher nicht bei 0x10000 (64k), da würde GRUB nämlich nicht mitmachen. Wahrscheinlicher ist 0x100000 (1 MB).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 10. April 2012, 13:57 »
Wenn du das
[…]ich dachte, dass grub die GDT so initialisiert, dass man mit der Adresse 0 bei 0x10000 landet.
Dann linkst du das vermutlich auch falsch. Hast du das Tutorial schon gelesen?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen