How are the fs/gs registers used in Linux AMD64?

architecture, assembly, linux, x86, x86-64

Solution

In x86-64 there are 3 TLS entries, two of them accesible via FS and GS, FS is used internally by glibc (in IA32 apparently FS is used by Wine and GS by glibc).

Glibc makes its TLS entry point to a `struct pthread` that contains some internal structures for threading. Glibc usually refers to a `struct pthread` variable as `pd`, presumably for pthread descriptor.

On x86-64, `struct pthread` starts with a `tcbhead_t` (this depends on the architecture, see the macros `TLS_DTV_AT_TP` and `TLS_TCB_AT_TP`). This Thread Control Block Header, AFAIU, contains some fields that are needed even when there is a single thread. The DTV is the Dynamic Thread Vector, and contains pointers to TLS blocks for DSOs loaded via `dlopen()`. Before or after the TCB there is a static TLS block for the executable and DSOs linked at (program's) load time. The TCB and DTV are explained pretty well in Ulrich Drepper's TLS document (look for the diagrams in chapter 3).

Problem

On the x86-64 architecture, two registers have a special purpose: FS and GS. In linux 2.6.*, the FS register seem to be used to store thread-local information. - Is that correct? - What is stored at fs:0? Is there any C structure that describe this content? - What is then the use of GS?

Original source