2015-01-11 8 views
12

Ich habe diesen Code:Was genau passiert, wenn ich die Enter-Taste in Bezug auf System_Read Interrupt, Assembly drücken?

section .bss 
    buff resb 1 
readfromkeyboard: 
    mov  eax,3  ;specify system read 
    mov  ebx,0  ;specify standard in -> keyboard 
    mov  ecx,buff ;where to store what is read 
    mov  edx,1  ;read 1 byte 
    int  0x80  ;tell linux to do everything above 

    mov  eax,4  ;sys_write 
    mov  ebx,1  ;Standard output 
    mov  ecx,buff ;what to print   
    mov  edx,1  ;how long to print 
    int  0x80  ;tell linux to do everything above 

der gut arbeitet.

Wenn ich den Prozess starte, beginnt der Cursor im Terminal zu blinken und ich kann Zeichen eingeben. An dieser Stelle kann ich beliebig viele Zeichen eingeben, außer wenn ich "ENTER" drücke, wird 1 Byte gelesen und im Terminal ausgedruckt.

Meine Frage ist, was geschieht intern als ich Zeichen eingeben und als ich Enter drücken .. Also schlug ich ‚a‘ in meiner Tastatur und sagen: ‚c‘, wo ist dies zur Zeit gespeicherten Daten? Befinden sie sich bereits im Speicherbereich, der in meinem Code mit "Buff" angesprochen wurde? Warum liest Linux, wenn ich auf trete Geben Sie ein?

+0

@glglgl Danke für die Bearbeitung, aber warum der Kommentar "oh bitte"? –

+0

Weil ich in meinen Kommentaren manchmal etwas zu hart bin. Ich entschuldige mich dafür. – glglgl

+0

Die tty-Schicht führt im "canonical" -Modus eine Pufferung durch. Es kann über Terminologierufe deaktiviert werden. Vergleichen Sie "Katze" vs "Stty-Cicanon; Katze; Stty + Icanon" – ninjalj

Antwort

5

Es ist ein langer Weg für die Anwendung von Eingabe:

  • Hardware
  • Treiberschicht
  • Console Schicht
  • Lesefunktionen

Irgendwo darin passiert die Behandlung von Linien, ich denke, es ist auf der Konsole Schicht. Dort können Sie Daten eingeben, die in Zeilen verarbeitet werden.

Wenn eine Anwendung kommt und liest, erhält sie so viele Zeichen, wie sie verlangt, die restlichen werden für den nächsten Leseaufruf gespeichert.

Wenn keine mehr vorhanden sind, wird gewartet, bis die nächste Zeile abgeschlossen ist - oder wenn der Benutzer ^D drückt, was bedeutet, dass der aktuelle read()-Aufruf beendet wird. Wenn zuvor keine Daten eingegeben wurden, gibt read() 0 zurück, was EOF bedeutet. In allen anderen Fällen gibt read() die Anzahl der bisher gelesenen Bytes zurück.

+0

Wenn vorher keine Daten eingegeben wurden, gibt read() 0 zurück: Ich bin mir nicht sicher, ob das korrekt ist. Ich denke, es wartet nur auf einige Daten eingegeben werden? –

+0

@KorayTugay Wie ich schrieb: Nach dem Drücken von Strg-D wird dieses Warten gestoppt. – glglgl

1

Wenn Sie nach 1 Byte gefragt haben, speichert die Eingabefunktion niemals zusätzliche Bytes im Speicher unter buff. Linux wird nur speichern die ein bei Buff aber sicherlich die nicht c

+0

Aber ich kann immer noch das Zeichen "C" in meinem Bildschirm sehen, wie ich den Knopf drücke, also muss es irgendwo gespeichert werden? –

+0

Sicher, es ist im Video-RAM gespeichert und abhängig von der Linux-Implementierung auch in seinem internen Puffer, aber es wird nicht zu Ihrem * Buff * machen, weil das die Bedeutung der von Ihnen gewählten Eingabefunktionalität (1) in Frage stellen würde –

+0

OK danke. Und wie wäre es mit "Enter"? Warum darf ich so viele Zeichen eingeben, wie ich möchte, bis ich Enter drücke? Was passiert mit Enter? –

1

Der Linux-Terminaltreiber liest die Zeichen und puffert sie in seinem eigenen Speicherplatz. Da sich Ihr Terminal im Modus 'Zeile' befindet, wird diese Pufferung fortgesetzt, bis die EINGABETASTE eine Zeile beendet. Zu diesem Zeitpunkt können die Daten in den von Ihnen bereitgestellten Puffer übertragen werden. Sie haben nur nach einem Zeichen gefragt, das bekommen Sie und die restlichen Zeichen befinden sich im Speicher des Terminaltreibers für Ihre nächste Leseanforderung.

2

@glglgl hat eine gute Antwort, aber hier ist eine direktere Antwort: Die anderen Zeichen sitzen im Lese-Eingangspuffer und warten auf die Verarbeitung.

Da Sie hier anscheinend über Linux sprechen, hat der Kernel einen speziellen Puffer dafür, der erstellt wird, wenn ein Zeichengeräte registriert ist. Wenn Sie wirklich tief in diese Sache eintauchen möchten, würde ich Ihnen dringend empfehlen, this article. Wenn Sie dort angekommen sind, suchen Sie nach vfs_read und beginnen Sie zu lesen. Es ist eine sehr gute Zusammenfassung!