(Kann der thread bitte noch einwenig aufbleiben für den fall das nochimmer was nicht stimmt?)Threads werden hier üblicherweise nicht geschlossen.
09. November 2026, 18:31
(Kann der thread bitte noch einwenig aufbleiben für den fall das nochimmer was nicht stimmt?)Threads werden hier üblicherweise nicht geschlossen.
Außerdem, welche Interrupt nummer brauche ich für die maus?IRQ 12
Wie kann ich den buffer leeren?Den Puffer im Keyboard-Controller? Durch Auslesen und alles gelesene, was du nicht kennst, ignorieren.
Achja und wie kann ich Daten vom ersten ring in den 3 übergeben?Systemaufrufe.
Ok, also benutze ich den inline assembler und lege dann z.B auf eax den keycode?Nicht ganz. Ich denke mal Dein Syscall ist ein einfacher Interrupt. Dein Interrupt-Handler sichert bei einem Interrupt alle Register auf den Stack. Die dabei entstandene Struktur kannst Du dann später auslesen und verändern. Beim zurückkehren werden alle Register vom Stack wiederhergestellt. Wenn Du nun die Struktur so änderst, dass Du in eax den Rückgabewert hast, wird dieser eben auch wieder hergestellt. Wenn Dein Programm dann nach dem Interrupt weiterläuft kannst Du mit Inline Assembler das Register eax in eine Variable Deiner Wahl befördern und damit ganz normal weiterarbeiten.
struct cpu_state* syscall(struct cpu_state* cpu)
{
switch (cpu->eax) {
case 0: /* putc */
kprintf("%c", cpu->ebx);
break;
case 879: /* NEU */
cpu->eax = ein wert aus dem puffer oder ein wert der anzeigt, dass der puffer leer ist;
break;
}
return cpu;
}int key;
asm("int $0x30" : "=a" (key) : "a" (879));
// nun ist in key entweder die taste oder ein wert der anzeigt, dass keine taste gedrückt wurde.
Also brauche ich nur ein = für die rückgabe.