On Wednesday 01 December 2004 06:34, Jagadeesh Bhaskar P wrote: > Hi all, > I was going through the explanation of the current macro, and found out > that it was got by masking 13-bits LSB the esp register. So is it that > always the process descriptor will start at a location with the last 13 > bits are 0?? No. I am very new to the kernel but I think you missed something. On x86, current is calculated by masking the 13 least significant bits of the stack pointer to get the the thread_info structure. First you have: static inline struct task_struct * get_current(void) { return current_thread_info()->task; } #define current get_current() Then current_thread_info() is defined as the following: static inline struct thread_info *current_thread_info(void) { struct thread_info *ti; __asm__("andl %%esp,%0; ":"=r" (ti) : "" (~(THREAD_SIZE - 1))); return ti; } Did you notice the '~' operator in front of (THREAD_SIZE - 1)? I'm not used with inline Assebly but the previous code should mean, more or less: movl $-8192, %eax andl %esp, %eax So you have 13 * '1' in a register, and the "andl" instruction is executed between "1 1111 1111 1111" and the stack pointer. We don't have any zeros in the register %eax to be andl(ed) with %esp. The result is written in "struct thread_info *ti" and then, in get_current() we have return "current_thread_info()->task;" that is like "ti->task;". > > I have read that both the kernel stack and process descriptor of a > process is stored in together in an 8KB page. Now the offsets in the > page should start from all bits 0, rite? So then why masking only the 13 > bits LSB?? What is the significance of keeping that length at 13?? > > Please do help!! > > TIA Ciao, Fabio De Francesco -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/