我在内核模块 (Linux 3.13) 中有两个位置:
- 一个是
module_init
- 另一个是我挂接运行无效操作码的代码(通过破解中断描述表)。
我的代码是启用硬件性能计数器。当我将它放入 module_init
时,代码运行正常。但是当我把它放在第二位时(通过运行带有无效操作码的指令触发),代码得到一个permission denied
错误(即错误号:-13
)。
既然这两个地方都在同一个内核模块中,那么“即使在内核空间中,也有不同的权限吗?”
更新:值得一提的是,当我在用户空间以 root
身份运行无效操作码时,-13
错误号消失了;否则,它将保持...
我推测“指令执行的特权决定了它的中断处理程序的执行”。
最佳答案
因为 module_init
和你的钩子(Hook)代码运行在不同的进程中。并且不同进程之间有不同的权限。
一般情况下,代码必须运行在一个进程中。
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);
关于linux - 内核模块执行中的不同特权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30700412/