我想了解我的嵌入式Linux應用程序的內存使用情況。/proc/pid/maps實用程序/文件似乎是查看詳細信息的好資源。不幸的是我不明白所有的欄目和條目。瞭解Linux/proc/id/maps
proc/pid/maps utility/file是否有很好的資源/文檔?
匿名inode 0條目是什麼意思?這些似乎是一些較大的內存部分。
我想了解我的嵌入式Linux應用程序的內存使用情況。/proc/pid/maps實用程序/文件似乎是查看詳細信息的好資源。不幸的是我不明白所有的欄目和條目。瞭解Linux/proc/id/maps
proc/pid/maps utility/file是否有很好的資源/文檔?
匿名inode 0條目是什麼意思?這些似乎是一些較大的內存部分。
在/proc/$PID/maps
每行描述進程或線程的連續虛擬存儲器的區域。每一行都有以下字段:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
mprotect
系統調用進行更改。mmap
),則這是映射開始處文件的偏移量。如果內存未從文件映射,則只是0.[heap]
,[stack]
或[vdso]
。 [vdso]
代表虛擬動態共享對象。它被系統調用用來切換到內核模式。 Here's a good article about it.您可能會注意到很多匿名區域。這些通常由mmap
創建,但不附加到任何文件。它們被用於很多其他的東西,比如共享內存或未在堆中分配的緩衝區。例如,我認爲pthread庫使用匿名映射區域作爲新線程的堆棧。
內存映射不僅用於將文件映射到內存中,而且還是從內核請求RAM的工具。這些都是那些inode的0條目 - 您的堆棧,堆,BSS段和更
proc(5)
mmap(2)
「深入理解Linux內核」 9.3。內存區域; 16.2。存儲器映射
「理解的Linux虛擬內存管理器」 4.4存儲器區
請檢查: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下,沒有給出路徑名的字段。
是的,pthreads爲堆棧分配8Mb塊,其中有一個較小的部分用於堆棧溢出檢測(我認爲)。因此,默認情況下創建的每個pthread分配一個8Mb的inode 0內存區域和一個4Kb的inode 0區域。 – simon 2009-09-10 17:13:32
因此,在你的例子中'gpm'是從一開始就在一些虛擬地址映射二進制文件,用ELF頭等。加載程序是不是應該解析ELF頭並映射單個部分,而不是整個文件? – 2015-09-23 09:41:37