Autor Thema: Tastendruck in C  (Gelesen 4481 mal)

Cool-Andy

  • Gast
Gespeichert
« am: 08. October 2009, 18:24 »
Hi,

ich bin ganz neu hier (Forum + OS proggen), als bitte nicht lachen, wenn ich jetzt ein totalen Anfängerfehler gemacht hab.
Ich bin grad dabei, zu versuchen ein OS in C zu entwerfen (als Bootloader GRUB). Dazu hab ich mir ein Tutorial angeschaut und abgeschrieben. Wills dann umschreiben und erweitern, bis es mir halt gefällt.  :-D
Mein Problem:
Ich versuch jetzt es hinzukriegen, dass mein Kernel auf ein Tastendruck wartet (egal welche Taste) und dann weiterarbeitet.
Habs mit Inline-Assembler versucht (in elf-gcc für Windows) aber kriegs irgendwie net hin (PC stürtzt an entscheidender Stelle ab):
#include "video.h"
/**
 * Hauptfunktion, die aus der header.S angesprungen wird
 */
void kernel()
{
    // Bildschirm leeren und eine Meldung anzeigen
    cls();
    cls();
    printf("Hello World\n");
    asm("mov $0, %ah");   /* !!!!! */
    asm("int $0x16");         /* !!!!! */
    printf("to my Kernel");
    // Endlosschleife
    while (1);
}
PS.: Arbeite im Real Modus.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #1 am: 08. October 2009, 18:46 »
Du arbeitest im Real Mode? Hast du den manuell nach dem Laden durch GRUB gesetzt? Denn normalerweise aktiviert GRUB ja den Protected Mode, bevor es deinen Kernel aufruft. Außerdem bezweifle ich, dass GCC (auf einfache Art und Weise) Code für den Real Mode erzeugen kann.
Im Großen und Ganzen würde ich jetzt also einfach anzweifeln, dass du dich wirklich im Real Mode befindest. Wenn du (unwissentlich) im Protected Mode arbeitest, funktioniert natürlich der BIOS-Interrupt nicht mehr und würde dazu führen, dass dein Computer abstürzt - weil dein Betriebssystem bestimmt noch nicht auf Interrupts vorbereitet ist.

Cool-Andy

  • Gast
Gespeichert
« Antwort #2 am: 08. October 2009, 19:17 »
Oh, oh! --> einer meiner total unnötigen Fehler!
Danke für den Hinweis!
Du hast Recht ich arbeite im Protect Mode!!!
Ok, kann mir trotzdem jemand erklären wie ich so`n Tastendruck in C empfangen kann?


Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. October 2009, 19:40 »
Indem du direkt aus dem Keyboard Controller ausliest.

// diese funktion hast du vielleicht schon. wenn nicht dann hier der vollständigkeit halber
static inline unsigned char inb(unsigned short port)
{
unsigned char val;
__asm__ __volatile__("inb %1, %0" : "=a" (val) : "Nd" (port));
return val;
}


int wait_key()
{
int key;

// solange warten wie der input buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// scancode auslesen (dadurch wird diese taste auch aus dem input buffer entfernt)
key = inb(0x60);

return key;
}

Edit: Diese Methode wird übrigens "polling" oder "busy waiting" genannt. Sobald du Interrupthandler implementiert hast, solltest du diese Funktion vermutlich ersetzen, um flexibler zu sein und Schwierigkeiten zu umgehen.
« Letzte Änderung: 08. October 2009, 19:46 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cool-Andy

  • Gast
Gespeichert
« Antwort #4 am: 08. October 2009, 20:12 »
 :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D
JUHU! Es klappt!
Vielen Dank!

 

Einloggen