2023 09 21 19 16 [Linux] Musl libc 在 arm64 平台上 gettid() 的奇怪行為

最近在查一件很詭異的事.

call完clone3之後, 會出現不同pid,但是tid卻一樣的問題.

這兩個都是用getpid()和gettid()去取得.

但是跟/proc/[pid]/status裡面講的TGID和PID的值不同.

查老半天,因為是在apple macos m1 docker image alpine 3.18發生的.

從頭查到尾,才發現是裡面用的Musl libc造成的.

 

正常gnu libc的 gettid() 底下是會用 syscall(SYS_gettid) 去拿到.

Dump of assembler code for function gettid:
=> 0x0000007ff7f2d040 <+0>:  mov  x8, #0xb2                    // #178
   0x0000007ff7f2d044 <+4>:  svc  #0x0
   0x0000007ff7f2d048 <+8>:  ret
End of assembler dump.

而Musl libc 則是

Dump of assembler code for function gettid:
   0x0000fffff7f71424 <+0>:  mrs  x0, tpidr_el0
   0x0000fffff7f71428 <+4>:  ldur  w0, [x0, #-168]
   0x0000fffff7f7142c <+8>:  ret
End of assembler dump.

真正問題也算是clone這個syscall的side effect吧!
應該是el0那邊有存放一份tid,但是clone又讓記憶體共用.
從那邊拿到的tid就是原本parent tid.
只是gnu libc gettid()不會從那邊拿.

 

PS: 我還沒查el0指過去-168是什麼資料結構.