Home > Enterprise >  How 'task_struct' is accessed via 'thread_info' in linux latest kernel?
How 'task_struct' is accessed via 'thread_info' in linux latest kernel?

Time:11-22

Background : I am a beginner in the area of linux kernel. I just started to understand Linux kernel by reading a book 'Linux kernel Development - Third Edition' by Robert Love. Most of the explanations in this book are based on Linux kernel 2.6.34.

Hence, I am sorry, if this is repetitive question, but I could not find any info related to this in stack overflow.

Question: What I understood from the book is that, each thread in linux has a structure called 'thread_info', which has pointer to its process/task.

This 'thread_info' is stored and the end of the kernel stack for each alive thread.

and the 'thread_info' has a pointer to its belonging task as below.

struct thread_info {
    
    struct task_struct *task;
    ...
};

But when I checked the same structure in the latest linux code, I see a very different thread_info structure as below. (https://elixir.bootlin.com/linux/v5.16-rc1/source/arch/x86/include/asm/thread_info.h). It does not have 'task_struct' in it.

struct thread_info {
    
    unsigned long       flags;      /* low level flags */
    unsigned long       syscall_work;   /* SYSCALL_WORK_ flags */
    u32                 status;     /* thread synchronous flags */
    #ifdef CONFIG_SMP
    u32                 cpu;        /* current CPU */
    #endif

};

My Question is, that if 'thread_info' structure does not have its related task structure here, then how does it find the information about its address space?

Also, If you know any good book on the latest linux kernel, please provide links to me.

CodePudding user response:

Pointer to the current task_struct object is stored in architecture-dependent way. On x86 it is stored in per-CPU variable:

DECLARE_PER_CPU(struct task_struct *, current_task);

(In arch/x86/include/asm/current.h).

For find out how current task_struct is stored on particular architecture and/or in particular kernel version just search for implementation of current macro: exactly that macro is responsible for returning a pointer to the task_struct of the current process.

  • Related