【发布时间】:2016-08-24 20:10:41
【问题描述】:
任务
我为我的 RaspBerry Pi 2 编写了一个小内核模块,它实现了一个额外的系统调用来生成功耗指标。我想修改系统调用,以便仅在特殊用户(例如“root”或用户“pi”)发出它时才调用它。否则,调用只是跳过其主体部分并返回成功。
背景工作
我已经详细阅读了这个问题,I've found a similar question on SO,但从我的角度来看,它存在很多问题(如下所述)。
问题
-
链接的问题指出struct task_struct包含指向struct cred的指针元素,如linux/sched.h和linux/cred.h中所定义。我的系统上不存在这两个标头中的后者,而前者没有显示任何指向struct cred元素的指针的声明。 这有意义吗?- 愚蠢的错误。这完全存在于内核头文件中(即:
/usr/src/linux-headers-$(uname -r)/include/linux/cred.h),我在/usr/include/linux的 gcc-build 头文件中搜索。
- 愚蠢的错误。这完全存在于内核头文件中(即:
-
即使上述方法有效,它也没有提到我是否会得到the real, effective, or saved UID for the process。 甚至可以从系统调用中获取这三个值中的每一个吗?-
cred.h已经包含所有这些。
-
-
内核模块中是否有一种安全的方法可以在不解析/etc/group的情况下快速确定用户所属的组?-
cred.h已经包含所有这些。
-
更新
因此,剩下的唯一有效问题如下:
注意,遍历进程并读取进程的 凭据应在 RCU-critical 部分下完成。
-
...我如何确保我的检查在这个关键部分运行?是否有任何工作示例说明如何完成此操作? I've found some existing kernel documentation that instructs readers to wrap the relevant code withrcu_read_lock()andrcu_read_unlock(). 我是否只需要针对struct cred和/或struct task_struct数据结构包装读取操作?
【问题讨论】:
标签: c linux linux-kernel kernel kernel-module