加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – ARM上TLS的代码序列

发布时间:2020-12-14 02:14:04 所属栏目:Linux 来源:网络整理
导读:ELF Handling For Thread-Local Storage文档为各种体系结构提供了各种模型(本地exec /初始exec /一般动态)的汇编序列.但不是ARM – 我能在哪里看到ARM的代码序列吗?我正在编写一个编译器,并希望生成能够与平台链接器(程序和动态)一起正常运行的代码. 为清楚
ELF Handling For Thread-Local Storage文档为各种体系结构提供了各种模型(本地exec /初始exec /一般动态)的汇编序列.但不是ARM – 我能在哪里看到ARM的代码序列吗?我正在编写一个编译器,并希望生成能够与平台链接器(程序和动态)一起正常运行的代码.

为清楚起见,我们假设一个ARMv7 CPU和一个非常新的内核和glibc(比如说3.13 / 2.19),但是如果这很容易解释,我也会对旧的hw / sw需要改变什么感兴趣.

解决方法

我不太明白你想要什么.但是,汇编程序序列(对于ARMv6和一个有能力的内核)是,

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

这在一些ARM手册中称为TPIDRURW.您的TLS表/结构必须是此值的父级(可能是指针).使用mcr更快,但如果没有在ELF中设置HWCAP_TLS(可以在Linux支持的所有ARM CPU上使用),也可以调用帮助程序(见下文).

地址0xffff0fe8的意图似乎是你可以使用那些4字节而不是直接使用上面的汇编程序(rX == r0),因为某些机器可能会有所不同.

它取决于CPU类型.有一个helper in the vector page @0xffff0fe0 in entry-armv.S;如果硬件不支持它,它在进程/线程结构中.文档于kernel_user_helpers.txt

用法示例:

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 = %pn",tls);
}

你做一个系统调用来设置TLS的东西. clone是一种设置线程上下文的方法. thread_info保存一个线程的所有寄存器;它可以与其他task_struct共享mm(内存管理或进程内存视图).即,thread_info为每个创建的线程都有一个tp_value.

ARM实现的Here is a dicussion. ELF / nptl / glibc和Linux内核都涉及(和/或搜索术语以进行更多研究). get_tls()的系统调用可能过于昂贵,当前主线有一个矢量页面助手(由所有线程/进程映射).

一些glibc源,tls-macros.h,tlsdesc.c等.很可能完整/简明的答案取决于版本,

>您的ARM CPU.>你的Linux内核.>你的glibc.>您的编译器(和标志!).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读