内核如何使用task_struct?

时间:2019-06-10 18:42:20

标签: c linux process linux-kernel kernel

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

据我所了解,task_struct是充当进程描述符的C结构,它包含内核可能需要了解的有关进程的所有信息。在进程内核栈的最后,存在另一个结构thread_info,该结构具有指向进程task_struct的指针。

另一个问题:如何访问流程的task_struct?是否有计算方法可以找到thread_info的位置?内核中是否有宏/函数?

2 个答案:

答案 0 :(得分:0)

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

struct task_struct *p = current;

如果要获取描述给定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);

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

read_lock(&tasklist_lock);
for_each_process(p) {
    // p is a pointer to a task_struct instance.
}
read_unlock(&tasklist_lock);

如果您希望以独占方式访问任务列表以能够更改结构中的一个或多个字段,则必须使用write_lock_irqsave而不是read_lock

答案 1 :(得分:0)

让我试着回答第二个问题。

在每个进程内核堆栈的顶部有一个结构thread_info

要获取thread_info的地址/指针,不同的架构有不同的解决方案,但在x86上它看起来像这样:

要获得指向 thread_info 的指针,只需屏蔽堆栈指针值的 13 位:

movl $0xFFFFE000, %eax
andl %esp, %eax

现在我们有了指针,而且这个结构有指向task_struct结构的指针。

为了得到它,有一个 current 宏,它看起来像这样:

#define current (current_thread_info()->task)

它给你指针(地址)task_struct