gpt4 book ai didi

linux - 专有 Linux 内核驱动程序是否有任何 kill_proc() 替代品?

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:16 25 4
gpt4 key购买 nike

我正在将 4 个专有(阅读:非 GPL)Linux 内核驱动程序(我没有编写)从 RHEL 5.x 移植到 RHEL 6.x(2.6.32 内核)。驱动程序都使用 kill_proc() 来向用户空间“ session ”发送信号,但该函数已从较新的内核中删除(介于 2.6.18 和 2.6.32 之间)。我在这里和其他地方看到这个问题被问过很多次,并且我进行了相当广泛的搜索,但是在许多建议的解决方案中,由于不再导出函数或需要 GPL-only 函数(见下文) .有谁知道适用于专有驱动程序的解决方案?

给定:kill_proc(pid, sig, 1);

我找到的最简单的解决方案是使用:kill_proc_info(sig, SEND_SIG_PRIV, pid);但是 kill_proc_info 不再导出,因此无法使用。

kill_pid_info() 已被建议(这是在设置 rcu_read_lock() 后由 kill_proc_info() 调用的。kill_pid_info() 需要一个 struct pid* 所以我可以使用:kill_pid_info(sig, SEND_SIG_PRIV, find_vpid(pid)); 然而find_vpid() 导出仅供 GPL 使用,这是一个专有驱动程序。是否有另一种方法来获取 struct pid*?

kill_pid_info() 还设置了一个 rcu_read_lock(),然后调用 group_send_sig_info()。不幸的是,group_send_siginfo() 没有导出,而且它需要一个 struct task_struct*,但所需的 find_task_by_vpid() 函数也没有导出。

另一个建议是 kill_pid(),但这也需要一个 struct pid*,而且函数 find_vpid() 仅针对 GPL 导出。

也有关于 send_sig() 和 send_sig_info() 的建议,但是这些也需要一个 struct task_struct*,而且 find_task_by_pid() 没有被导出,并且 pid_task() 需要 (GPLd) find_vpid() 来获得一个结构 pid*。此外,这些函数不设置 rcu_read_lock() 并且它们还为组标志传递 FALSE 值(而 kill_proc 最终使用 TRUE 值)- 因此可能存在一些细微差别。

这就是我能找到的所有内容。有没有人有适合我的情况的建议?提前致谢。

最佳答案

由于没有人回答我的问题,我一直阅读了大部分内核代码,我想我找到了一个解决方案。

似乎是唯一提供与 kill_proc() 相同的语义是 kill_pid()。我们不能使用GPL find_vpid() 函数来获取所需的 struct pid*,但是如果我们能得到 struct task_struct*,那么我们就能得到那里的 struct pid* 为: 任务->pids[PIDTYPE_PID].pid

由于不再导出find_task_by_vpid(),看来找到任务的唯一方法是遍历整个寻找它的任务列表。因此,建议的解决方案是:

int my_kill_proc(pid_t pid, int sig) {
int error = -ESRCH; /* default return value */
struct task_struct* p;
struct task_struct* t = NULL;
struct pid* pspid;
rcu_read_lock();
p = &init_task; /* start at init */
do {
if (p->pid == pid) { /* does the pid (not tgid) match? */
t = p;
break;
}
p = next_task(p); /* "this isn't the task you're looking for" */
} while (p != &init_task); /* stop when we get back to init */
if (t != NULL) {
pspid = t->pids[PIDTYPE_PID].pid;
if (pspid != NULL) error = kill_pid(pspid,sig,1);
}
rcu_read_unlock();
return error;
}

我知道搜索整个任务列表会花费更多时间而不是使用哈希表,但这就是我所拥有的。一些担忧/问题我有:

  1. rcu_read_lock() 是否足够?会最好改用 preempt_disable() 之类的东西?
  2. struct task_struct 可以没有 PIDTYPE_PID 条目吗在 pids 数组中?如果是这样,检查 NULL 就足够了吗?
  3. 我刚接触内核,还有其他的吗有什么改进建议?

关于linux - 专有 Linux 内核驱动程序是否有任何 kill_proc() 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com