最近在查一件很詭異的事.
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是什麼資料結構.