5

Attualmente sto imparando i driver di dispositivo Linux. E rimani bloccato su come funziona l'apertura di un file di dispositivo?come funziona open per i normali driver di file e di dispositivo

quello che ho ottenuto fino ad ora ... Si consideri il semplice codice che apre un file normale ..

#incldue<stdio.h> 
int main() { 
    FILE fp; 
    char buffer[20]; 
    fp = fopen(/home/yoggi/foo.txt, "r"); 
    fread(buffer, 5, 1, fp); 
} 

Nel programma precedente, The fopen(), la funzione c-library, è una funzione wrapper al sistema chiamare open(), che interno chiama sys_open() o file_open() nella funzione V2 layer. Poiché linux supporta un numero di file system, il file system virtuale trasferisce il controllo al gestore di file system effettivo per aprire quel file.

1) How does virtual file system(VFS) get to know on which file system the 
    underline file resides? 
2) How does it then calls the file_open or open function of that particular 
    filesystem to open file. 

In caso di driver di dispositivo accade cose simili. Supponiamo un semplice driver di dispositivo.

#include <linux/module.h> 
// othher includes... 
static dev_t first; // Global variable for the first device number 
static struct cdev c_dev; // Global variable for the character device structure 
static struct class *cl; // Global variable for the device class 
static int my_open(struct inode *i, struct file *f) 
{ 
    printk(KERN_INFO "Driver: open()\n"); 
    return 0; 
} 
static ssize_t my_read(struct file *f, char __user *buf, size_t len, loff_t *off) 
{ 
    printk(KERN_INFO "Driver: read()\n"); 
    return 0; 
} 
struct file_operations pugs_fops = 
{ 
.owner = THIS_MODULE, 
.open = my_open, 
.read = my_read, 
}; 

static int __init ofcd_init(void) /* Constructor */ 
{ 
    printk(KERN_INFO "Namaskar: ofcd registered"); 
    if (alloc_chrdev_region(&first, 0, 1, "Shweta") < 0) 
    { 
    return -1; 
    } 
    if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL) 
    { 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
if (device_create(cl, NULL, first, NULL, "mynull") == NULL) 
{ 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    cdev_init(&c_dev, &pugs_fops); 
if (cdev_add(&c_dev, first, 1) == -1) 
{ 
    device_destroy(cl, first); 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    return 0; 
} 

static void __exit ofcd_exit(void) /* Destructor */ 
{ 
cdev_del(&c_dev); 
device_destroy(cl, first); 
class_destroy(cl); 
unregister_chrdev_region(first, 1); 
printk(KERN_INFO "Alvida: ofcd unregistered"); 
} 
module_init(ofcd_init); 
module_exit(ofcd_exit); 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>"); 
MODULE_DESCRIPTION("Our First Character Driver"); 

In primo luogo, allociamo i numeri minori importanti per il dispositivo. Registrare la gamma di file del dispositivo e Collegare le operazioni del file del dispositivo alle funzioni del driver del dispositivo.

Alcuni del termine non ho avuto sono ..

1) What does actually cdev_add() do? in terms of registering a device to the 
    kernel. 
2) Registering a device to the kernel means? 
3) How does a open(/dev/mynull, O_RONLY); called on a device file actually calls 
    the open function of driver which is mapped while initializing the device 
    by calling routine cdev_init(&c_dev, &pugs_fops); ? 

risposta

7

1) Come file system virtuale (VFS) di conoscere su quale sistema di file si trova il file sottolineatura ?

è necessario specificare il file che si sta tentando di aprire per la sua piena percorso (o la directory di lavoro corrente ).
Quindi, attraversando questo percorso di directory all'indietro, la prima corrispondenza (il percorso più profondo) a un punto di montaggio fornirà il filesystem montato, il tipo di file system e il dispositivo.

Ogni file system fornisce queste informazioni quando è montato e viene salvato nelle tabelle di montaggio.
È possibile visualizzare queste informazioni (stato corrente) utilizzando il comando mount.

2) Come si chiama quindi il file_open o la funzione di apertura di quel particolare file system per aprire il file.

Una volta che il file system è noto, la struttura ops per tale FS è recuperata, e la open() entrypoint può essere chiamato.

1) Che cosa fa effettivamente cdev_add()? in termini di registrazione di un dispositivo nel kernel .

registrazione del driver (per esempio cdev_init() per un dispositivo char) installa ops la struttura di guida che elenca le entry point di funzioni che il guidatore può eseguire.
cdev_add() notifica al kernel che il driver può controllare un'istanza specifica di quel tipo di dispositivo char.A quell'istanza del dispositivo viene assegnato un numero minore che associa il nome del dispositivo in /dev allo stato delle informazioni nel driver.
Si noti che tipi di dispositivo diversi da char (come una rete o piattaforma (bus) dispositivi appartengono a un sottosistema diverso e utilizzano diverse procedure di registrazione.

2) Registrare un dispositivo nel kernel significa?

L'accesso a quel dispositivo è ora abilitato.

3) Come funziona open (/ dev/mynull, O_RONLY); chiamato su un file di dispositivo in realtà chiama la funzione aperta del driver che viene mappato durante l'inizializzazione del dispositivo chiamando routine cdev_init (& c_dev, & pugs_fops); ?

La routine init() del driver deve essere richiamata una sola volta quando viene caricato il driver. Questa routine dovrebbe verificare l'esistenza e lo stato operativo di tutte le istanze del dispositivo. Dovrebbero essere acquisite risorse quali linee di interrupt, canali DMA e porta I/O e/o spazio di memoria. Il driver registra la sua struttura ops con il kernel. Il driver registra ogni istanza del dispositivo con il kernel.

La chiamata open() nello spazio utente viene gestita dalla libreria C. Il nome /dev dispositivo viene tradotto al numero di dispositivo maggiore (che identifica il sottosistema dispositivo o una classe, ad esempio tty o audio, deve elaborare la richiesta) e il numero minore (che identifica quale driver di dispositivo da utilizzare e l'istanza accesso al dispositivo). Il processore passa alla modalità supervisore in modo che sia possibile chiamare la routine open() del driver del kernel, che viene richiamata dalla struttura del driver ops. Per ulteriori informazioni sulla struttura ops, vedere questo other answer.