clinuxprocesslinux-kernelkernel

How does the kernel use task_struct?


I am a student doing research involving Linux processes, and I need to learn more about them to proceed with my experiment. In reading a couple books and things online, I've come across task_struct, which I'm not sure I'm understanding fully, and would like confirmation/correction onto my existing thought.

From what I think I've understood, task_struct is the C structure that acts as the process descriptor, holding everything the kernel might need to know about a processes. At the end of the process kernel stack lives another struct, thread_info, which has a pointer to the processes task_struct.

Another question: how does one access the task_struct of a process? Is there a calculation to find the location of it's thread_info? Is there a macro/function within the kernel?


Solution

  • Yes, the task_struct structure contains all the information about a process. You can obtain a pointer to the structure that describes the current process using the current macro as follows:

    struct task_struct *p = current;
    

    If you want to get the structure that describes a process given a pid, you can use the find_task_by_vpid function as follows:

    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);
    

    Finally, if you want to iterate over all processes, you can use for_each_process as follows:

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

    If you want to an exclusive access to the task list to be able to make changes to one or more fields in the structure, write_lock_irqsave must be used instead of read_lock.