微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

>一个是module_init
>另一个是与运行无效操作码挂钩的代码(通过黑客中断描述表).

我的代码是启用硬件性能计数器.当我把它放在module_init中时,代码工作正常.但是当我把它放到第二位时(通过运行带有无效操作码的指令触发),代码会获得一个权限被拒绝的错误(即错误:-13).

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

更新:值得一提的是,当我在用户空间中以root身份运行无效操作码时,-13 errno消失了;否则,它会…

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

解决方法

因为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,current->cred->euid);
    ...
}

module_init(my_init);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐