2013-05-01 9 views
6
  • Biorąc pod uwagę inode że istnieje w /proc/**/fd/*
  • oraz moduł Linux Kernel, który musi odnaleźć wykonywalnego ścieżkę z dowiązania symbolicznego /proc/**/exe

Jak mogłeś Zaimplementowałem to tak, że z numeru i-węzła otrzymałem ścieżkę do pliku wykonywalnego za pomocą fd?wykonywalny ścieżka z fd węzła w moduł jądra Linux

+1

W moich badań znalazłem metodę 'proc_fd_link' (http: //lxr.free-electrons.com/source/fs/proc/fd.c? a=avr32#L140), ale nie jest dostępny z mojego modułu jądra (metoda nie została znaleziona w kompilacji.) – ZedTuX

+1

Znalazłem również makra 'PDE' i 'PROC_I' (http://lxr.free-electrons.com/source/include/linux/proc_fs.h), ale nie wiem jak znaleźć element'/proc/**/exe'. – ZedTuX

+1

I-węzeł może mieć dowolną lub więcej niż jedną ścieżkę, a przestrzenie nazw mogą powodować różne ścieżki w różnych procesach. Do czego potrzebna jest ścieżka i dlaczego należy to zrobić z modułu jądra? –

Odpowiedz

0

Modele proc_inode struct i PROC_I macro są wewnętrznymi. Zobacz [PATCH 27/28] proc: Make the PROC_I() and PDE() macros internal toprocfs [RFC].

Zamiast tego, co z iteracją na liście zębatej i-węzła? Można użyć dentry_path_raw() znaleźć nazwę /*/fd/* ścieżki:

//struct inode *proc_inode; 

struct dentry *dentry; 
pid_t pid; 
int found_match = 0; 

printk(KERN_DEBUG "superblock type name: %s\n", proc_inode->i_sb->s_type->name); 

// An inode's dentry list is protected by the i_lock. See: 
// - "dcache->d_inode->i_lock protects: i_dentry, d_u.d_alias, d_inode of aliases" 
// http://lxr.free-electrons.com/source/fs/dcache.c?v=4.0#L48 
// - The implementation of d_prune_aliases() 
// http://lxr.free-electrons.com/source/fs/dcache.c?v=4.0#L882 
spin_lock(&proc_inode->i_lock); 
hlist_for_each_entry(dentry, &proc_inode->i_dentry, d_u.d_alias) { 
    char buf[64]; 
    const char *path_raw; 
    char c; 

    path_raw = dentry_path_raw(dentry, buf, sizeof(buf)); 

    // dentry_path_raw() places the path into `buf'. If `buf' is not large 
    // enough, then continue on to the next dentry. 
    if (!(buf <= path_raw && path_raw <= buf + sizeof(buf) - 1)) { 
     printk(KERN_DEBUG "`buf' not large enough, dentry_path_raw() returned %ld\n", PTR_ERR(path_raw)); 
     continue; 
    } 

    printk(KERN_DEBUG "path_raw = %s\n", path_raw); 

    // We're looking to match: ^/(\d*)/fd/ 

    if (*path_raw++ != '/') continue; 

    pid = 0; 
    for (c = *path_raw; c; c = *++path_raw) { 
     if ('0' <= c && c <= '9') { 
      pid = 10 * pid + (c - '0'); 
     } else { 
      break; 
     } 
    } 

    if (*path_raw++ != '/') continue; 
    if (*path_raw++ != 'f') continue; 
    if (*path_raw++ != 'd') continue; 
    if (*path_raw != '/' && *path_raw != '\0') continue; 

    // Found a match. Break the dentry list loop. 
    found_match = 1; 
    printk(KERN_DEBUG "breaking dentry list loop\n"); 
    break; 
} 
spin_unlock(&proc_inode->i_lock); 

if (found_match) { 
    printk(KERN_DEBUG "pid = %d\n", (int)pid); 
} 

EDIT: Przesłałem projekt demonstracyjny do GitHub:
https://github.com/dtrebbien/so16317923-proc-fs-kernel-module

+0

Dzięki! spojrzę na to – ZedTuX

Powiązane problemy