Hi,
ich muss die GDT/IDT von meinem alten C-Kernel auf den neuen Pascal-Kernel übertragen.
Habt ihr eine Idee wie ich das übersetzen könnte ?
Das war mein Zwischenergebnis:
type
TableRegister = record // IDT/GDT-Register
Size : Single;
Long : Double;
end;
InterruptGate = record // Gate in der IDT
Offset_Low : Word = 16; // <-- =16 ist sogar nach Syntax verboten, tja
end;
Hier der Code
typedef struct _TableRegister // IDT/GDT-Register
{
unsigned short size; // Größe der Tabelle
unsigned long base; // Basisadresse der Tabelle
} TableRegister, *pTableRegister;
typedef struct _InterruptGate // Gate in der IDT
{
unsigned int offset_low : 16; // 1. Word der Funk.-Adresse
unsigned int selector : 16; // Selektor aus der GDT
//unsigned int reserved_1 : 8; // 0
unsigned int : 8; // 0
unsigned int type : 3; // Zugriffs- und Statusbyte
unsigned int size : 1;
//unsigned int reserved_2 : 1; // 0
unsigned int : 1; // 0
unsigned int DPL : 2; // Zugriffslevel
unsigned int present : 1; // Present im speicher
unsigned int offset_high : 16; // 2. Word der Funk.-Adresse
} InterruptGate, *pInterruptGate, TrapGate, *pTrapGate;
typedef struct _Gate // Gate in der IDT
{
unsigned int offset_low : 16; // 1. Word der Funk.-Adresse
unsigned int selector : 16; // Selektor aus der GDT
unsigned int param : 5; // Parameter auf dem Stack
//unsigned int reserved_1 : 3; // 0
unsigned int : 3; // 0
unsigned int type : 4; // Zugriffs- und Statusbyte
//unsigned int reserved_2 : 1; // 0
unsigned int : 1; // 0
unsigned int DPL : 2; // Zugriffslevel
unsigned int present : 1; // Present im speicher
unsigned int offset_high : 16; // 2. Word der Funk.-Adresse
} Gate, *pGate, CallGate, *pCallGate;
typedef struct _Descriptor // Descriptor in der GDT
{
unsigned int size_low : 16; // 1. Word der Größe
unsigned int base_low : 16; // 1. Word der Basisadresse
unsigned int base_mid : 8; // 3. Byte der Basisadresse
unsigned int access : 1; // Zugriff & Segmenttyp
unsigned int type : 3; // Zugriff & Segmenttyp
unsigned int system : 1; // Zugriff & Segmenttyp
unsigned int level : 2; // Zugriff & Segmenttyp
unsigned int present : 1; // Zugriff & Segmenttyp
unsigned int size_high : 4; // Letztes Nibble der Größe
unsigned int avl : 1; // Zusatz
unsigned int null : 1; // Zusatz
unsigned int _386 : 1; // Zusatz
unsigned int seg_size : 1; // Zusatz
unsigned int base_high : 8; // Letztes Byte der Basisadresse
} Descriptor, *pDescriptor;
pDescriptor GDT_BASE_POINTER;
pGate IDT_BASE_POINTER;
pTrapGate IDT_BASE_POINTER_TRAP_GATE;
pInterruptGate IDT_BASE_POINTER_INTERRUPT_GATE;
pCallGate IDT_BASE_POINTER_CALL_GATE;
TableRegister gdt, idt;