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>

index | next in thread | previous in thread | raw e-mail

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.




home | help

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