内核模块执行中的不同权限

时间:2015-06-08 02:12:56

标签: linux kernel kernel-module privileges

我在内核模块中有两个位置(Linux 3.13):

  1. 一个是module_init
  2. 另一个是我运行无效操作码的代码(通过黑客中断描述表)。
  3. 我的代码是启用硬件性能计数器。当我把它放在module_init时,代码工作正常。但是当我把它放到第二位时(通过运行带有无效操作码的指令触发),代码会出现permission denied错误(即错误:-13)。

    由于两个地方都在一个内核模块中,“即使在内核空间中,也有不同的权限吗?”

    更新:值得一提的是,当我在用户空间中将无效操作码作为root运行时,-13错误消失了;否则,它会停留......

    我推测“指令执行的特权决定了它的中断处理程序的执行。”

1 个答案:

答案 0 :(得分:2)

因为module_init和你的钩子代码在不同的进程中运行。不同的流程之间有不同的特权。

通常,代码必须在进程中运行。

module_init始终在insmoding模块期间运行(请参阅sys_init_module函数)。在insmod内核模块时,您必须是root。而且这个过程也是根源。所以它运行良好。

但是当您将代码放入IDT时,它可能会在用户进程中运行,因为用户进程会触发中断。所以它得到了一个-EPERM。

您可以在代码中查看euid,uid,pid和comm。像这样:

int hook_func()
{
    printk(KERN_INFO"Code Called in hook_func. My pid: %d, comm: %s, uid: %d, euid: %d\n",
            current->tgid, current->comm, current->cred->uid, current->cred->euid);
    ...
}

int my_init()
{
    printk(KERN_INFO"Code Called in my_init. My pid: %d, comm: %s, uid: %d, euid: %d\n",
            current->tgid, current->comm, current->cred->uid, current->cred->euid);
    ...
}

module_init(my_init);