Re: Explanation needed for current macro

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/




[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux