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);

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...