Доступ к TIB в Win32

Углубляемся в реализацию функций Win32 API, которые работают с TIB, например:

  • Функции доступа TLS: TlsAlloc, TlsFree, TlsSetValue, TlsGetValue
  • GetLastError, SetLastError
  • подсистема обмена сообщениями: GetMessage, PeekMessage и др.

выясняется, что все они обращаются к TIB (иногда называемому TEB), читая содержимое селектора fs:[0x18].

OTOH в этом нет необходимости, поскольку регистр fs напрямую указывает на него. Согласно этой статье и тому, что я вижу на практике, fs register содержит адрес в начале структура TIB, тогда как при смещении 0x18 она имеет указатель на себя.

Что могло быть причиной косвенного доступа к TIB?


person valdo    schedule 01.04.2012    source источник


Ответы (1)


Любая инструкция, использующая FS, требует переопределения, которое добавляет байт к инструкции (и обычно требует языка ассемблера для его использования). Указатель на FS:18 (по крайней мере, если память обслуживает правильно) основан на DS, поэтому его можно использовать без переопределения, сохраняя байт, когда он используется, и (что наиболее важно для многих людей) можно использовать непосредственно с более высокого уровня язык, такой как C или C ++, вместо того, чтобы требовать язык ассемблера.

person Jerry Coffin    schedule 01.04.2012
comment
большинство компиляторов в наши дни имеют встроенные функции для доступа к сегментам FS / GS (см. _1 _ / _ 2_ на MSVC), поэтому последний пункт в наши дни не так применим. - person Necrolis; 01.04.2012
comment
Итак, вы говорите, что TIB содержит указатель на самого себя, поскольку член должен обеспечивать более короткие инструкции и для языков более высокого уровня? Звучит очень странно ... - person valdo; 01.04.2012