Otázka:
Co znamená tento vzor paměti ukazující z lokálního úložiště vlákna?
samuirai
2013-10-17 04:17:23 UTC
view on stackexchange narkive permalink

Aplikace, kterou momentálně hledám, používá vlákna a přistupuje k něčemu přes místní úložiště vláken. Je kompilován s Visual C ++ (pravděpodobně 6.0).

První otázkou by bylo, kde najdu více informací, co obsahuje místní úložiště vláken? Dosud jsem tomu úplně nerozuměl.

Toto je kód assembleru, kde aplikace načte hodnotu z lokálního úložiště vlákna.

  MOV EAX, 0MOV ECX, DWORD PTR FS: [0x2C] MOV EDX, DWORD PTR DS: [ECX + EAX * 4] MOV EAX, DWORD PTR DS: [EDX + 4]  

EAX je ukazatel, který ukazuje v následující oblasti paměti, která má speciální vzor.

memory pattern

V zásadě to vypadá takto:

  52P-> ... P-> ... 552P-> ... P-> ... 552P-> ... P-> ... 5  

Napadlo mě, jestli je to nějaký druh standardní datové struktury.

Jeden odpovědět:
Igor Skochinsky
2013-10-17 05:34:51 UTC
view on stackexchange narkive permalink

Oblast, na kterou se díváte, je něco specifického pro program; není součástí struktur systému Windows.

Hodnota na fs: [0x2C] je pole TLS - pole ukazatelů na vláknové bloky proměnných někde v paměti programu . Takto vypadá typický přístup TLS k proměnné __declspec (vlákno) :

  mov eax, DWORD PTR __tls_index; načíst index TLS pro aktuální threadmov ecx, DWORD PTR fs: __ tls_array; načíst ukazatel pole TLS (FS: [2Ch]) mov edx, DWORD PTR [ecx + eax * 4]; načíst ukazatel na blok TLS pro aktuální threadmov eax, DWORD PTR [edx + 4h]; načíst proměnnou vlákna na offsetu 4 v bloku TLS  

(Na proměnnou __tls_index odkazuje TlsIndex (aka Pole AddressOfIndex ) v adresáři PE TLS.)

Skutečný obsah bloku TLS je na programu - OS pouze zajistí, aby každé vlákno dostalo samostatnou kopii původního Šablona TLS a umístí na ni ukazatel v poli TLS. Chcete-li zjistit, co je v tomto paměťovém bloku, musíte zjistit, jak jej program používá.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...