我在Android共享库中有以下说明:

MRC p15, 0, R3,c13,c0, 3 
LDR R3, [R3,#4] 
MOV R0, #0 
STR R0, [R3,#0xC]


根据ARM文档:


读取或编写线程和进程ID寄存器对处理器状态或操作没有影响。这些寄存器提供OS
支持,必须由OS管理。


很好,但是在Android或ARM Linux中该寄存器值的实现是什么?

从代码中尝试读取线程和进程ID寄存器值作为结构,并读取偏移量为4的某些字段。此字段是指向结构本身的指针,并将0写入偏移量为12的字段。

因此,寄存器值肯定不是pthread_t,因为根据Android源代码,偏移量为4的pthread_t字段是unsigned int而不是指向任何结构的指针。

有人知道在哪里可以找到Android ARM中MRC c13::c0::3返回的结构的定义吗?

#1 楼

以防万一其他人也会遇到相同的问题,在阅读了许多Android资源和实际应用程序的内存转储后,我发现:



MRC c13::c0::3返回指向结构的指针包含2个单词。
第二个世界与pthread_self返回的值相同(即它是当前线程的pthread_t)。

pthread_t实际上是指向pthread_internal_t结构的指针,您可以在此处查看其定义例如https://android.googlesource.com/platform/bionic.git/+/refs/heads/android10-release/libc/bionic/pthread_internal.h

根据定义,字段偏移12(0xC)是pid_t cached_pid_

因此,此代码将缓存的pid值设置为0。似乎需要强制getpid读取实际的pid值而不是使用缓存的值(PID缓存在某些glibc版本中是已知的错误来源)。