Linux – the need of the struct thread_info in locating struct task_struct

ckernellinuxmultithreadingprocess

While reading through the Linux Device Drivers, I could understand that the Process Descriptor (of type struct task_struct) has all the info regarding a particular task. The process descriptors are allocated dynamically by the slab allocator.

What I would like to know is about the need to introduce a new structure called thread_info which is stored at the bottom of the stack (assuming x86). Why was this done?

Why was it not possible to place the address of the current executing task address (struct task_struct) to the kernel stack?

Best Answer

The reason why we need the thread_info is due to the fact that we are allocating the memory for task_struct using the Slab Allocator. Now you may ask what is the relation between these?

To understand that you need to understand how Slab Allocator works.

Without the Slab Allocator , the kernel developers could allocate memory for task_struct in the kernel stack for the particular process so that it can be accessed easily. Now with the advent of Slab Allocator , the memory is allocated to the task_struct as determined by the Slab Allocator. So with the Slab Allocator you have task_struct stored somewhere else and not in the kernel stack of the particular process. Now the Kernel developers introduced thread_info and placed a pointer in it to the place where the task_struct resides. And that is why we have to live with thread_info.

You can read about Slab Allocator in Robert Love's book Linux Kernel Development.

Related Question