Visualizzazione dei risultati da 1 a 10 su 17

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    La scelta fraseologica di codesto testo (probabilmente tradotto) lascia davvero a desiderare. Ciò che avviene, molto grossolanamente, si può descrivere nel modo seguente: il flusso di tasti che costituisce lo stdin viene "travasato" nel buffer di cui sopra, e da lì - alla pressione di ENTER - viene poi reso disponibile a funzioni come getchar().

    In realtà qui dovremmo anche sviscerare il concetto nativo di unix, e quindi del C originale, secondo cui "everything is a file", ma ritengo realmente inutile complicare la trattazione in questo momento.
    in poche paroler il contenuto del buffer non viene spostato nello stdin ma il contrario?

  2. #2
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    in poche paroler il contenuto del buffer non viene spostato nello stdin ma il contrario?
    Il banale concetto sotteso è che le funzioni come getchar() prelevano il loro input dal buffer e lo mettono a disposizione del programma. Tutto qui...
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Il banale concetto sotteso è che le funzioni come getchar() prelevano il loro input dal buffer e lo mettono a disposizione del programma. Tutto qui...
    mmmm ok pero cosi comunque non mi resta chiara la frase del libro . inoltre in una slide fa vedere proprio che dal buffer i dati vengono inseriti nel flusso collegato allo stdin


    Qui le slide di cui ti parlavo
    Ultima modifica di linux_r; 10-05-2014 a 00:05

  4. #4
    Codesto testo (Deitel?) finisce per confonderti solo le idee, specialmente a causa della traduzione piuttosto approssimativa.

    Il buffer al quale si riferiscono le slide che hai referenziato è il buffer di tastiera gestito dal BIOS (nei PC standard trattasi di una coda circolare gestita tramite due puntatori nell'area dati del BIOS) che sta a monte dello standard input, in quella lunga catena della quale si accennava sopra.

    Viceversa, il buffer della getchar() è un buffer interno alla libreria di runtime: come ogni buffer di tale categoria, è qualcosa che si frappone tra il file di input (in questo caso stdin, che è comunque un "file" per il sistema operativo e per il linguaggio C) e il programma stesso. In definitiva, si parla di due distinti buffer, con meccanismi di gestione diversi, a carico di entità ben distinte.

    Ribadisco, per maggior chiarezza: quando si parla di buffered input per le funzioni di libreria come getchar(), ci si riferisce al buffer interno alla libreria e in particolare alla necessità di terminare ciascun input con ENTER.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Codesto testo (Deitel?) finisce per confonderti solo le idee, specialmente a causa della traduzione piuttosto approssimativa.

    Il buffer al quale si riferiscono le slide che hai referenziato è il buffer di tastiera gestito dal BIOS (nei PC standard trattasi di una coda circolare gestita tramite due puntatori nell'area dati del BIOS) che sta a monte dello standard input, in quella lunga catena della quale si accennava sopra.

    Viceversa, il buffer della getchar() è un buffer interno alla libreria di runtime: come ogni buffer di tale categoria, è qualcosa che si frappone tra il file di input (in questo caso stdin, che è comunque un "file" per il sistema operativo e per il linguaggio C) e il programma stesso. In definitiva, si parla di due distinti buffer, con meccanismi di gestione diversi, a carico di entità ben distinte.

    Ribadisco, per maggior chiarezza: quando si parla di buffered input per le funzioni di libreria come getchar(), ci si riferisce al buffer interno alla libreria e in particolare alla necessità di terminare ciascun input con ENTER.
    ok almeno questo mi é chiaro. ma in breve quello che succede e che il progrAmma si sospende quando invoco getchar, i tastinpremuti vengono caricati dal buffer della tastiera(quello doppia coda circolar) allo stdin e dallo stdin la getchar li legge e li mette nel proprio buffer e li fornisce al programma??
    potresti spoegarmi a grosse linee il procedimento ? grazie

  6. #6
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    ok almeno questo mi é chiaro. ma in breve quello che succede e che il progrAmma si sospende quando invoco getchar, i tastinpremuti vengono caricati dal buffer della tastiera(quello doppia coda circolar) allo stdin e dallo stdin la getchar li legge e li mette nel proprio buffer e li fornisce al programma??
    potresti spoegarmi a grosse linee il procedimento ? grazie
    Dopo aver chiarito i dubbi fondamentali, possiamo provare a schematizzare il percorso con un esempio di base, relativo all'originale PC AT IBM. Al giorno d'oggi alcuni dettagli sono profondamente mutati, ma i concetti di retrocompatibilità rimangono del tutto invariati.
    Tutti i valori esemplificativi sono esadecimali.

    L'operazione avviene sostanzialmente in due tempi.
    Premendo un tasto (ad esempio "P") sulla tastiera, il microcontroller ivi contenuto (in origine un Intel 8031) invia sulla connessione seriale il valore Kscan 4Dh. All'altro capo della connessione, nel design AT originale, c'era un controller dedicato 8042 che effettuava una prima "traduzione" del valore, mappando 4Dh su 19h. Tale controller genera quindi un interrupt hardware, che a sua volta invoca l'handler INT 9h del BIOS, il quale legge il valore 19h dal buffer (hardware) interno al controller 8042 e lo trasforma ulteriormente, in questo caso nel codice ASCII 70h ovvero "p" (se nessuno SHIFT è stato premuto e CAPS LOCK non è attivo). Tale valore viene, sempre a carico di INT 9h, inserito nel buffer a coda circolare a 16 entries nell'area dati del BIOS, accompagnato dal relativo scan code 19h. Qui termina la prima fase dell'operazione.

    In un secondo momento, il sistema operativo (o software applicativo con idonei diritti) usa tipicamente INT 16h, altra funzione BIOS, per determinare se vi sono tasti nel buffer di tastiera. Un'apposita sottofunzione verifica se il buffer è non-vuoto (i due puntatori di inizio e fine, in tale caso, non sono coincidenti) e preleva il più vecchio codice ivi inserito: nel nostro caso, il valore a 16 bit 1970h. Tale funzione inoltre aggiorna i puntatori, il che rende nuovamente disponibili le locazioni usate dal tasto appena "prelevato".
    Da qui in poi, il codice tasto sottoposto alle varie trasformazioni (bisognerebbe parlare ad esempio di nazionalizzazione ed ASCII esteso, eccetera) viene generalmente reso disponibile dal DOS su stdio, se non stiamo parlando di applicazioni verticali o altri casi particolari. E qui entra finalmente in gioco la funzione getchar() col suo bravo buffer.

    A rigore, occorrerebbe inoltre parlare del secondo scancode inviato dal controller di tastiera al momento del rilascio del tasto. Tale scancode è caratterizzato dal bit 7 alto, ma nella generalità dei casi viene scartato a livello del controller di tastiera (da molti anni integrato nel chipset) e/o di INT 9h BIOS.

    Questo, con numerose omissioni e qualche approssimazione, è in termini generali il percorso dei codici, dal controller di tastiera fino al flusso di input del terminale gestito a livello di SO.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Dopo aver chiarito i dubbi fondamentali, possiamo provare a schematizzare il percorso con un esempio di base, relativo all'originale PC AT IBM. Al giorno d'oggi alcuni dettagli sono profondamente mutati, ma i concetti di retrocompatibilità rimangono del tutto invariati.
    Tutti i valori esemplificativi sono esadecimali.

    L'operazione avviene sostanzialmente in due tempi.
    Premendo un tasto (ad esempio "P") sulla tastiera, il microcontroller ivi contenuto (in origine un Intel 8031) invia sulla connessione seriale il valore Kscan 4Dh. All'altro capo della connessione, nel design AT originale, c'era un controller dedicato 8042 che effettuava una prima "traduzione" del valore, mappando 4Dh su 19h. Tale controller genera quindi un interrupt hardware, che a sua volta invoca l'handler INT 9h del BIOS, il quale legge il valore 19h dal buffer (hardware) interno al controller 8042 e lo trasforma ulteriormente, in questo caso nel codice ASCII 70h ovvero "p" (se nessuno SHIFT è stato premuto e CAPS LOCK non è attivo). Tale valore viene, sempre a carico di INT 9h, inserito nel buffer a coda circolare a 16 entries nell'area dati del BIOS, accompagnato dal relativo scan code 19h. Qui termina la prima fase dell'operazione.

    In un secondo momento, il sistema operativo (o software applicativo con idonei diritti) usa tipicamente INT 16h, altra funzione BIOS, per determinare se vi sono tasti nel buffer di tastiera. Un'apposita sottofunzione verifica se il buffer è non-vuoto (i due puntatori di inizio e fine, in tale caso, non sono coincidenti) e preleva il più vecchio codice ivi inserito: nel nostro caso, il valore a 16 bit 1970h. Tale funzione inoltre aggiorna i puntatori, il che rende nuovamente disponibili le locazioni usate dal tasto appena "prelevato".
    Da qui in poi, il codice tasto sottoposto alle varie trasformazioni (bisognerebbe parlare ad esempio di nazionalizzazione ed ASCII esteso, eccetera) viene generalmente reso disponibile dal DOS su stdio, se non stiamo parlando di applicazioni verticali o altri casi particolari. E qui entra finalmente in gioco la funzione getchar() col suo bravo buffer.

    A rigore, occorrerebbe inoltre parlare del secondo scancode inviato dal controller di tastiera al momento del rilascio del tasto. Tale scancode è caratterizzato dal bit 7 alto, ma nella generalità dei casi viene scartato a livello del controller di tastiera (da molti anni integrato nel chipset) e/o di INT 9h BIOS.

    Questo, con numerose omissioni e qualche approssimazione, è in termini generali il percorso dei codici, dal controller di tastiera fino al flusso di input del terminale gestito a livello di SO.
    ti ringrazio per questi dettagli implementativi.. davvero grazie .. ma quindi sintetizzando a grosse linee lo schema é:
    premo i tastindella tastiera , e incorrispondenti valori vengono caricati nel buffer di quest ultima , dopo aver premuto il tasti enter vengono inseriti nel flusso stdin (quindi vengono resi disponibili per l' input) e dall ' input la getchar li carica nel buffer esatto?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.