Hallo,
ich hab mich mal versucht durch den schon vorhanden source-code durchzuwuehlen..(ich dachte immer ich koennte c++ ziemlich gut *hust!).. nur irgendwie hat mir das auch nicht viel gebracht..koenntet ihr mal irgendwie so ein kleines 'statement' abgeben zu den schon vorhandenen klassen:
// Descriptors
class CDescriptor;
class CSegmentDescriptor;
class CCodeSegmentDescriptor;
class CDataSegmentDescriptor;
class CTSSegmentDescriptor;
class CLDTSegmentDescriptor;
class CGateDescriptor;
class CCallGateDescriptor;
class CTaskGateDescriptor;
class CTrapGateDescriptor;
class CInterruptGateDescriptor;
template <int>
class CDescriptorTable;
class CLDT;
class CGDT;
class CIDT;
// Paging
class CPageTableEntry;
class CPageDirectory;
class CPageTable;
// Segments
class CTaskStateSegment;
waere vielleicht hilfreich..vor allem interessant waere fuer mich die CIDT-klasse...nur blick ich da nicht ganz durch, was da jetzt noch zu machen ist bzw was schon da ist.
lg, hannibal
Die CDescriptor-Klassen wrappen Deskriptoren in IDT, GDT und LDT(die wir allerdings nicht verwendent, die LDT).
Der Name verrät eigentlich schon sehr viel, welche Deskriptoren das sind.
Die Basisklasse CDescriptor bietet Funktionen, die für alle Deskriptoren verfügbar sind, z.B. GetPrivilege(), welches das im Deskriptor festgelegte Privileglevel zurückgibt.
Dann sind in der Klasse noch protected-Funktionen, diese stehen nur den Ableitungen zur Verfügung.
Das ganze spaltet sich dann in 2 Klassen, CSegmentDescriptor und CGateDescriptor. Ist eigentlich auch recht selbst erklärend. Auch diese Klassen stellen wieder Funktionen bereit, die für alle Ableitungen vorhanden sein sollen. Bei den Gatedeskriptoren ist noch zu beachten, das einige Ableitungen dann diese Funktionen doch nicht brauchen, z.B.
CTaskGateDescriptor braucht kein Offset, deshalb ist die Funktion als private deklariert, damit man nicht drauf zugreifen kann.
Die CDescriptorTable-Klassen, wrappen wie der Name schon sagt, verschiedene Deskriptortabellen, dieser gibt es 3,
die Interrupt Deskriptor Tabelle (IDT),
die Globale Deskriptor Tabelle (GDT),
die Lokale Deskriptor Tabelle (LDT)
CDescriptorTable ist als Template angelegt, mit einem Template-Parameter für die Größe der Tabelle.
IDT hat maximal 256 Einträge, GDT und LDT jeweils maximal 8192.
Auf die einzelnen Deskriptor zugreifen tut man über GetAt kann man auf einen Deskriptor an einer bestimmten position zugreifen.
IDT, GDT und LDT wrappen jetzt noch Deskriptortabellenspezifische Sachen.
z.B. CIDT::SetIDT, welches einen Parameter für die Anzahl der Einträge übernimmt. SetIDT selber, verwendet den asm-Befehl, lidt.
Ebenso GetIDT, du musst eigentlich keinen Pointer auf die IDT speichern.
CIDT::GetIDT() und du hast einen Zeiger auf die aktuelle IDT.
CPageDirectory wrappt ein PageDirectory, CPageTable wrappt eine Pagetable und CPageTableEntry wrappt PageDirectory sowie PageTable Einträge.
CTaskStateSegment wrappt letztendlich ein TaskStateSegment
Also beim nochmal drüberschauen, über x86.h fällt mir auf, das die Namensgebung teilweise recht grob ist, z.B. CGDT::SetGDT(WORD woSize), könnte einen Veranlassen, zu denken, das man die Größe der GDT in Bytes übergeben muss, es müssen aber nur die Anzahl der GDT-Einträge übergeben werden.
Für Beispiele, lohnt ein Blick in exception.cpp und paging.cpp
MfG
DDR-RAM