从用户空间读取/ dev / cpu / * / msr:不允许操作

时间:2013-09-06 16:04:45

标签: file-permissions user-permissions msr

我正在尝试编写一个可以读取msr寄存器的简单应用程序,并且正在从用户空间运行此应用程序。

我已经加载了msr模块并为每个人提供了对/ dev / cpu / * / msr的读取权限。但是仍然用户无法访问这些文件,但root可以。

权限如下所示:

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

当我尝试从用户空间读取这些文件时,我一直收到“不允许操作”错误消息,但在root尝试访问它们时工作正常。我究竟做错了什么?我在Ubuntu 13.04上使用内核版本3.11.0。

3 个答案:

答案 0 :(得分:7)

自3.7左右以来主线Linux内核的变化现在要求可执行文件具有CAP_SYS_RAWIO能力来打开MSR设备文件[2]。除了加载MSR内核模块并在msr设备文件上设置适当的文件权限之外,还必须使用以下命令将CAP_SYS_RAWIO功能授予需要访问MSR驱动程序的任何用户可执行文件:

sudo setcap cap_sys_rawio=ep <user_executable>

答案 1 :(得分:2)

对我(在 debian 上)来说,它有助于在加载 msr 模块后设置设备权限。除了 除了 PaulUTK 的答案,作为 root:

setcap cap_sys_rawio=ep <user_executable>

设置设备权限(之前检查):

ls -l /dev/cpu/*/msr
crw------- ... /dev/cpu/0/msr

我添加了一个组 msr 并分配了它。以根用户身份:

chgrp msr /dev/cpu/*/msr
chmod g+rw /dev/cpu/*/msr
ls -l /dev/cpu/*/msr
crw-rw---- ... /dev/cpu/0/msr

将组分配给用户:

usermod -aG msr hardworkinguser

奖励提示:

无需重新登录即可将组申请为hardworkinguser

newgrp msr

我还听说必须禁用安全启动。

答案 2 :(得分:0)

你可以看到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;
}