我不太明白你想要什么。然而,汇编程序序列(对于 ARMv6+ 和有能力的内核)是,
mrc p15, 0, rX, c13, c0, 2 @ get the user r/w register
这就是所谓的TPIDRURW在一些ARM手册中。您的 TLS 表/结构必须以此值(可能是指针)作为父级。使用mcr
更快,但如果你不设置,你也可以调用助手(见下文)HWCAP_TLS
在你的 ELF 中(可以在 Linux 支持的所有 ARM CPU 上使用)。
地址0xffff0fe8的意图seems您可以使用这 4 个字节,而不是直接使用上面的汇编器 (rX
== r0
)因为某些地方的某些机器可能会有所不同。
它取决于 CPU 类型。有一个入口-armv.S 中向量页 @0xffff0fe0 中的帮助程序 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/entry-armv.S?i#n1003;如果硬件不支持,则它位于进程/线程结构中。文档位于kernel_user_helpers.txt https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm/kernel_user_helpers.txt#n75
使用示例:
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);
}
您执行系统调用来设置 TLS 内容。clone
是一种设置线程上下文的方法。这线程信息 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/asm/thread_info.h保存线程的所有寄存器;它可能共享一个mm(内存管理或进程内存视图)与其他task_struct
。即,thread_info 有一个tp_value
对于每个创建的线程。
这里有一个讨论 http://www.redhat.com/archives/phil-list/2003-May/msg00054.htmlARM 实现。 ELF/nptl/glibc 和 Linux 内核都涉及(和/或搜索术语以进行更多调查)。系统调用为get_tls()
可能太昂贵了,当前的主线有一个向量页助手(由所有线程/进程映射)。
一些 glibc 源代码,tls-宏.h https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/arm/tls-macros.h;hb=HEAD, tlsdesc.c https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/arm/tlsdesc.c;hb=HEAD等。很可能完整/简洁的答案将取决于以下版本:
- 你的 ARM CPU。
- 你的 Linux 内核。
- 你的 glibc.
- 您的编译器(和标志!)。