2009-09-09 50 views
114

我想了解我的嵌入式Linux應用程序的內存使用情況。/proc/pid/maps實用程序/文件似乎是查看詳細信息的好資源。不幸的是我不明白所有的欄目和條目。瞭解Linux/proc/id/maps

proc/pid/maps utility/file是否有很好的資源/文檔?

匿名inode 0條目是什麼意思?這些似乎是一些較大的內存部分。

回答

187

/proc/$PID/maps每行描述進程或線程的連續虛擬存儲器的區域。每一行都有以下字段:

address   perms offset dev inode pathname 
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
  • 地址 - 這是在進程的地址空間的起始和區域的結束地址
  • 權限 - 介紹如何在區域頁面可以被訪問。有四種不同的權限:讀取,寫入,執行和共享。如果讀取/寫入/執行被禁用,將出現' - '而不是'r'/'w'/'x'。如果一個區域不共享,它是私人的,所以會出現'p'而不是's'。如果進程嘗試以不允許的方式訪問內存,則會生成分段錯誤。權限可以使用mprotect系統調用進行更改。
  • 偏移量 - 如果區域是從文件映射的(使用mmap),則這是映射開始處文件的偏移量。如果內存未從文件映射,則只是0.
  • 設備 - 如果區域是從文件映射的,則這是文件所在的主要和次要設備編號(以十六進制表示)。
  • inode - 如果區域是從文件映射的,則這是文件編號。
  • pathname - 如果區域是從文件映射的,則這是該文件的名稱。此字段對於匿名映射區域爲空白。還有特殊區域,如[heap][stack][vdso][vdso]代表虛擬動態共享對象。它被系統調用用來切換到內核模式。 Here's a good article about it.

您可能會注意到很多匿名區域。這些通常由mmap創建,但不附加到任何文件。它們被用於很多其他的東西,比如共享內存或未在堆中分配的緩衝區。例如,我認爲pthread庫使用匿名映射區域作爲新線程的堆棧。

+4

是的,pthreads爲堆棧分配8Mb塊,其中有一個較小的部分用於堆棧溢出檢測(我認爲)。因此,默認情況下創建的每個pthread分配一個8Mb的inode 0內存區域和一個4Kb的inode 0區域。 – simon 2009-09-10 17:13:32

+0

因此,在你的例子中'gpm'是從一開始就在一些虛擬地址映射二進制文件,用ELF頭等。加載程序是不是應該解析ELF頭並映射單個部分,而不是整個文件? – 2015-09-23 09:41:37

8

內存映射不僅用於將文件映射到內存中,而且還是從內核請求RAM的工具。這些都是那些inode的0條目 - 您的堆棧,堆,BSS段和更

18

proc(5)

mmap(2)

「深入理解Linux內核」 9.3。內存區域; 16.2。存儲器映射

「理解的Linux虛擬內存管理器」 4.4存儲器區

0

請檢查:http://man7.org/linux/man-pages/man5/proc.5.html

address   perms offset dev inode  pathname 
00400000-00452000 r-xp 00000000 08:02 173521  /usr/bin/dbus-daemon 

地址字段是該 映射佔用進程的地址空間。

的燙髮字段是一組權限:

r = read 
w = write 
x = execute 
s = shared 
p = private (copy on write) 

的偏移字段中的偏移文件/不管;

dev是設備(major:minor);

inode是該設備上的inode.0指示沒有inode與memoryregion關聯,就像BSS(未初始化的數據)一樣。

路徑名字段通常是支持 映射的文件。對於ELF文件,您可以通過查看ELF 程序頭文件(readelf -l)中的偏移量字段,輕鬆地與偏移量字段配合使用 。

在Linux 2.0下,沒有給出路徑名的字段。