2013-09-06 19 views
6

Próbuję napisać prostą aplikację, która może odczytać rejestry msr, i uruchomię tę aplikację z przestrzeni użytkownika.Czytanie/dev/cpu/*/msr z przestrzeni użytkownika: operacja niedozwolona

Załadowałem moduł msr i otrzymałem uprawnienia odczytu dla wszystkich do/dev/cpu/*/msr. Ale nadal użytkownik nie ma dostępu do tych plików, ale root może.

Uprawnienia wyglądać następująco:

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 

Wciąż dostaję „Operation not permitted” komunikat o błędzie podczas próby odczytu tych plików z przestrzeni użytkownika, ale działa dobrze, gdy korzeń próbuje uzyskać do nich dostęp. Co ja robię źle? Jestem na Ubuntu 13.04 z wersją jądra 3.11.0.

+0

czy uruchomiłeś swój program z sudo? – OneOfOne

Odpowiedz

6

Zmiany w głównym jądrze Linuksa, ponieważ około 3,7 teraz wymagają pliku wykonywalnego, aby mieć możliwość CAP_SYS_RAWIO, aby otworzyć plik urządzenia MSR [2]. Oprócz ładowania modułu jądra MSR i ustawiając odpowiednie uprawnienia do plików w pliku urządzenia msr, trzeba przyznać zdolność CAP_SYS_RAWIO do dowolnego pliku wykonywalnego użytkownika, który potrzebuje dostępu do sterownika MSR, za pomocą komendy poniżej:

sudo setcap cap_sys_rawio=ep <user_executable> 
+0

Dzięki, próbowałem dać CAP_SYS_RAWIO możliwość wykonywania, jak sugerujesz i nadal zmierzyć się z tym samym problemem! – futureishere

+0

Dziękuję bardzo. To działało dla mnie. – Rakib

0

Ty możliwe, zobacz 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; 
}