加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 02:14:12 所属栏目:Linux 来源:网络整理
导读:我在内核模块中有两个位置( Linux 3.13): 一个是module_init 另一个是与运行无效操作码挂钩的代码(通过黑客中断描述表). 我的代码是启用硬件性能计数器.当我把它放在module_init中时,代码工作正常.但是当我把它放到第二位时(通过运行带有无效操作码的指令触
我在内核模块中有两个位置( 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: %dn",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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读