2012-01-05 10 views
11

tutti sanno che il gestore di interrupt dovrebbe essere il più corto possibile. e l'aggiunta di funzioni come printk per il debug all'interno di un gestore di interruzioni è qualcosa che non dovrebbe essere fatto. In realtà, l'ho provato prima, quando stavo eseguendo il debug del kernel linux per un dispositivo di char char di interrupt che ho scritto, e distruggeva i tempi del driver.printk all'interno di un gestore di interrupt, è davvero così male?

La domanda che ho, è perché questo sta accadendo? printk la funzione è memorizzata nel buffer! significa, per quanto comprendo, che i dati siano inseriti in una coda e che vengano gestiti in seguito, molto probabilmente dopo che il gestore di interruzioni è finito.

Quindi perché non funziona?

+4

Considerate la possibilità che la vostra chiamata di stampa riempia semplicemente il buffer, forzandolo a svuotare. Cosa succederà quando faccio I/O nel tuo gestore di interrupt? –

+0

Sì, è davvero così male. Grazie e buona notte. –

+0

Questo * funziona *. 'printk' è progettato per essere chiamato dal contesto di interrupt o processo. Se non lo fosse, non sarebbe molto utile per il debug. Ovviamente non lo si chiama in contesto di interruzione in un driver di produzione, comunque. – EML

risposta

26

La funzione printk non si limita ad inserire in una coda/buffer - presupponendo che il livello di registrazione sia sufficientemente elevato, l'uscita da printk verrà emessa immediatamente nella console, come parte della chiamata a printk. Questo è particolarmente lento se la console è, per esempio, su una porta seriale. In ogni caso, lo printk introduce un overhead piuttosto sostanziale e può influire sui tempi.

Se si dispone di un punto critico in cui si desidera ottenere un output di debug, è possibile utilizzare la funzione trace_printk nei kernel moderni. Questo in realtà non fa altro che inserire input nel trace ringbuffer, e puoi leggerlo in seguito. Dai uno sguardo allo this article per i dettagli completi.

+0

In che modo debugfs è un'alternativa a trace_printk? È abbastanza buono o ha anche qualche avvertimento? – user31986

-3

Sì, è molto male poiché printf molto probabilmente non è rientranti. Ciò che può accadere è che il programma principale chiama printf, un interrupt arriva mentre printf è in esecuzione, quindi il gestore IRQ chiama nuovamente printf: possono accadere cose molto brutte (ad esempio deadlock, buffer interni corrotti, ecc.)

+7

La domanda riguarda 'printk', non' printf' che non esiste nemmeno nel kernel. E il 'printk' del kernel Linux è rientranti e può essere chiamato dal contesto di interrupt ecc. Quindi questa risposta è totalmente fuorviante. – Roland

+0

Uh, ho interpretato erroneamente il titolo, e il nome della funzione ha un carattere funky finale nel suo post:/ – zvrba

+0

Seriamente, cosa stai cercando di aggiungere alla discussione? Mi chiedo perché questa risposta non sia contrassegnata come negativa! – user31986