内核如何使用task_struct?

Ram*_*ikh 6 c linux kernel process linux-kernel

我是一名从事 Linux 进程研究的学生,我需要更多地了解它们才能继续我的实验。在网上阅读几本书和一些东西时,我遇到了task_struct,我不确定我是否完全理解,并希望确认/纠正我现有的想法。

从我认为我已经理解的task_struct是,作为进程描述符的 C 结构包含内核可能需要了解的关于进程的所有信息。在进程内核堆栈的末尾有另一个结构体thread_info,它有一个指向进程的指针task_struct

另一个问题:如何访问task_struct进程的 ?是否有计算来找到它的位置thread_info?内核中有宏/函数吗?

Had*_*ais 5

是的,该task_struct结构包含有关进程的所有信息。您可以使用current宏获取指向描述当前进程的结构的指针,如下所示:

struct task_struct *p = current;
Run Code Online (Sandbox Code Playgroud)

如果您想获得描述给定 a 的过程的结构pid,您可以使用该find_task_by_vpid函数,如下所示:

read_lock(&tasklist_lock);
p = find_task_by_vpid(pid);
if (p) get_task_struct(p);
read_unlock(&tasklist_lock);
if (p == NULL) {
    // Task not found.
}

// Later, once you're finished with the task, execute:
put_task_struct(p);
Run Code Online (Sandbox Code Playgroud)

最后,如果要遍历所有进程,可以使用for_each_process如下:

read_lock(&tasklist_lock);
for_each_process(p) {
    // p is a pointer to a task_struct instance.
}
read_unlock(&tasklist_lock);
Run Code Online (Sandbox Code Playgroud)

如果您希望对任务列表的独占访问权限能够对结构中的一个或多个字段进行更改,则write_lock_irqsave必须使用 代替read_lock