2016-04-09 10 views
2

Ich habe die Systemaufruf-Tabelle so geändert, dass mein eigener mmap-Handler bei einem User-Space-Aufruf aufgerufen wird zu mmap. Mein Handler ruft die ursprüngliche mmap auf und wählt entsprechend dem Ergebnis, was zu tun ist.Ermitteln, ob eine Dateistruktur (Beschreiben eines Dateideskriptors) eine 'spezielle Datei' ist (dh Block/Zeichen)

Hier ist ein sehr kurzer Code-Schnipsel:

asmlinkage unsigned long my_mmap_handler(unsigned long addr, 
            unsigned long len, 
            int prot, 
            int flags, 
            int fd, 
            long off) 
{ 
    unsigned long ret_val = old_mmap(addr,len,prot,flags,fd,off); 
    if (IS_ERR((void*)ret_val)) 
     goto end; 
    // Do some stuff.. 
    end: 
    return ret_val; 
} 

während in „ein paar Sachen tun“ Ich habe einige Operationen auf der tatsächlichen mapped-Datei (das heißt aus der Datei zu lesen).

Hier ist das Problem:

ich Programme gestoßen, die versuchen, Zeichen/Block-Geräte mmap (z/dev/rdi/card0). Immer wenn ich versuche, aus einer solchen Datei zu lesen (z. B. mit vfs_read), friert der Kernel ein (keine Panik, aber es fühlt sich an, als würde etwas blockieren). Warum genau passiert das? Wie auch immer, ich brauche keine Operationen auf Zeichen/Block-Geräten, also habe ich versucht herauszufinden, ob eine gegebene 'struct-Datei' ein Block/Zeichen-Gerät darstellt und falls es ignoriert wird . Bisher kein Glück.

würde Hilfe

+0

Sie [ 'Mann fstat'] Suchen (http://linux.die.net/ Mann/2/fstat)? – usr2564301

Antwort

0

es Löste das Präprozessormakro mit:

#define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) 

defined in linux/fs.h 

Das Makro kann dann verwendet werden, als ob ein Dateizeiger zu bestimmen, folgt ‚beschreibt‘ eine spezielle Datei:

struct file * f; 
// ... 
if (special_file(file_inode(f)->i_mode)) 
{ 
    /* If we're here then it is a 
    block/character device or FIFO/SOCKET file */ 
} 
0

geschätzt werden können Sie herausfinden, ob eine Datei ein Block oder Zeichengerät ist durch das Lesen ist Inode-Struktur Mitglied i_rdev:

file->f_dentry->d_inode->i_rdev 

Es enthält die Haupt-, Neben- Wert und wenn es 0 nicht, es ist ein Gerät

Verwandte Themen