Linux
/proc/pid/maps 中的共享庫映射
為什麼
/proc/pid/maps
同一庫包含幾條記錄?這是一個例子:7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
這是什麼意思 ?
這四個記錄具有不同的權限,因此它們不能合併。
- 該
r-xp
條目描述了一塊可執行記憶體(x
權限標誌)。這就是程式碼。- 該
r--p
條目描述了一塊僅可讀的記憶體(r
權限標誌)。那是靜態數據(常量)。- 該
rw-p
條目描述了一塊可寫的記憶體(w
權限標誌)。這是用於庫的全域變數。- 該
---p
條目描述了一塊沒有任何權限(或映射到它的任何記憶體)的地址空間。所有都是私有的(
p
標誌),這意味著如果一個程序修改了一個頁面(這僅適用於可寫部分),該頁面將被複製(copy-on-write),而其他程序將看不到任何更改。最後一個條目是在某些情況下由 GNU 連結器顯式插入的程式碼段和數據段之間的間隙。這個差距的目的是確保程式碼(可在使用相同庫的程序之間共享)和可寫數據(不可共享)永遠不會在同一頁面中。間隙的大小為 2MB,因為這是 Linux 在您的體系結構 (amd64) 上使用的最大頁面大小¹。請參閱linux 中看似不可用的記憶體映射的目的是什麼?更多細節。
¹大多數頁面為 4kB,這是“正常”頁面大小。但是可能存在使用較少 MMU 間接定址的頁面,這會稍微快一些,但會浪費大量空間,除非應用程序實際上使用了非常大的記憶體塊。Linux 將這些巨大的頁面稱為。
未映射差距的來源和更多資訊:為什麼 gnome-panel 使用 290MB?通過 RJK。另請參閱Linux 核心文件中的條目
/proc/PID/maps
,了解 Linux /proc/id/maps和/proc/$pid/maps在 Stack Overflow上的 x86_64 linux 上顯示沒有 rwx 權限的頁面。