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
版本中是已知的错误来源)。