我在内核模块中有两个位置(Linux 3.13):
module_init
我的代码是启用硬件性能计数器。当我把它放在module_init
时,代码工作正常。但是当我把它放到第二位时(通过运行带有无效操作码的指令触发),代码会出现permission denied
错误(即错误:-13
)。
由于两个地方都在一个内核模块中,“即使在内核空间中,也有不同的权限吗?”
更新:值得一提的是,当我在用户空间中将无效操作码作为root
运行时,-13
错误消失了;否则,它会停留......
我推测“指令执行的特权决定了它的中断处理程序的执行。”
答案 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);