Нишка локални променливи и fs сегмент

Чета от локална променлива на нишка в моя код по този начин,

// tid_local is declared as __thread int tid_local;
long tid = tid_local

Разглеждайки разглобения код, видях нещо подобно, което подозирам, че е инструкцията, която присвоява tid чрез четене на tid_local.

movslq %fs:0xfffffffffffffffc,%rbx

Сега въпросът ми е дали това наистина може да бъде инструкцията, която прави това, тоест четене от локалната променлива на нишката и дали gcc винаги използва сегмента fs за съхраняване на локални променливи на нишката. Как трябва да работи това?


person MetallicPriest    schedule 05.01.2012    source източник


Отговори (2)


Да, това може да е правилната инструкция. От gcc ръководство:

-mtls-direct-seg-refs

-mno-tls-direct-seg-refs

Контролира дали TLS променливите могат да бъдат достъпни с отмествания от сегментния регистър на TLS (%gs за 32-бита, %fs за 64-бита) или дали трябва да се добави указателят на основата на нишката. Дали това е законно или не, зависи от операционната система и дали картографира сегмента, за да покрие цялата TLS област.

редактиране Ето една отлична връзка, предложена от @janneb в коментарите: http://www.akkadia.org/drepper/tls.pdf

person NPE    schedule 05.01.2012
comment
Но как трябва да работи това. Колко различни нишки имат различни fs сегменти? - person MetallicPriest; 05.01.2012
comment
@MetallicPriest: Е, всяка нишка има свой собствен набор от стойности на регистъра (за всички регистри, не само fs). - person NPE; 05.01.2012
comment
Относно регистрите, да знам, че всяка нишка си има свои. Но съм малко изненадан за fs. Предполагам, че fs сегментът не трябва да е много голям, в противен случай ще трябва да се запазва всеки път, когато се случи превключване на контекста. - person MetallicPriest; 05.01.2012
comment
@MetallicPriest: Сегментът не се запазва, запазва се стойността на регистъра, сочеща към сегмента. Всяка нишка има различна стойност от fs. - person NPE; 05.01.2012
comment
@MetallicPriest: Можете да прочетете как TLS работи на Linux на akkadia.org/drepper/tls.pdf - person janneb; 05.01.2012
comment
@aix, интересно, x86 архитектите са доста умни да измислят такава схема :)! - person MetallicPriest; 05.01.2012

Начинът, по който различните нишки могат да имат различни fs сегменти, се реализира чрез настройка на локални дескрипторни таблици (LDT) на базата на нишка. Когато възникне превключване на нишка, процесорът автоматично зарежда всеки дескриптор на сегмента „локален за нишка“ от съответния LDT. Можете да проверите дали случаят е такъв, като погледнете стойността на FS. Ако бит 3 е 1, тогава той използва LDT.

Пр. FS = 1B (което се оказва обичайният селектор "CS" за Win NT) е локален за нишка сегмент.

Разработвате го по следния начин:

Селекторът в двоичен код е

0000 0000 0001 1011

or

Индекс=0000 0000 0001 [12 бита] (2-ри запис в DT)

Таблица на дескриптори=1 [1 бита] (1 == локално, 0 == глобално)

RPL=011 [3 бита] (Искано ниво на привилегия = 3)

  • Алън
person Alan Carre    schedule 03.03.2014