2015-05-19 18 views
8

Mentre imparavo a scrivere i driver di dispositivo mi sono imbattuto nella macro IS_ERR(). Ma non ho trovato come funziona. Ho includere il codice qui sotto:IS_ERR() macro in Linux

majorNumber = register_chrdev(0, DEVICE_NAME, &fops); 

if (majorNumber<0) 
{ 
    printk(KERN_ALERT "Failed to register a major number\n"); 
    return majorNumber; 
} 
printk(KERN_INFO "Registered correctly with major number %d\n", majorNumber); 

// Register the device class 
ebbcharClass = class_create(THIS_MODULE, CLASS_NAME); 

if (IS_ERR(ebbcharClass)) 
{    
    unregister_chrdev(majorNumber, DEVICE_NAME); 
    printk(KERN_ALERT "Failed to register device class\n"); 
    return PTR_ERR(ebbcharClass);   
} 

Così che cosa fa l'IS_ERR() macro espandere per e come viene eseguito.

+0

Non è chiaro cosa stai chiedendo. Se desideri solo vedere a cosa valuta la macro, compila con l'opzione '-E' – Eregrith

+0

Ho modificato la mia domanda per dare un chiaro significato a ciò che ho bisogno di sapere. –

+0

Btw, usa le macro 'pr _ *()' per stampare e controlla il [CodingStyle] (https://www.kernel.org/doc/Documentation/CodingStyle) per ogni evenienza. – 0andriy

risposta

6

Verifica se il puntatore fornito deve essere considerato un valore di errore anziché un puntatore valido per i dati.

Tratta valori inferiori a 1000L (4096) come errore invece di un puntatore poiché tali valori non sono puntatori legittimi.

Nel proprio codice IS_ERR viene utilizzato per verificare se class_create è riuscito a creare ebbcharClass. Se si verifica un errore, annullare la registrazione del driver char e segnalare l'errore.

Si possono trovare le macro e funcs linea in err.h

+0

Vorrei aggiungere che è definito in 'err.h'. – 0andriy

1

Se volete sapere qual è la macro restituisce, basta compilare il file utilizzando l'opzione -E di gcc, che farà solo pre-elaborazione. Comprenderà tutte le intestazioni e espande tutte le macro.

La macro non "viene eseguita" di per sé, è solo un tipo di ricerca e sostituzione di una cosa.

1

essere mirata a trabocchetto:

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) 
#define MAX_ERRNO  4095 

Copre -1 a -4095, che rappresenta il codice di errore, non numero sotto 4096, né NULL (0). Ogni valore da 0 a 4294963201 (0xfffff001) non viene considerato alcun errore. Non usarlo per coprire il controllo NULL.

+0

Errore di battitura: il valore buono deve essere compreso tra 0 e 4294963200 (0xfffff000). –