【问题标题】:Is there a way to check whether a given pid matches any process in kernel space?有没有办法检查给定的 pid 是否与内核空间中的任何进程匹配?
【发布时间】:2020-08-14 12:37:36
【问题描述】:

有没有办法检查给定的 PID 是否与内核空间中的任何进程匹配?

我正在构建一个系统调用来更改自定义加权循环调度程序的权重。

我想在调用find_task_by_vpid(pid) 之前进行检查,以避免在 PID 无效(即没有进程具有此 PID 值)时调用该函数。

这是因为如果使用了无效的 PID,我的虚拟机就会崩溃。所以我想做一个检查并将错误值-ESRCH返回给用户空间。

有检查功能吗?

或者是否可以检查find_task_by_vpid(pid) == NULL是否可以确定PID是否有效?当pid 无效时,我找不到指定find_task_by_vpid(pid) 的返回值的文档。

SYSCALL_DEFINE2(set_wrr_weight, pid_t, pid, int, weight){
   struct sched_wrr_entity *wrr_se;
   // I want to do a check here to see if given pid is valid or not
   wrr_se = &find_task_by_vpid(pid)->wrr;
   wrr_se->wrr_weight = weight;
   return 0;
}

【问题讨论】:

  • 1) 您使用的是哪个内核版本? 2) 我相信rr_se 应该是wrr_se? 3) 什么是sched_wrr_entity? AFAIK 不存在,task_struct 上的 wrr 字段也不存在。你真的需要任务结构在你的系统调用中使用它吗?
  • 内核 4.19.105;我正在构建一个自定义加权循环任务调度程序,因此将 wrr_se 和 sched_wrr_entity 自定义添加到内核中; Sched_wrr_entity 包含字段“struct list_head list; unsigned int wrr_weight; unsigned int time_slice”。所以我需要使用系统调用访问和更改该特定进程的 wrr_weight。

标签: c kernel system-calls pid


【解决方案1】:

检查find_task_by_vpid() 的返回值应该足以确保pid 有效。如果不是,那么它首先不会有关联的task_struct。如果您需要确认,这正是 getsid syscall 处理从用户空间传递的 PID 的方式:

// ...
    retval = -ESRCH;
    p = find_task_by_vpid(pid);
    if (!p)
        goto out;
// ...
out:
    rcu_read_unlock();
    return retval;
}

不过,您的代码中有一个不同的问题:据我所知,您没有正确处理 task_struct。您应该使用find_get_task_by_vpid() 而不是find_task_by_vpid()。此函数将为您调用get_task_struct(),增加task_struct 引用计数以避免竞争条件(因为从您的代码看来,您的系统调用可以休眠)。之后,您可以使用put_task_struct() 来减少引用计数。

类似这样的:

SYSCALL_DEFINE2(set_wrr_weight, pid_t, pid, int, weight) {
    struct sched_wrr_entity *wrr_se;
    struct task_struct *tsk;

    tsk = find_get_task_by_vpid(pid);
    if (!tsk)
        return -ESRCH;

    wrr_se = &tsk->wrr;
    wrr_se->wrr_weight = weight;

    put_task_struct(tsk);
    return 0;
}

顺便说一句,我不知道你是不是在做wrr_se = &tsk->wrr;,因为你在代码的其他地方需要它,但如果你不这样做,那么你应该可以直接设置weight做@ 987654339@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2010-10-08
    • 2011-06-06
    • 2012-02-27
    • 2016-10-10
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多