2015-01-11 14 views
12

Ho questo codice:Cosa succede esattamente quando premo il pulsante Invio in termini di interrupt system_read, assembly?

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 

che funziona bene.

Quando avvio il processo, il cursore inizierà a lampeggiare nel terminale e io sono libero di immettere caratteri. A questo punto sono libero di inserire tutti i caratteri che voglio, tranne quando premo "ENTER" 1 byte verrà letto e verrà stampato nel terminale.

La mia domanda è, che cosa sta accadendo internamente come io entro personaggi e, come mi ha colpito Immettere .. Così mi ha colpito 'a' nella mia tastiera, e di ' 'c', dove è questo i dati memorizzati in questo momento? Sono già nello spazio di memoria indirizzato da 'buff' nel mio codice? Perché Linux legge quando colpisco Immettere?

+0

@glglgl Grazie per la modifica, ma perché il commento 'oh per favore'? –

+0

Becaus a volte sono un po 'troppo duro nei miei commenti. Mi scuso per quello. – glglgl

+0

Il livello tty esegue il buffering dell'input quando si è in modalità "canonica". Può essere disabilitato tramite chiamate termios. Confronta 'cat' vs' stty -icanon; cat; stty + icanon' – ninjalj

risposta

5

C'è una lunga strada da inserendo alla domanda:

  • Hardware
  • strato driver
  • Console strato
  • funzioni di lettura

Da qualche parte accade il trattamento delle linee, penso che sia al livello console. Qui puoi inserire i dati che vengono elaborati nelle linee.

Se un'applicazione arriva e legge, ottiene quanti caratteri richiede, i rimanenti vengono mantenuti per la successiva chiamata di lettura.

Se non ce ne sono ancora, attenderà fino al completamento della riga successiva o se l'utente preme ^D, che significa terminare la chiamata corrente read(). Se non sono stati immessi dati prima, read() restituisce 0, che indica EOF. In tutti gli altri casi, read() restituisce il numero di byte letti finora.

+0

Se nessun dato è stato inserito prima, read() restituisce 0: non sono sicuro se questo è corretto. Penso che aspetti che alcuni dati vengano inseriti? –

+0

@KorayTugay Come ho scritto: Premendo Strg-D, questa attesa viene interrotta. – glglgl

1

Se è stato richiesto 1 byte, la funzione di immissione non memorizzerà mai byte aggiuntivi nella memoria buff. Linux memorizza solo il un a appassionato ma certamente non il c

+0

Ma posso ancora vedere il carattere 'c' nel mio schermo quando premo il pulsante, quindi deve essere memorizzato da qualche parte? –

+0

Certo, è memorizzato nella ram del video e dipende dall'implementazione di Linux anche nel suo buffer interno ma non lo farà al tuo * buff * perché ciò sfiderà il significato della funzionalità di input che hai scelto (chiedendo 1) –

+0

Ok grazie. E che dire di "Invio". Perché posso inserire tutti i caratteri che voglio finché non premo Invio? Cosa succede con Enter? –

1

Il driver del terminale linux sta leggendo i caratteri e li memorizza nel proprio spazio di memoria. Poiché il tuo terminale è in modalità 'linea', questo buffering continua fino a quando il tasto ENTER termina una linea. A questo punto i dati possono essere trasferiti nel buffer fornito. Hai chiesto solo 1 carattere, quindi è quello che ottieni e i caratteri rimanenti si trovano nella memoria del driver del terminale per la tua prossima richiesta di lettura.

2

@glglgl ha una buona risposta, ma ecco una risposta più diretta: gli altri caratteri sono seduti nel buffer di lettura in attesa di elaborazione.

Poiché sembra che tu stia parlando di Linux qui, il kernel ha un buffer specifico per questo che viene creato quando un dispositivo di carattere è registrato. Se vuoi davvero approfondire questo argomento, ti suggerisco caldamente lo this article. Quando ci arrivi, cerca vfs_read e inizia a leggere. È una buona scrittura!

Problemi correlati