2015-04-23 23 views
5

Das Dokument ELF Handling For Thread-Local Storage gibt Assemblysequenzen für die verschiedenen Modelle (lokale Exec/initial exec/allgemeine Dynamik) für verschiedene Architekturen. Aber nicht ARM - kann ich irgendwo solche Code-Sequenzen für ARM sehen? Ich arbeite an einem Compiler und möchte Code generieren, der mit den Plattform-Linkern (sowohl Programm als auch dynamisch) ordnungsgemäß funktioniert.Codefolgen für TLS auf ARM

Nehmen wir eine ARMv7 CPU und einen ziemlich neuen Kernel und glibc (sagen wir 3,13+/2,19+), aber ich würde auch interessieren, was sich für ältere hw/sw ändern muss, wenn das leicht zu erklären ist .

+1

Ich würde einige Disassemblierung (http://goo.gl/TPiQCX) dann verwenden diese zu google. https://gcc.gnu.org/ml/gcc-patches/2005-03/msg02375.html http://sourcery.mentor.com/public/publications/RFC-TLSDESC-ARM.txt http: // lxr. free-electronics.com/source/arch/arm/include/asm/tls.h – auselen

+0

Möglicherweise ein Duplikat von http: // stackoverflow.com/questions/12878698/was-sind-die-real-elf-tls-abi-anforderungen-für-jeden-cpu-arch, aber das hat keine richtige antwort. – unixsmurf

+0

@unixsmurf Ich denke 'R' Antwort auf seine Frage und wie bekomme ich das 'Thread-Register' unter ARM-Linux diese Frage beantworten? –

Antwort

2

Ich verstehe nicht genau, was Sie wollen. Jedoch sind die Assembler-Sequenzen (für ARMv6 + und ein fähiger Kern) sind,

mrc p15, 0, rX, c13, c0, 2 @ get the user r/w register 

Diese TPIDRURW in einigen ARM-Handbüchern genannt wird. Ihre TLS-Tabellen/-Struktur muss von diesem Wert (wahrscheinlich ein Zeiger) parented sein. Die Verwendung der mcr ist schneller, aber Sie können auch den Helper aufrufen (siehe unten), wenn Sie HWCAP_TLS nicht in Ihrem ELF setzen (das auf allen von Linux unterstützten ARM-CPUs verwendet werden kann).

Die Absicht Adresse 0xffff0fe8 scheint zu sein, dass Sie diesen 4-Byte anstelle der Verwendung der oben Assembler direkt mit (rX == r0) als vielleicht anders ist irgendwo für einige Maschinen verwenden können.


Sie hängt vom CPU-Typ ab. Es gibt eine helper in the vector page @0xffff0fe0 in entry-armv.S; Es ist in der Prozess/Thread-Struktur, wenn die Hardware es nicht unterstützt. Die Dokumentation ist in kernel_user_helpers.txt

Anwendungsbeispiel:

typedef void * (__kuser_get_tls_t)(void); 
#define __kuser_get_tls (*(__kuser_get_tls_t *)0xffff0fe0) 

void foo() 
{ 
    void *tls = __kuser_get_tls(); 
    printf("TLS = %p\n", tls); 
} 

Sie haben eine syscall die TLS Sachen zu setzen. clone ist eine Möglichkeit, einen Threadkontext einzurichten. Die enthält alle Register für einen Thread; es kann einen mm (Speicherverwaltung oder Prozessspeicheransicht) mit anderen teilen task_struct. Dh die thread_info hat einen tp_value für jeden erstellten Thread.

Here is a dicussion der ARM-Implementierung. ELF/nptl/glibc und Linux Kernel sind alle beteiligt (und/oder Suchbegriffe, um mehr zu untersuchen). Der Syscall für get_tls() war wahrscheinlich zu teuer und die aktuelle Hauptleitung hat einen Vektorseitenhelfer (abgebildet von allen Threads/Prozessen).

Einige glibc Quelle, tls-macros.h, tlsdesc.c usw. Die meisten wahrscheinlich eine vollständige/prägnante Antwort auf die Version abhängen,

  1. Ihre ARM-CPU.
  2. Ihr Linux-Kernel.
  3. Ihr glibc.
  4. Ihr Compiler (und Flags!).
+0

Die ** TCB ** in der PDF, auf die Sie verweisen, ist die 'thread_info'-Struktur unter ARM-Linux. Oh, und natürlich ist 'ld' (der Loader) beteiligt. CP15 c13, c0 wird auf ARMv6 + verwendet. Es gibt drei Register. Benutzer r/w, Benutzer schreibgeschützt und privilegiert (nur Kernel); natürlich muss der Kernel in der Lage sein, alle von ihnen zu schreiben. Der ARM Linux verwendet nur zwei (wie die tp_values); Außerdem sind die ** anderen ** Assembler-Sequenzen Ihrer Fantasie überlassen, wenn Sie dies auf dem ARM implementieren. Ihre Frage ist mir nicht ganz klar. Möchten Sie den * glibc * Loader erneut verwenden oder den gesamten Benutzerbereich selbst schreiben? –

+0

Danke für die Antwort. Es war die mrc-Anweisung, die mich am verwirrendsten war, denke ich. Und ich vergesse immer das Chaos, das ARM CPU-Versionen ist. Ich werde die Frage bearbeiten und dann können Sie vielleicht die Antwort bearbeiten. – mwhudson