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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |