看板 LinuxDev 關於我們 聯絡資訊
在看 /proc/[pid]/maps時 有些process maps第一行pathname是空的 文件 http://man7.org/linux/man-pages/man5/proc.5.html 表示是mmap設定成 MAP_ANONYMOUS 請問什麼時候會這樣用 /proc/[pid]/exe是 execution binaries的link 文件說可以被dereferenced 請問什麼樣的程式會dereferenced 或是連結失敗 例如fork subprocess? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 133.34.143.187 ※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1510256568.A.142.html
galic: 當你需要一塊連續的記憶體空間 而且是0填滿的(zero-filled) 11/10 09:55
galic: 有些library alloc()系列函式底層實作就是用MAP_ANONYMOUS 11/10 09:56
galic: 另外 dereferenced 你可能誤會意思了 11/10 09:56
galic: 他跟C的 "*" dereference operator 的概念類似 11/10 09:57
galic: symbolic link看作是pointer 所以這裡的意思是當你去讀exe 11/10 09:57
galic: 不是讀到exe這個symbolic link 而是exe refer的對象 11/10 09:58
galic: 也就是那個可執行的binary檔 11/10 09:58
galic: 但我記得procfs在/exe的實作上不是真的symbolic link 11/10 10:02
galic: 但結果有87%像就是了... 就跟你不用MAP_ANONYMOUS 但是fd指 11/10 10:02
galic: 向/dev/zero 也是有87%像 11/10 10:03
cklonger: 請問fork的子程序 exe會是 空的嗎 11/10 18:10
galic: 這問題好難... exe其實是印mm_struct的exe_file 11/10 20:33
galic: exe會空的情況就是沒有mm(memory descriptor) 11/10 20:33
galic: 而沒有mm的 通常都是kernel thread 因為kernel thread都run 11/10 20:34
galic: 在同一個kernel address space中,所以不需要mm 11/10 20:35
galic: 說「通常」 是因為還有一種情況是mm已經被release 11/10 20:35
galic: 什麼情況mm會被release但是process還活著?? ->zombie 11/10 20:36
galic: 所以我猜答案是kernel thread和zombie process都沒有exe 11/10 20:36
galic: 再把fork加進來 kernel thread fork出去的task 也都沒有mm 11/10 20:37
galic: 如果是一般有mm的task, fork()我記得會dup mm, 所以exe會跟 11/10 20:39
galic: parent一樣,直到exec()的時候才會去改mm裡面的exe_file 11/10 20:39
galic: 但是child如果變成zombie 又會變成沒有exe 11/10 20:40
galic: 講太複雜了 你的答案是:「有可能」 11/10 20:44
cklonger: 非常感謝 11/10 20:49
cklonger: 再請問zombie 有辦法 被wake up嗎 11/10 20:52
galic: 不行 zombie的memory已經被release 所以才叫zombie 11/10 20:58