我在内核模块(Linux 3.13)中有两个地方:
module_init
我的代码是启用硬件性能计数器。 当我把它放在module_init
,代码工作正常。 但是,当我把它放在第二位(通过运行一个无效的操作码的指令触发),代码获得permission denied
错误(即errno: -13
)。
既然这两个地方都在一个单独的内核模块中,那么“是否即使在内核空间中也有不同的权限?
更新:值得一提的是,当我在用户空间中以root
用户身份运行无效操作码时, -13
errno不见了; 否则,它保持…
我推测“执行指令的权限决定了中断处理程序的执行”。
因为module_init
和你的钩子代码在不同的进程中运行。 不同进程之间有不同的权限。
通常,代码必须在一个进程中运行。
module_init
始终在insmoding模块的时间段内运行(请参阅sys_init_module函数)。 当你insmod一个内核模块时,你必须是一个根。 这个过程也是根源。 所以它运行良好。
但是当你把代码放在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, comm: %s, uid: %d, euid: %d\n", current->tgid, current->comm, current->cred->uid, current->cred->euid); ... } module_init(my_init);