Autor Thema: IDT funktioniert nicht  (Gelesen 22849 mal)

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #20 am: 22. August 2009, 14:31 »
#define intr_16 0x16
idt_set_gate(0x16, (unsigned)intr_16, 0x08, IDT_STD_GATE);

Falsch oder?^^

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 22. August 2009, 14:34 »
Ja, du musst dir methoden schreiben.
Ein makro könnte zum beispiel so aussehen:
.macro intr nr
.global intr_\nr
intr_\nr:
    pushl $0
    pushl $\nr
    jmp intr_handler
.endm
Dann definierst du in dem file einfach intr 22 und schon existiert die Methode intr_22
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #22 am: 22. August 2009, 14:43 »
asm(".macro intr nr\n\t.global intr_\nr\n\tintr_\nr:\n\tpushl $0\n\tpushl $\nr\n\tjmp intr_handler\n\t.endm");

#define intr_22 ...

Mit welchem Wert soll ich das definieren?
Wenn ich #define ohne Wert mache kommt ein Fehler.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 22. August 2009, 14:49 »
Das kann auch nicht funktionieren.
Macro ist keine asm-befehl.
Das ist nur ein Platzhalter, der vom Compiler dann angepasst wird.
Wenn du als intr_22 eingibst, dann ersetzt der Compiler intr_22 durch das angepasste Macro.

Hier ist mein Interrupt-Handler:
.macro intr nr
.global intr_\nr
intr_\nr:
    pushl $0
    pushl $\nr
    jmp intr_handler
.endm

.macro intr_err nr
.global intr_\nr
intr_\nr:
    pushl $\nr
    jmp intr_handler
.endm

//the exceptions
intr 0
intr 1
intr 2
intr 3
intr 4
intr 5
intr 6
intr 7
intr_err 8
intr 9
intr_err 10
intr_err 11
intr_err 12
intr_err 13
intr_err 14
intr 15
intr 16
intr_err 17
intr 18
intr 19
intr 20
intr 21
intr 22
intr 23
intr 24
intr 25
intr 26
intr 27
intr 28
intr 29
intr 30
intr 31

//the IRQs
intr 32
intr 33
intr 34
intr 35
intr 36
intr 37
intr 38
intr 39
intr 40
intr 41
intr 42
intr 43
intr 44
intr 45
intr 46
intr 47

.extern intr_dispatcher
intr_handler:
    //safe the cpu-status
    push %ebp
    push %edi
    push %esi
    push %edx
    push %ecx
    push %ebx
    push %eax

//load kernel-data-segment
    mov $0x10, %eax
    mov %eax, %ds
    mov %eax, %es

    push %esp
    call intr_dispatcher //call the dispatcher
    mov %eax , %esp

    //load user-data-segment
    mov $0x23, %eax
    mov %eax, %ds
    mov %eax, %es

    //restore the cpu-status
    pop %eax
    pop %ebx
    pop %ecx
    pop %edx
    pop %esi
    pop %edi
    pop %ebp

    //skip the errorcode and the intr-nr
    add $8, %esp

    iret

Hoffe, dass das jetzt verständlicher ist.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

DaCodaaa

  • Gast
Gespeichert
« Antwort #24 am: 22. August 2009, 14:59 »
intr_handler sollte dann eine Funktion aufrufen (logisch sonst tut sich ja nix). Das kannst du so machen:

Interrupts.c:
struct registers
{
    unsigned int gs, fs, es, ds;      //segmentregister
    unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
    unsigned int int_num, err_code;  //müssen von den Asm funktionen draufgepusht werden
    unsigned int eip, cs, eflags, useresp, ss;    //ACHTE AUF DIE REIHENFOLGE!!!
};

void *Interrupt_routines;

void install_handler(int interrupt, (*handler) (struct registers))
{
         interrupt_routines[interrupt] = handler;
}

void interrupt_handler(struct registers *reg)
{
    void (*handler)();

    handler = interrupt_routines[reg->int_num];
    if (handler)
    {
        handler(reg);
    }
}

int_num muss vom asm handler übergeben werden.
die entsprecehnde Funktion, welche vorher mit install_handler in die Tabelle eingefügt wurde wird dann aufgerufen.

den asm Code und das schreiben der Funktionen überlasse ich aber dir :-D.

EDIT: upps hab ja rizors ASM Code übersehen dann müsste meine interrupt handler Funktion intr_dispatcher(struct registers *regs) heissen.
« Letzte Änderung: 22. August 2009, 15:04 von DaCodaaa »

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #25 am: 22. August 2009, 15:22 »
Hmm...sorry, aber mein Compiler kann euren Code nicht komplimieren,
da kommen immer unmengen an Fehlern, hab versucht die wegzumachen, ohne Erfolg :(.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #26 am: 22. August 2009, 15:27 »
Oder ich schalte vor jeden Interrupt in den
Real Mode und danach wieder in den Protect Mode.
Ist zwar umständlich aber anders gehts nicht, oder?

DaCodaaa

  • Gast
Gespeichert
« Antwort #27 am: 22. August 2009, 15:36 »
Welchen Compiler und welchen assembler benutzt du denn und welche versionen?

Einige Fehler sind bei meinem Code bestimmt drin (ich habe den ja gerade rst geschrieben) aber die müsste man doch finden können?

einen fehler hab ich selber gesehen nachdem ich Gepostet habe:

void *Interrupt_routines klein schreiben. Ansonsten solltest du versuchen den asm code in nasm umzuwandeln und erst süäter mit dem linker einzubinden, da sich inline für solche aufgaben eher nocht eignet(also die $ Zeichen o.ä weglassen).

Und beschäftige dich mit dem Code. Versuch die Fehler zu finden und zu beheben, denn wenn du schon mit deinem Compiler kämfst wirst du sicher nicht weit kommen.
« Letzte Änderung: 22. August 2009, 15:39 von DaCodaaa »

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #28 am: 22. August 2009, 15:42 »
Wo muss der Code von Rizor denn hin? Kann ja nur Assembler sein.

Edit:

GCC: 3.4.5
NASM: 2.07
Linker: 2.9.4
« Letzte Änderung: 22. August 2009, 16:02 von Pk3 »

DaCodaaa

  • Gast
Gespeichert
« Antwort #29 am: 22. August 2009, 16:21 »
zum verstehen:

Ich hatte vorhin vergessen  die  Funktionen von rizor in meinen Code zu übernehmen, auch gefällt mir rizors Code nicht so ganz...sry rizor.

hier der Komplette Code:

Interrupts.c:
extern void intr1();
extern void intr2();
extern void intr3();
...         //schreib hier einfach die intrs aus dem asm code rein(extern nicht vergessen sonst werden die neu definiert!!!)
extern void intr47();


//Die Irqs müssen neu gemappt werden
void remap_irq(void)
{
    outb(0x20, 0x11);
    outb(0xA0, 0x11);
    outb(0x21, 0x20);
    outb(0xA1, 0x28);
    outb(0x21, 0x04);
    outb(0xA1, 0x02);
    outb(0x21, 0x01);
    outb(0xA1, 0x01);
    outb(0x21, 0x0);
    outb(0xA1, 0x0);
}


//muss irgendwo im Kernel aufgerufen werden, bevor Interrupts benutzt werden können
void install_interrupts()
{
       remap_irq();

       idt_set_gate(1, (unsigned)intr1, 0x08, 0x8E);
       idt_set_gate(2, (unsigned)intr2, 0x08, 0x8E);
       ...     //das machst du auch selber :-D
       idt_set_gate(47, (unsigned)intr47,0x08, 0x8E);
}



struct registers
{
    unsigned int gs, fs, es, ds;      //segmentregister
    unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
    unsigned int int_num, err_code;  //müssen von den Asm funktionen draufgepusht werden
    unsigned int eip, cs, eflags, useresp, ss;    //ACHTE AUF DIE REIHENFOLGE!!!
};

void *interrupt_routines;

void install_handler(int interrupt, (*handler) (struct registers))
{
        interrupt_routines[interrupt] = handler;
}

void interrupt_handler(struct registers *reg)
{
   void (*handler)();

   handler = interrupt_routines[reg->int_num];
   if (handler)
   {
       handler(reg);
   }

   //EOI an Master und wenn nötig an Slave pic senden
   if(reg->int_num >= 40)
   {
           outb(0xA0, 0x20);
   }
    outb(0x20, 0x20);
}

Interrupts.asm:
%macro intr 1
global intr%1
intr%1:
    push byte 0
    push byte %1
    jmp intr_handler
%endmacro

%macro intr_err 1
global intr%1
intr%1:
    push byte %1
    jmp intr_handler
%endmacro


//the exceptions
intr 0
intr 1
intr 2
intr 3
intr 4
intr 5
intr 6
intr 7
intr_err 8
intr 9
intr_err 10
intr_err 11
intr_err 12
intr_err 13
intr_err 14
intr 15
intr 16
intr_err 17
intr 18
intr 19
intr 20
intr 21
intr 22
intr 23
intr 24
intr 25
intr 26
intr 27
intr 28
intr 29
intr 30
intr 31

//the IRQs
intr 32
intr 33
intr 34
intr 35
intr 36
intr 37
intr 38
intr 39
intr 40
intr 41
intr 42
intr 43
intr 44
intr 45
intr 46
intr 47

global

intr_handler:
    pusha
    push ds
    push es
    push fs
    push gs
    mov ax, 0x10   ; Daten Descriptor
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov eax, esp
    push eax

    call interrupt_handler ;hier wird der c handler aufgerufen

    ; alle Werte der CPU wiederherstellen
    pop eax
    pop gs
    pop fs
    pop es
    pop ds
    popa
    add esp, 8     ; Gibt den Error Code an
    iret           ; "returned" die register: CS, EIP, EFLAGS, SS, und ESP


ACHTUNG!
Interrupts.c mit gcc und Interrupts.asm mit nasm Compilieren und assemblieren.

Das ist lediglich eine minimal lösung. Ich überlasse es dir noch ein wenig damit rumzuspielen und es noch einfacher und besser zu machen.
(Ich garantiere nicht für die richtigkeit meines Codes)


Gruss
DaCodaaa

Edit:
ich glaube rizor ist davon ausgegangen, dass du inline assembler meinst, da du nicht in Intel syntax(nasm) sondern in AT&T(gcc inline) gepostet hast.
« Letzte Änderung: 22. August 2009, 16:27 von DaCodaaa »

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #30 am: 22. August 2009, 16:45 »
Erstmal vielen vielen Dank für den Code :-D.

Hab den Code erweitert/verbessert, komme aber bei manchen Sachen nicht weiter:

Interrupts.asm:66: warning: macro `global' exists, but not taking 0 parameters
Interrupts.asm:66: warning: label alone on a line without a colon might be in er
ror
Interrupts.asm:82: error: symbol `interrupt_handler' undefined
C:\Users\Pk3\Desktop\C_Kernel
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:92: error: syntax error before '(' token
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:92: error: syntax error before ')' token
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:99: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:99: error: void value not ignored as it o
ught to be
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x18):kernel.c: undefined reference
 to `intr_dispatcher'

Ich hab "handler" so definiert:
unsigned int *handler
92 void install_handler(int interrupt, (*handler) (struct registers)) {
93 interrupt_routines[interrupt] = handler;
94 }
95
96 void interrupt_handler(struct registers *reg) {
97 void (*handler)();
98
99 handler = Interrupt_routines[reg->int_num];
100 if (handler) {
102 handler(reg);
103 }
104
105
106 //EOI an Master und wenn nötig an Slave pic senden
107 if(reg->int_num >= 40) {
108 outb(0xA0, 0x20);
109 }
110 outb(0x20, 0x20);
111 }

« Letzte Änderung: 22. August 2009, 16:47 von Pk3 »

DaCodaaa

  • Gast
Gespeichert
« Antwort #31 am: 22. August 2009, 17:31 »
Zitat
Erstmal vielen vielen Dank für den Code grin.
:wink:

Zitat
Interrupts.asm:66: warning: macro `global' exists, but not taking 0 parameters

hab ich in der eile vergessen : schreib in Zeile 66 (geile Zeolennummer fürn Fehler :wink:) extern interrupt_handler oder wenn du linux benutzt extern _interrupt_handler da hin.

Zitat
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:92: error: syntax error before '(' token
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:92: error: syntax error before ')' token

Schreib einfach ein void vor (*handler) dann gehts.

Schreib in der Funktion interrupt_handler bei der definition des Funktionspointers ein stuct registers *regs in die Klammern.

Zitat
unsigned int *handler
Wo hast du das hingeschrieben??

Sry das waren alles Flüchtigkeitsfehler :oops:.

Wenns immernoch nicht funktioniert poste nochmal die Fehlermeldung.
« Letzte Änderung: 22. August 2009, 17:32 von DaCodaaa »

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 22. August 2009, 17:33 »
Ich vermute mal, dass das an deinem Funktionskopf liegt.

@DaCodaaa:
Was hast du gegen meinen Code? ;)

Edit:
Ach Fehler schon erläutert...
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #33 am: 22. August 2009, 17:39 »
Interrupts.asm:82: error: binary output format does not support external referen
ces
C:\Users\Pk3\Desktop\C_Kernel
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: syntax error before "registers
"
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `install_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:91: error: `interrupt_routines' undeclare
d (first use in this function)
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:91: error: (Each undeclared identifier is
 reported only once
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:91: error: for each function it appears i
n.)
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:97: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:97: error: void value not ignored as it o
ught to be
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x18):kernel.c: undefined reference
 to `intr_dispatcher'

unsigned int handler (ohne Stern) habe ich ganz am Anfang definiert (also global)

Kernel.c
90 void install_handler(int interrupt, void (*handler) (stuct registers *regs)) {
91 interrupt_routines[interrupt] = handler;
92 }
93
94 void interrupt_handler(struct registers *reg) {
95 void (*handler)();
96
97 handler = Interrupt_routines[reg->int_num];
98 if (handler) {
99 handler(reg);
100 }
101
102 if(reg->int_num >= 40) {
103 outb(0xA0, 0x20);
104 }
105 outb(0x20, 0x20);
106 }

Interrupts.asm
82  call interrupt_handler
« Letzte Änderung: 22. August 2009, 17:43 von Pk3 »

DaCodaaa

  • Gast
Gespeichert
« Antwort #34 am: 22. August 2009, 17:48 »
Du sollst ja auch nasm nicht dazu bringen ein binary auszugeben sondern ein Objekt, damit der linker danach den c und den asm code zusammenlinken kann.

nasm -f elf -o Interrupts_asm.o Interrupts.asm

gcc -O3 -ffreestanding -c -o Interrupts_c.o

ld -T link.ld -O 1




Warum hast du denn handler definiert?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 22. August 2009, 17:49 »
Versuch einfch mal, die Fehlermeldungen zu lesen und zu korrigieren, was der Compiler bemängelt... Ein Beispiel mach ich dir:
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: syntax error before "registers"Schauen wir mal: Was steht da vor dem register? Hm, ein "stuct". Was könnte daran wohl falsch sein? Da fehlt ein r.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #36 am: 22. August 2009, 18:03 »
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `install_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: invalid use of void expression

C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: error: void value not ignored as it o
ught to be
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x18):kernel.c: undefined reference
 to `intr_dispatcher'

Vorhin musste ich "handler" definieren, jetzt gehts auch ohne,
also jetzt hab ichs weggelassen.

89 void install_handler(int interrupt, void (*handler) (struct registers *regs)) {
90 Interrupt_routines[interrupt] = handler;
91 }
92
93 void interrupt_handler(struct registers *reg) {
94 void (*handler)();
95
96 handler = Interrupt_routines[reg->int_num];
97 if (handler) {
98 handler(reg);
99 }
100
101 if(reg->int_num >= 40) {
102 outb(0xA0, 0x20);
103 }
104 outb(0x20, 0x20);
105 }

@taljeth Ja mach ich ja, nur das hab ich übersehen, thx^^
« Letzte Änderung: 22. August 2009, 18:05 von Pk3 »

DaCodaaa

  • Gast
Gespeichert
« Antwort #37 am: 22. August 2009, 18:13 »
handler hättest du nie definieren dürfen, da der Funktionspointer so heisst; also: 2 mal Definiert, also: gcc steikt, also: kein Programm.

Zitat
c:90: warning: dereferencing `void *' point

wie wärs wenn du interrupt_routines berall klein schreibst so wie ich es definiert habe???


Zitat
undefined reference
to `intr_dispatcher'

da sagt dir dein linker soviel wie: hey du hast intr_dispatcher nicht geschrieben!!!(klar ich hab sie ja auch interrupt_handler getauft. :wink:

Pk3

  • Beiträge: 52
    • Profil anzeigen
    • Xyross
Gespeichert
« Antwort #38 am: 22. August 2009, 18:26 »
"intr_dispatcher" war nirgends zu finden, hab einfach die kernel.o gelöscht und weg war der Fehler.

Hier mal die ganze Kernel.c:

#include <stdint.h>
#include "hInit.h"

typedef struct {
uint16_t  offset_low;
uint16_t selector;
uint8_t zero;
uint8_t attribute;
uint16_t offset_high;
}id_table;

id_table IDT[256];

int begin() {
//idt_set_gate(0x16, (unsigned), 0x08, IDT_STD_GATE);

v_clear();

v_print("$3-=Xype=-", 0);
v_print("$2Willkommen!", 2);
i_getKey();
v_print(str_replace("Eingabe", "ga", ""), 3);

while(1);
}

extern void intr1();
extern void intr2();
extern void intr3();
extern void intr4();
extern void intr5();
extern void intr6();
extern void intr7();
extern void intr8();
extern void intr9();
extern void intr10();
extern void intr11();
extern void intr12();
extern void intr13();
extern void intr14();
extern void intr15();
extern void intr16();
extern void intr47();

void remap_irq(void) {
outb(0x20, 0x11);
outb(0xA0, 0x11);
outb(0x21, 0x20);
outb(0xA1, 0x28);
outb(0x21, 0x04);
outb(0xA1, 0x02);
outb(0x21, 0x01);
outb(0xA1, 0x01);
outb(0x21, 0x0);
outb(0xA1, 0x0);
}

void install_interrupts() {
remap_irq();

idt_set_gate(1, (unsigned)intr1, 0x08, 0x8E);
idt_set_gate(2, (unsigned)intr2, 0x08, 0x8E);
idt_set_gate(3, (unsigned)intr3, 0x08, 0x8E);
idt_set_gate(4, (unsigned)intr4, 0x08, 0x8E);
idt_set_gate(5, (unsigned)intr5, 0x08, 0x8E);
idt_set_gate(6, (unsigned)intr6, 0x08, 0x8E);
idt_set_gate(7, (unsigned)intr7, 0x08, 0x8E);
idt_set_gate(8, (unsigned)intr8, 0x08, 0x8E);
idt_set_gate(9, (unsigned)intr9, 0x08, 0x8E);
idt_set_gate(10, (unsigned)intr10, 0x08, 0x8E);
idt_set_gate(11, (unsigned)intr11, 0x08, 0x8E);
idt_set_gate(12, (unsigned)intr12, 0x08, 0x8E);
idt_set_gate(13, (unsigned)intr13, 0x08, 0x8E);
idt_set_gate(14, (unsigned)intr14, 0x08, 0x8E);
idt_set_gate(15, (unsigned)intr15, 0x08, 0x8E);
idt_set_gate(16, (unsigned)intr16, 0x08, 0x8E);
idt_set_gate(47, (unsigned)intr47,0x08, 0x8E);
}

struct registers {
unsigned int gs, fs, es, ds; // segmentregister
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned int int_num, err_code; // müssen von den Asm funktionen draufgepusht werden
unsigned int eip, cs, eflags, useresp, ss; //ACHTE AUF DIE REIHENFOLGE!!!
};

void *interrupt_routines;

void install_handler(int interrupt, void (*handler) (struct registers *regs)) {
interrupt_routines[interrupt] = handler;
}

void interrupt_handler(struct registers *reg) {
void (*handler)();

handler = interrupt_routines[reg->int_num];
if (handler) {
handler(reg);
}

if(reg->int_num >= 40) {
outb(0xA0, 0x20);
}
outb(0x20, 0x20);
}

void idt_set_gate(uint16_t num, uint32_t base, uint16_t sel, uint8_t attr) {
IDT[num].offset_low = (base & 0xFFFF);
IDT[num].offset_high = (base >> 16) & 0xFFFF;
IDT[num].selector = sel;
IDT[num].zero = 0;
IDT[num].attribute = attr;

struct {
unsigned int limit;
unsigned int base;
}  __attribute__((packed)) idt_ptr = {
.limit  = 256*8 - 1,
.base  = (unsigned int)IDT,

};

asm("lidt %0" : : "m" (idt_ptr));
}

#include "hString.h"
#include "hVideo.h"
#include "hInput.h"

Übrigen Fehler:
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `install_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: invalid use of void expression

C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: error: void value not ignored as it o
ught to be

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 22. August 2009, 18:37 »
Ich seh zwar nicht, wo da ein void* dereferenziert wird, aber interrupt_routines könnte man als Array von Funktionspointern deklarieren. Ich nehme jedenfalls an, das war gemeint.

void (*interrupt_routines)()[256];
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen