thread_info address calculation

Denis Kirjanov kirjanov at gmail.com
Fri Sep 16 07:56:29 EDT 2011


It's the same thing as you read:
THREAD size is 8kb so the operation looks like the following:
current_stack_pointer & ~(8191) == current_stack_pointet & 0xFFFFFE00
(last 13 bits are 0)

On Fri, Sep 16, 2011 at 3:38 PM, Vijay Chauhan <kernel.vijay at gmail.com> wrote:
> Hi list,
>
> I would like to know how the thread_info address is calculated? As per
> the LKD book:
> struct thread_info is stored on the kernel stack. On x86, current is
> calculated by masking out the 13 least-significant bits of the stack
> pointer to obtain the thread_info structure.This is done by the
> current_thread_info() function.The assembly is shown here:
> movl $-8192, %eax
> andl %esp, %eax
> This assumes that the stack size is 8KB.
>
> But in code i found that:
> /* how to get the thread information struct from C */
> static inline struct thread_info *current_thread_info(void)
> {
>        return (struct thread_info *)
>                (current_stack_pointer & ~(THREAD_SIZE - 1));
> }
>
> /* how to get the current stack pointer from C */
> static inline unsigned long current_stack_pointer(void)
> {
>        unsigned long sp;
>        asm("mov sp,%0; ":"=r" (sp));
>        return sp;
> }
>
> Could anyone help me in explaining the current_stack_pointer and
> (current_stack_pointer & ~(THREAD_SIZE - 1)) calculation? This is not
> as mentioned in the book.
>
> If page size is 4KB and 2 page per process kernel stack is used then
> THREAD_Size will be 8KB.
>
> Thanks,
> Vijay
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>



-- 
Regards,
Denis



More information about the Kernelnewbies mailing list