2012-12-12 24 views
2

我的努力的細節如下,它們僅與我的問題部分相關:嵌入式linux:在/ proc/pid/maps中首次偏移錯誤?

在內核版本2.6.37.6的嵌入式Linux(arm)上的/ proc/pid/maps中,第一個行(可執行文件本身的代碼段)似乎是錯誤的。

我總是看到像的行:

00008000-00061000 R-XP 00000000 00:10 8073509 MYPROG

(範圍是在過程中的地址的地址空間,權限之後的數被認爲是文件的偏移量)

但是,實際的偏移似乎是0x8000 - 至少,使用這個假設的解釋看起來更可信。 nm顯示myprog在0x8000之前沒有代碼,所以這也是有道理的。

有人能給我一個指向我可以找到更多關於這個?我找不到任何東西。

我在做什麼:我寫了一個工具來解釋由mtrace()生成的日誌,查找可能的內存泄漏,並將它們追溯到分配數據的代碼。對於後一步,我從日誌中獲取指令指針,從/ proc/pid/maps的運行時映射中查找它,以查找所涉及的可執行文件或庫,並使用它們的nm-map來查找實際的函數做分配。

對於除了可執行文件本身以外的所有內容,這種工作方式非常有用。

回答

1

/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 - 如果區域是從文件映射的,則這是該文件的名稱。此字段對於匿名映射區域爲空白。還有一些特殊區域,名稱如[堆],[堆棧]或[vdso]。 [vdso]代表虛擬動態共享對象。它被系統調用用來切換到內核模式。 Here's a good article about it.

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