Autor Thema: Ein paar Verständnisfragen zum PM  (Gelesen 6406 mal)

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 30. April 2011, 12:13 »
Ich bins mal wieder :D

Also ich habe ein paar Fragen zum PM, v.a. der Segmentierung, der GDT und Paging:

1. Wenn ich Paging verwende, brauche ich dann eine GDT?

2. Wenn ich mit GRUB mein OS boote, befinde ich mich ja im PM, und eine (grundlegende?) GDT ist auch schon angelegt. Wenn ich nun keine GDT benötige (kommt auf die Antwort oben an), da ich pagen will, kann ich diese GDT irgendwie deaktivieren?

3. Hängt die IDT von der GDT ab, oder kann ich die auch mit Paging implementieren?

Grundlegende, noobige OS-Fragen, aber ich hoffe dass sich doch jemand erbarmt mir zu helfen :)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 30. April 2011, 13:57 »
Hi,

um Paging zu nutzen, musst du im PM sein. Um in den PM zu kommen, brauchst du eine GDT. Du kannst sie also auch nicht wieder deaktivieren ohne den PM zu verlassen.

Häufig werden die Möglichkeiten, die die Segmentierung bietet, ignoriert. Dann wird einfach der gesamte Adressraum 1:1 abgebildet (Basis 0, Limit 4GB). Zum Beispiel wie im Teil 5 des Tutorials im Wiki.

Wenn ich die dritte Frage richtig verstehe, dann hat sie sich mit der Antwort erübrigt, weil du um die GDT nicht herumkommst. Ansonsten musst du nochmal genauer erklären, was du meinst.
Dieser Text wird unter jedem Beitrag angezeigt.

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #2 am: 30. April 2011, 16:06 »
Moin

Die IDT hat mit der GDT nichts zu tun, die musst du aber anlegen sobalt du IRQ's oder Exceptions abfangen willst.Iin der IDT musst du für die entsprechenden interrupts jeweils einen Handler eintragen. Näheres dazu findest du im Entsprechendem Wiki artikel.
Und wie Jidder schon sagte, du lädst eine neue GST mit den segmenten Basis 0 und limit 4GB.
Und den Rest erledigst du dann über das Paging.

PNoob

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 30. April 2011, 22:10 »
Hallo,

1. Wenn ich Paging verwende, brauche ich dann eine GDT?
Ja. Die brauchst du aber auch ohne Paging.

2. Wenn ich mit GRUB mein OS boote, befinde ich mich ja im PM, und eine (grundlegende?) GDT ist auch schon angelegt. Wenn ich nun keine GDT benötige (kommt auf die Antwort oben an), da ich pagen will, kann ich diese GDT irgendwie deaktivieren?
Du brauchst eine GDT und dies ist nicht die von GRUB. Das heißt, obwohl du eine grundlegende GDT bekommen hast, musst du dir für Interrupts trotzdem eine eigene ausdenken, da du die von GRUB nicht kennst (und die sich auch jederzeit ändern könnte).

3. Hängt die IDT von der GDT ab, oder kann ich die auch mit Paging implementieren?
Die IDT muss im Speicher liegen, wenn du sie lädst, der dafür verwendete Speicher muss also über die GDT erreichbar sein. Das hat mit Paging aber vorerst ebenfalls nichts zu tun.

Grundlegende, noobige OS-Fragen, aber ich hoffe dass sich doch jemand erbarmt mir zu helfen :)
Wenn ich kann, ja. ;-)

Gruß,
Svenska

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. May 2011, 14:21 »
Okay, also ich setze die GDT dann also auf den gesamten physischen Adressraum und "lege" das Paging dann darüber.
Aber was für ein Deskriptor sollte das dann sein (Codesegement, Datansegment, ...) bzw. welche Flags soll ich für den einen Deskriptor setzen?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 01. May 2011, 15:05 »
Du brauchst beide mit den Flags wie in Teil 5 beschrieben. Es reichen für den Anfang die ersten 3 Einträge (Index 0 bis 2).
Dieser Text wird unter jedem Beitrag angezeigt.

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. May 2011, 19:00 »
Okay gut danke an alle :)
Jetzt habe ich noch eine Frage zum Paging. Wenn ich Paging aktiviere (nachdem ich die GDT und die IDT geladen habe, also die GDT so wie oben mit einem Code- und einem Kernelsegment mit Limit 0xfffff) und ein Pageframe auf den gesamten physischen Speicher mappe, funktioniert meine Ausgabe auf dem Bildschirm nicht mehr, also meine printf()-Funktion, die mit einem Zeiger auf den Videospeicher ab 0xB8000 zugreift. Eine Exception tritt nicht auf, aber es wird wie gesagt nichts auf dem Bildschrim ausgegeben und es muss mit dem Paging zu tun haben.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 01. May 2011, 20:17 »
Okay, also ich setze die GDT dann also auf den gesamten physischen Adressraum und "lege" das Paging dann darüber.
Genauer gesagt legst du das Paging drunter. Virtuell nach linear ist Segmentierung (also GDT/LDT) und linear nach physisch ist Paging.

Wegen deinem leeren Bildschirm: Sicher, dass du virtuell 0xB8000 auf physisch 0xB8000 gemappt hast?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 01. May 2011, 21:04 »
Also das heißt doch dann, dass ich erst Paging aktiviere (linear auf physisch) und danach die GDT lade oder?
Und wegen dem Videospeicher: Ich habe den Videospeicher von 0xB8000 bis 0xBFFFFF mit dem Code aus dem Tutorial gemappt, d.h. mit paging_map_physical(0x0, 0x0, 0xFFFFFFFF) gemappt, d.h. doch eigentlich, dass der gesamte Speicher auf eine Page gemappt ist (?)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 01. May 2011, 21:40 »
Solange Paging aus ist, ist linear = physisch. Segmentierung kann man nicht ausschalten, die GDT muss also auf jeden Fall initialisiert werden. GRUB hat dir schon eine temporäre GDT erzeugt, in welcher Reihenfolge du weitermachst (GDT neuladen oder Paging aktivieren) bleibt also dir überlassen. Üblich ist, erst die GDT zu machen.

Dieses paging_map_physical kenne ich nicht (welches Tutorial denn?), aber wenn es funktioniert, wie man das erwarten würde, dann könnte das so tun (obwohl ich als Länge was page-aligntes erwarten würde). Du kannst in qemu auch mal im Monitor 'info tlb' anschauen, ob er das Mapping dort richtig hat.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 03. May 2011, 20:23 »
Okay, danke an alle, ihr habt mir sehr geholfen :)

 

Einloggen