Autor Thema: kbc hilfe  (Gelesen 20628 mal)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 29. July 2013, 18:31 »
(Kann der thread bitte noch einwenig aufbleiben für den fall das nochimmer was nicht stimmt?)
Threads werden hier üblicherweise nicht geschlossen.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 10. August 2013, 00:01 »
Hallo,
So jetzt ist alles umgesetzt, soweit klappt alles regel gemäß, nur hätte ich eine frage, ist ein keycode wirklich so lang?:
4294987295
Außerdem, welche Interrupt nummer brauche ich für die maus?
Viele Grüße,
Mineorbit
 

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 10. August 2013, 00:48 »
Also Keycodes sind ja eigentlich etwas, das du selbst definierst. Du hast das mit dem Array sc_to_kc in deinem vorangegangenen Post gemacht. Die Tastatur sendet Scancodes. 4294987295 ist kein gültiger Scancode, da Scancodes Bytes/Bytefolgen (also Werte zwischen 0 und 255) sind, aber da dein sc_to_kc-Array vom Typ uint8_t ist, ist das auch kein Keycode.

Normalerweise hätte ich gesagt, dass du ein Problem hast, dass irgendwie dieselben Symptome hat wie wenn ein (signed) char in signed int umgewandelt wird und anschließend als unsigned int ausgegeben wird. Aber da 4294987295 größer als 2^32 ist, würde ich sagen, dass du entweder die falsche Zahl genannt hast, dein Code sehr komische Sachen macht, oder die Ausgabe nicht korrekt funktioniert.


Außerdem, welche Interrupt nummer brauche ich für die maus?
IRQ 12
« Letzte Änderung: 10. August 2013, 00:52 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 10. August 2013, 17:47 »
Vielen Dank,
das Problem hab ich schon fast gelöst, mir wird nur von anfang an irgend etwas in den buffer geschrieben.
Wie kann ich den buffer leeren?
Achja und wie kann ich Daten vom ersten ring in den 3 übergeben?
Viele Grüße,
Mineorbit

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 10. August 2013, 18:04 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 10. August 2013, 22:01 »
 Vielen Dank aber wie mach ich das genau?
System aufrufe würde ich gerne nutzen, aber das funktioniert doch nur vom Programm im ring3 zum kernel in ring 1?
Viele Grüße,
Mineorbit

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 10. August 2013, 22:25 »
Klar das Programm löst Systemaufrufe aus, aber die können trotzdem Informationen an das Programm zurückgeben. Eine Möglichkeit wäre ein Systemaufruf, bei dem das Programm den Kernel fragt, ob eine Taste gedrückt wurde. Der Systemaufruf kann dann an das Programm entweder zurückgeben, dass keine Taste gedrückt wurde, oder aber den char bzw. Keycode der gedrückten Taste.

Wenn du das verlinkte Tutorial befolgst, kannst du dazu die Werte im struct cpu_state auswerten, und auch Rückgabewerte reinschreiben. Im Programm kannst du dann Inline Assembler verwenden, um das Ergebnis wieder auszulesen.

Übrigens ist der Kernel in Ring 0.
Dieser Text wird unter jedem Beitrag angezeigt.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 11. August 2013, 11:26 »
Ok, also benutze ich den inline assembler und lege dann z.B auf eax den keycode?
Wie lese ich das dann beim programm wieder aus?
Viele Grüße, Mineorbit

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 11. August 2013, 12:47 »
Zitat
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.
Gruß,
Streetrunner

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 11. August 2013, 15:18 »
Vielen Dank, wie wie löse ich es statdessen?
Über antworten freue ich mich sehr,
Mineorbit

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 11. August 2013, 15:44 »
streetrunner hat dir schon geschrieben wie es geht.

Abgesehen von der Möglichkeit Daten über die Register zu übergeben, hast du auf einem x86 aber auch keine "No-Write-Down"-Police. Es hindert dich also auch niemand daran, vom Kernel aus direkt in den Userspace zu schreiben, wenn du das willst.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 11. August 2013, 16:00 »
Also soll ich eax nur überschreiben und dann beim Programm irgendwie in eine variable packen?
Wenn ihr es mir erklären könntet wäre das sehr freundlich
Viele Grüße,
Mineorbit

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 11. August 2013, 16:31 »
streetrunner hat versucht dir folgendes zu erklären:

Wenn dein Code so aussieht wie hier, kannst du eine Funktion zum Lesen von der Tastatur einfügen. Ich hab der Funktion mal die Nummer 879 gegeben.

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;
}

Wenn ein Programm diesen Syscall aufrufen will, muss es sowas in der Art wie folgendes tun:
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.
Dieser Text wird unter jedem Beitrag angezeigt.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 11. August 2013, 22:19 »
Ah, vielen Dank Jidder,
Nur benutze ich schon statt 879 lieber 2, 1 ist schon für mein clear funktion belegt.
Also brauche ich nur ein = für die rückgabe.
Danke Sehr,
Mineorbit

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 11. August 2013, 22:25 »
Also brauche ich nur ein = für die rückgabe.

Das ist nicht alles. Lies dir mal den Artikel zu Inline-Assembler durch und informier dich darüber wie Parameter übergeben werden. Du kannst natürlich dich auch bei Google oder Wikibooks über Inline Assembler informieren. Wenn du da was falsch machst, wird dir der Compiler keinen Hinweis geben was los ist, deswegen solltest du das schon verstehen.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen