COBE 0.1 ALPHA
|
Diese Datei enthält die Funktionen zur Erstellung der GDT. Mehr ...
gehe zum Quellcode dieser Datei
Funktionen | |
void | init_gdt () |
Diese Funktion initialisiert die GDT, dabei werden alle nötigen Einträge in das Array eingetragen und initialisiert. | |
void | set_gdt (int gdt_num, unsigned int adress, unsigned int size, unsigned char access, unsigned char flags) |
Mit dieser Funktion kann man Einträge für die GDT erstellen. | |
Variablen | |
gdt_entry | gdt [6] |
Dieses Array mit sechs GDT Einträgen bildet die gesamte GDT. | |
gdt_ptr | gdt_pointer |
Dieser Struktur-Pointer beinhaltet einen Base-Zeiger auf dei GDT und eine Limit-Variable der GDT. | |
new_tss_t | tss |
Die TSS wird erstellt und bildet den sechsten Eintrag der GDT. |
Diese Datei enthält die Funktionen zur Erstellung der GDT.
Definiert in Datei gdt.c.
void init_gdt | ( | ) |
Diese Funktion initialisiert die GDT, dabei werden alle nötigen Einträge in das Array eingetragen und initialisiert.
Zunächst wird der Struktur-Pointer initialisiert, indem die Limit die Gesamtgröße der GDT-1 liefert. Danach werden die GDT-Einträge: CS DS, FS, GS in die GDT eingetragen. Der letzte Eintrag und der einzige mit einer richtigen Base- und Limit bildet die TSS, welche für das Multitasking relevant ist. Danach wird die TSS mit RING0-Werten belegt. Mit dem Befehl lgdt wird die GDT geladen, dabei wird der Struktur-Pointer als Adresse angegeben. Im Anschluss werden die Datensegmente mit RING0-Werten geladen und auch das CodeSegment bekommt RING0-Rechte (es kann in ein Code-Segment nur hineingesprungen werden). Als letztes wird das TSS-Register neu geladen.
void set_gdt | ( | int | gdt_num, |
unsigned int | adress, | ||
unsigned int | size, | ||
unsigned char | access, | ||
unsigned char | flags | ||
) |
Mit dieser Funktion kann man Einträge für die GDT erstellen.
Die vielen Aufteilungen der Parameter entsteht aus dem Grund der Kompatibilität, da früher die GDT etwas kleiner war und manche Adressbereiche erst später hinzugefügt worden sind, sodass eine Adresse auf mehrern Plätzen zersplittert ist. In Protected-Mode Systemem ist die Base-Adresse jedoch 0. Die Größe eines Segments beträgt 65 KByte. Die Flags und Access-Flags entscheiden, um was für ein Segment und mit welchen Rechten es sich handelt.
gdt_num | Dieser Parameter bestimmt den Index der GDT |
adress | Dieser Parameter enthält die Base-Adresse |
size | Dieser Parameter beinhaltet zum einen in den niederwertigen 16-Bit das Segment-Limit, in den höherwertigen 8-Bit den niederwertigen Teil der Flags |
access | Dieser Parameter enthält die Rechte und die Art des Segments |
flags | Dieser Parameter enthält die höherwertigen 8-Bit der Flags (für die niederwertigen 8-Bit siehe size) |
Die TSS wird erstellt und bildet den sechsten Eintrag der GDT.
Definiert in Zeile 17 der Datei multitasking.c.