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@xxxxxxxxx> 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@xxxxxxxxxxxxxxxxx > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies > -- Regards, Denis _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies