Code: [Auswählen]
#define intr_16 0x16
idt_set_gate(0x16, (unsigned)intr_16, 0x08, IDT_STD_GATE);Falsch oder?^^
09. November 2026, 18:29
#define intr_16 0x16
idt_set_gate(0x16, (unsigned)intr_16, 0x08, IDT_STD_GATE);.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_22asm(".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 ...
.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
Gespeichert 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);
}
}
.
.
Gespeichert
Gespeichert 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);
}
%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
.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'unsigned int *handler92 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 }
Gespeichert Erstmal vielen vielen Dank für den Code grin.

Code: [Auswählen]Interrupts.asm:66: warning: macro `global' exists, but not taking 0 parameters
) extern interrupt_handler oder wenn du linux benutzt extern _interrupt_handler da hin.Code: [Auswählen]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
Wo hast du das hingeschrieben??Code: [Auswählen]unsigned int *handler
.
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'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 }82 call interrupt_handler
Gespeichert 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.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'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 }
Gespeichert Code: [Auswählen]c:90: warning: dereferencing `void *' point
Code: [Auswählen]undefined reference
to `intr_dispatcher'

#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"
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 bevoid (*interrupt_routines)()[256];