我在内核模块中有两个位置(
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 举报,一经查实,本站将立刻删除。