Каковы реальные требования ELF TLS ABI для каждой арки процессора?

Ульрих Дреппербумага в локальном хранилище потоков описывается интерфейс TLS ABI для нескольких разных архитектур ЦП, но яЯ считаю его недостаточным в качестве основы для реализации TLS по двум причинам:

Он пропускает ряд важных арок, таких как ARM, MIPS и т. Д. (Включая кучу совершенно не относящихся к делу, таких как Itanium)Что еще более важно, он смешивает много деталей реализации с ABI, так чтоТрудно сказать, какие свойства требуются для взаимодействия, а какие являются лишь аспектами его реализации.

Например, единственными фактическими требованиями ABI для i386 являются:

%gs:0 указывает на указатель на себя.Основной исполняемый файлСегмент TLS, если таковой имеется, должен быть расположен с фиксированным (с помощью линкера, отрицательным) смещением от этого адреса.Все другие сегменты TLS для изначально загруженных библиотек должны иметь постоянные времени выполнения (т. Е. Одинаковые для каждого потока, но не обязательно одинаковые при разных запусках программы) относительно этого адреса (и динамический компоновщик должен иметь возможность заполнять перемещения с помощью эти смещения).___tls_get_addr а также__tls_get_addr функции должны существовать с правильной семантикой для поиска произвольных сегментов TLS.

В частности, наличие или расположение DTV являетсяне часть ABI, а также порядок / расположение сегментов TLS, кроме основной программы.s.

Кажется, что любая арка используетTLS вариант II " имеет примерно вышеупомянутые требования ABI. Но я нене понимаю требования "TLS вариант I " очень хорошо, и из чтения источников (в uClibc и glibc) кажется, что может быть даже несколько вариантов "вариант I ".

Есть ли какие-нибудь лучшие документы, на которые мне стоит обратить внимание, или кто-нибудь, знакомый с работой TLS, может объяснить мне требования ABI?

 Nominal Animal14 окт. 2012 г., 07:52
извините если яЯ спрашиваю очевидное, но вы проверилиGCC Поддержка TLS? Например,gcc-patches В списке рассылки, начиная с первого июня этого года, появилась тема о добавлении поддержки MIPS16 TLS (marc.info/?l=gcc-patches&м = 132586147826602). Люди компилятора кажутся гораздо более формальными в такого рода вещах, чем разработчики библиотеки C; они могли бы иметь лучшую формальную документацию.

Ответы на вопрос(1)

Решение Вопроса

Для любого варианта TLS,__tls_get_addr или другие специфичные для арки функции должны существовать и иметь правильную семантику для поиска любого объекта TLS, а относительное смещение между любыми двумя сегментами TLS должно быть постоянной времени выполнения (одинаковое смещение для каждого потока).

Для варианта TLS II (i386 и т. Д.)регистр указателя потока (который на самом деле не может быть регистром, но, возможно, какой-то механизм,%gs:0 или даже ловушка в пространство ядра; хотя для простоты пустьпросто называйте это регистром) очковтолько после конца сегмента TLS для основного исполняемого файла, где "только что конец включает округление до следующего кратного сегмента TLS 'выравнивание.

Для варианта TLS I "регистр указателя потока указывает на некоторое фиксированное смещение отначало сегмента TLS для основного исполняемого файла. Это смещение зависит от арки. (Это было выбрано для некоторых уродливых архитектур RISC, чтобы максимизировать количество TLS, доступного через 16-битные смещения со знаком, что кажется мне совершенно бесполезным, поскольку компилятор не может знать, поместится ли смещенное смещение в 16 бит и, следовательно, должен всегда генерируйте более медленный, больший 32-битный код с использованием инструкций загрузки-добавления / добавления).

Насколько я могу судить, ничего о TCB, DTV и т. Д. Не является частью ABI в том смысле, что приложениям не разрешен доступ к этим структурам, а также расположение любого сегмента TLS, кроме основного исполняемого файла ».часть ABI. В обоих вариантах I и II имеет смысл хранить внутреннюю информацию о реализации для потока с фиксированным смещением от "регистр указателя потокав любом случае безопасно избегает перекрытия сегмента TLS.

Ваш ответ на вопрос