Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: JG am 08. March 2005, 18:29
-
Hallo,
wie kann ichh sachen in die IDT schreiben, z.b was bei einem Fehler passiert?
-
lies zuerst einmal das tutorial von tj und andere interrupt oder irq tutorials...
lies am besten gleich alle von tj... irgendwann brauchst du sie alle mal :D
für meinen idt habe ich die tuts oder docs von osdever.net gebruacht..
-
ja, die von OSDEVER.NET sind bei IDT praktisch. man klicke auf "tutorials" und dann auf "interrupts & IRQs"...
-
Hallo,
danke, aber dazu hab ich noch ne Frage: Wie/Wo trag ich dort ein, welche funktion aufgerufen werden soll, bzw kann ich dort überhaupt ne C funktion aufrufen?
-
ich habe zum erstellen meines os quelltexte verschiedener os gelesen... und mich inspirieren lassen (dass heisst nicht abschreiben, oder copy past ;)) nur ideen sammeln..
in diesem sinne kannst sonst mal mein source downloaden und ihn anschauen, oder ander sourcecodes..
-
ne, ne abschreiben tu ich schon net, weil was hat man davon?
-
Nur eine Frage:
In welcher Datei ist das?
-
du benötigst dazu pic.c isr.asm und idt.c
-
Danke! Hat mir sehr geholfen :D
nur eine Frage hab ich noch, in der isr.asm steht doch
[global _isr_0]
[extern _interrupt_0]
_isr_0:
pusha
push ds
push es
push fs
push gs
call _interrupt_0
pop gs
pop fs
pop es
pop ds
popa
iret
In welcher Datei ist interrupt_0 und was heißt der Befehl "iret" ist das eine andere Form von "ret"?
-
iret benutzt man, wenn man aus einem interrupt zurück kommt. da wird neben CS und offset auch eflags wieder geholt...
-
Danke und weiß das andere jemand?
-
Logisch wäre es, dass interrupt_0 in der c datei liegt...
-
Hab ich mir auch gebacht, aber nix gefunden.
@zack: Ich glaub ich hab bei dir einen Fehler endeckt:
Ich sehe nirgendwo, dass du das EOI an die Pic's sendest...
-
so, die routine ist in system.c da es eine exception ist... mann muss das eoi nur bei einem irq senden, nicht aber bei einem interrupt... soweit ich dass mitbekommen habe....
scrolle in der isr.asm ganz nach unten, dort send ich es.. ;)
-
Ja, danke. Ich send das eoi über eine c Funktion. Wie teilt man der cpu mit wo die idt is?
-
Ich hab trotzdem noch ein paar Fragen. ICh hab ja eine asm date, die z.b.
extern isr0
isr_0:
pusha
push ds
push es
push fs
push gs
call isr0
pop gs
pop fs
pop es
pop ds
popa
iret
enthält. Also wird ja die Funktion isr0 aufgerufen. dann noch eine c datei, die die isr0 enthält. nur was soll das "AddInterrupt" und so im Code von pirat-os?
-
Kann mir keiner helfen?des mit der idt versteh ich ganz und gar nicht :cry:
-
dieser asm code von dir ist nich die idt sondern die isr. dein pic ruft z.b bei einem tastaturevent den idt-eintrag an der 0x28 stelle auf (wenn du den pic so gemmapt hast) dann ist im idt die adresse von isr_0 gespeichert. diese routinge wiederum ruft dann isr0 im c auf.
AddInterrupt erstellt einen eintrag in der idt mit einem pointer auf einen isr-eintrag der gebraucht wird um eine c-funktion aufzurufen...
-
ah, solangsam wird mir des klar :D
Nur für was ist
unsigned short int selector = 0x08;
asm volatile ("movw %%cs, %0 " : "=g" (selector));
IDT[_number].l_offset = (offset & 0xFFFF); //Lowword of offset
IDT[_number].h_offset = (offset >> 16); //highword of offset
, das __attribute__ ((packed))
nach einer Struktur und IDTR.limit = (256*sizeof(interrupt))-1;
IDTR.base = IDT;
idtr *IDTRptr = &IDTR;
aus der LoadIDT gut?
-
1. damit kann ich den cs-selektor ausrechnen. nützlich wenn ich meinen zb mal meinen cs-selektor verschiebe (änderungen in der gdt).... anschliessend wird das doubleword in die zwei teile aufgeteillt
2. somit wird die struktur binär genau so abgelegt wie ich es will. ohne diese attribut könnte der compiler meine variablen verschieben..
3. sollte wohl selbst erklärend sein...