Как ядро ​​использует task_struct? - PullRequest
1 голос
/ 10 июня 2019

Я студент, занимающийся исследованиями процессов Linux, и мне нужно больше узнать о них, чтобы продолжить мой эксперимент.Читая пару книг и тому подобное в Интернете, я наткнулся на task_struct, который, я не уверен, полностью понимаю, и хотел бы получить подтверждение / исправление в моей существующей мысли.

Из того, что яКажется, я понял, task_struct - это структура C, которая действует как дескриптор процесса и содержит все, что ядро ​​может знать о процессах.В конце процесса в стеке ядра живет другая структура, thread_info, в которой есть указатель на процессы task_struct.

Другой вопрос: как получить доступ к task_struct процесса?Есть ли расчет для определения местоположения thread_info?Есть ли макрос / функция в ядре?

1 Ответ

0 голосов
/ 11 июня 2019

Да, структура 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);

Если вы хотите иметь эксклюзивный доступ к списку задач, чтобы иметь возможность вносить изменения в одно или несколько полей в структуре, вместо 10101 * следует использовать write_lock_irqsave.

...