Ich will mit C/C++ die IDT Laden. Im Boot Loader hab ich noch die Hardware Interrups umgeleitet:
irq:
mov al, 00010001b ;Das ICW in AL schreiben
out 0x20, al ;ICW an PIC1 senden
out 0xA0, al ;ICW an PIC2 senden
mov al, 0x20 ;AL auf 32 setzen
out 0x21, al ;ICW2 an ersten PIC senden
mov al, 0x28 ;AL auf 40 setzen
out 0xA1, al ;ICW2 an zweiten PIC senden
mov al, 00000100b ;Die IRQ2 Leitung auf 1 setzen
out 0x21, al ;An den Master-PIC senden
mov al, 2 ;Hier nun die NUMMER der IRQ-Leitung angeben
out 0xA1, al ;An den Slave-PIC senden
mov al, 00000001b ;Die Bits wie oben beschrieben setzen
out 0x21, al ;ICW4 an Master-PIC senden
out 0xA1, al ;ICW4 an Slave-PIC senden
retn
Und im C Kernel hab ich dazu folgenden Code:
struct idt_daten{
unsigned short limit;
unsigned int base;
} __attribute__((packed));
struct idt_entry
{
unsigned short offset_low;
unsigned short selector;
unsigned char zero;
unsigned char access;
unsigned short offset_high;
} __attribute__((packed));
struct idt_entry IDT[256];
void setup_IDT()
{
unsigned char i;
make_IDT(i,(unsigned int) int0,8,0x8E);
make_IDT(i,(unsigned int) int1,8,0x8E);
…
make_IDT(i,(unsigned int) int50,8,0x8E);
for(i = 51; i < 256; i++)
{
make_IDT(i,(unsigned int) int00,8,0x8E);
}
}
void make_IDT(unsigned char n, unsigned int iBase, unsigned short shSelector, unsigned char cAccess)
{
IDT[n].offset_low = ((iBase) && 0xffff);
IDT[n].selector =shSelector;
IDT[n].zero =0;
IDT[n].access = cAccess;
IDT[n].offset_high = ((iBase >> 16) & 0xffff);
}
void LoadIDT()
{
struct idt_daten idt_ptr;
idt_ptr.limit = 256*8 - 1;
idt_ptr.base = (unsigned int)IDT;
//IDT laden
asm("lidt %0" : : "m" (idt_ptr));
}
Und eine Funktion im asm Teil.
_int50:
mov esi, 0xb8030
mov byte [esi], 'T'
mov byte [esi+1], 10
iret
Und der Aufruf in der Main Funktion:
setup_IDT();
LoadIDT();
asm("int $50");
Jedoch sehe ich kein Ergebnis auf den Bildschirm.
Woran kann das liegen?