Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 02 Sep 2007 09:33:25 +0100
From:      Doug Rabson <dfr@rabson.org>
To:        Jin Guojun <jin@george.lbl.gov>
Cc:        threads@freebsd.org, hackers@freebsd.org
Subject:   Re: How TLS is used in Kernel thread
Message-ID:  <1188722005.1058.32.camel@herring.rabson.org>
In-Reply-To: <46D734A1.2090700@george.lbl.gov>
References:  <46B245D5.1050606@george.lbl.gov> <20070803090530.GH2738@deviant.kiev.zoral.com.ua> <46D734A1.2090700@george.lbl.gov>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 2007-08-30 at 14:20 -0700, Jin Guojun wrote:
> By looking through _pthread_create() code and find it uses a magic 
> cookie -- TLS -- created
> by rtld_allocate_tls(), and passed into kernel by sysarch() via 
> _tcb_set() / _kcb_set().
> 
> The information seems to be set by rtld (ld-elf.so.1) in digest_phdr() 
> under tag PT_TLS.
> But it is very magic for where the TLS object is created and how it is 
> passed to digest_phdr().
> 
> The whole object passed into kernel (as sd.gsbase) looks like this:
> 
> TCB:  ______________________________
>          |  TLS              |           TCB      |
>          |______________|_______________|
> 
> Can someone give some basic exaplain on following questions?
> 
> 1) What TLS stand for?

Its used to implement Thread-Local-Storage variables. These are global
variables declared with the '__thread' keyword. Each variable declared
in this way has a per-thread value (i.e. each thread has a private copy
of the variable).

> 2) Where TLS object is created? (below is the tls assigned, but I couls 
> not find where ph is from)
>     case PT_TLS:
>             obj->tlsindex = 1;
>             obj->tlssize = ph->p_memsz;
>             obj->tlsalign = ph->p_align;
>             obj->tlsinitsize = ph->p_filesz;
>             obj->tlsinit = (void*) ph->p_vaddr;

Most of the work of dealing with TLS happens in the runtime
linker /libexec/ld-elf.so.1. The runtime linker calculates the TLS size
based on the TLS usage of all loaded libraries. The thread library uses
an internal interface to rtld (_rtld_allocate_tls and _rtld_free_tls)
during thread creation and destruction to allocate and free the TLS
blocks. As you have seen, the memory allocated also includes the
thread-library's control structures (which includes the saved register
set etc.).

Static programs have a slightly simpler mechanism (simpler because there
is only the main program and no dynamic libraries). This is handled in
src/lib/libc/gen/tls.c.

> 
> 3) Where in kernel the TLS is used for thread operation?

The kernel doesn't use this information at all. It simply provides
support for the thread libraries needs.





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1188722005.1058.32.camel>