2010-03-16 28 views
12

mi chiedevo se ci fosse tutte le risorse disponibili online che spiega ciò che accade con qualcosa, come printf di C, che spiega cosa sta succedendo nel livello molto basso (BIOS chiamate/kernel)Comprendere l'hardware di printf

risposta

23

Linux:

printf() ---> printf() nella libreria C ---> write() nella libreria C ---> write () chiamata di sistema nel kernel.

Per comprendere l'interfaccia tra lo spazio utente e lo spazio del kernel, è necessario avere una certa conoscenza di come funziona system calls.

Per capire cosa sta succedendo ai livelli più bassi, è necessario analizzare il codice sorgente nel kernel.

Il Linux system call quick reference (collegamento in pdf) può essere utile in quanto identifica il punto in cui il codice sorgente del kernel potrebbe iniziare a cercare.

+2

+1, Ottima risposta. –

+1

Dopo aver inciampato su [risposta di Hostile Fork] (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508#2444508) a [C/C++ definizioni di funzioni senza assemblaggio] (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508), penso che sia meglio del mio. – jschmier

0

Un buon esercizio da fare anche se sarà un po 'difficile sarebbe rintracciare la chiamata attraverso il kernel di Linux. È possibile DL è a http://www.kernel.org/

1

Questo è molto specifico della piattaforma. Dal punto di vista hardware, l'implementazione di back-end di printf() potrebbe essere diretto a una porta seriale, un display LCD non di serie, ecc sei veramente due domande:

  1. Come funziona printf() interpretare gli argomenti e formattare la stringa per generare un output corretto?

  2. Come viene generata l'uscita da printf() al dispositivo di destinazione?

È necessario ricordare che un SO, un kernel e un BIOS non sono necessari per il funzionamento di un'applicazione. Le app incorporate tipicamente hanno printf() e altre routine IO scrivono su un buffer di ring dei caratteri. Un interrupt può quindi interrogare quel buffer e manipolare l'hardware di output (LCD, porta seriale, laser show, ecc.) Per inviare l'output bufferizzato alla destinazione corretta.

1

Per definizione, le chiamate del kernel e del kernel sono specifiche della piattaforma. A quale piattaforma sei interessato? Sono già stati pubblicati numerosi collegamenti a informazioni relative a Linux.

Si noti inoltre che printf potrebbe non portare a nessuna chiamata del BIOS o del kernel, in quanto la piattaforma potrebbe non disporre di un kernel o di un BIOS presente (i sistemi incorporati ne sono un buon esempio).

3

Qualcosa come printf o printf in particolare? Questo è un po 'vago.

printf invia allo stream stdout FILE *; ciò a cui è associato dipende dal sistema e può inoltre essere reindirizzato a qualsiasi altro dispositivo di streaming per il quale il sistema operativo fornisce un driver di dispositivo adatto. Lavoro in sistemi embedded e la maggior parte delle volte lo stdout è diretto per impostazione predefinita a un UART per I/O seriale, che spesso è l'unico dispositivo I/O di streaming supportato e non può essere reindirizzato. In un sistema operativo GUI per applicazioni in modalità console, l'output viene "disegnato" graficamente nel carattere del terminale definito dal sistema in una finestra, in Windows ad esempio questo può coinvolgere chiamate GDI o DirectDraw, che a loro volta accedono al driver del dispositivo dell'hardware video.Su un sistema operativo desktop moderno, l'output dei caratteri della console non coinvolge il BIOS a parte altro che il bootstrap iniziale.

Quindi, in breve, di solito c'è un'enorme quantità di software tra una chiamata a printf() e l'hardware su cui viene emessa.

0

printf() accetta più argomenti (funzione argomenti lunghezza variabile). L'utente fornisce una stringa e introduce argomenti.

La funzione printf() crea un buffer interno per la costruzione della stringa di output. Ora, printf() scorre attraverso ogni carattere della stringa utente e copia il carattere nella stringa di output. Printf() si ferma solo su "%".

"%" significa che c'è un argomento da convertire (gli argomenti hanno la forma di char, int, long, float, double o string). Lo converte in stringa e si aggiunge al buffer di output. Se l'argomento è una stringa, viene eseguita una copia stringa.

Infine, printf() può raggiungere alla fine della puntura dell'utente e copia l'intero buffer nel file stdout.