Autor Thema: C -> Pascal  (Gelesen 4430 mal)

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« am: 02. January 2008, 11:00 »
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;




kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 02. January 2008, 12:07 »
Pascal kann keine Bitfelder. Du mußt komplette Bytes nehmen und dann mit Bitoperationen darauf arbeiten.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Nils

  • Beiträge: 18
    • Profil anzeigen
    • nDallmeyer.de
Gespeichert
« Antwort #2 am: 05. January 2008, 10:55 »
Ich habe was so etwas betrifft mit Pascal noch nicht viel zu tun gehabt. Hast du nur ein ganz kleines Beispiel dafür ? (ob Code oder in Worten ist mir egal, hauptsache ich versteh es)

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #3 am: 05. January 2008, 12:13 »
Ich kann zwar nicht wirklich Pascal, aber ich hoffe du siehst trotzdem was gemeint ist. ;-)

InterruptGate = record // Gate in der IDT
Offset_Low : Word;
Selector : Word;
Reserved_0 : Byte;
Attr : Byte;
Offset_High : Word;
end;

Und dann im Code wo du ein Interrupt Gate erstellen willst:
gate.Offset_Low := (handler and 0xFFFF);
gate.Offset_High := (handler shr 16);
gate.Attr := (type or (size shl 1) or (dpl shl 4) or (present shl 6));
Das funktioniert so natürlich nur, wenn or und and auch wirklich bitweise funktionieren in Pascal. ;-)

« Letzte Änderung: 05. January 2008, 12:45 von FreakyPenguin »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. January 2008, 12:22 »
Das funktioniert so natürlich nur, wenn or und and auch wirklich bitweise funktionieren in Pascal. ;-)
Ja, tun sie, aber dein Code ist anderweitig kaputt, wie dir jeder Compiler feststellen würde. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen