2013-09-06 21 views
6

Sto provando a scrivere una semplice applicazione in grado di leggere i registri msr e sto eseguendo questa applicazione dallo spazio utente.Lettura/dev/cpu/*/msr dallo spazio utente: operazione non consentita

Ho caricato il modulo msr e ho dato i permessi di lettura per tutti a/dev/cpu/*/msr. Ma ancora l'utente non è in grado di accedere a questi file, ma la radice può.

I permessi simile a questa:

crw-r--r-- 1 root root 202, 0 sep 6 17:55 /dev/cpu/0/msr 

crw-r--r-- 1 root root 202, 1 sep 6 17:55 /dev/cpu/1/msr 

crw-r--r-- 1 root root 202, 2 sep 6 17:55 /dev/cpu/2/msr 

crw-r--r-- 1 root root 202, 3 sep 6 17:55 /dev/cpu/3/msr 

continuo a ricevere il messaggio di errore "Operazione non consentita" quando provo a leggere questi file da userspace, ma funziona bene quando radice tenta di accedervi. Che cosa sto facendo di sbagliato? Sono su Ubuntu 13.04 con la versione del kernel 3.11.0.

+0

hai eseguito il programma con sudo? – OneOfOne

risposta

6

Le modifiche nel kernel Linux mainline dal 3.7 circa richiedono ora un eseguibile CAP_SYS_RAWIO per aprire il file del dispositivo MSR [2]. Oltre caricare il modulo del kernel MSR e l'impostazione dei permessi dei file appropriate sul file dispositivo MSR, si deve concedere la capacità CAP_SYS_RAWIO a qualsiasi eseguibile utente che ha bisogno di accedere al driver MSR, utilizzando il seguente comando:

sudo setcap cap_sys_rawio=ep <user_executable> 
+0

Grazie, ho provato a dare la funzionalità CAP_SYS_RAWIO all'eseguibile come suggerivi e affrontare lo stesso problema! – futureishere

+0

Grazie mille. Questo ha funzionato per me. – Rakib

0

Puoi vedi vfs_read:

ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) 
{ 
    ret = rw_verify_area(READ, file, pos, count); 
    if (ret >= 0) { 
     ... 
     if (file->f_op->read) // your driver read . 
      ret = file->f_op->read(file, buf, count, pos); 
     else 
      ret = do_sync_read(file, buf, count, pos); 
     .... 

    } 
    // here, if the ret is 13. your error will be occur. 
    return ret; 
}