2012-05-15 24 views
1

我正在編寫一個內核模塊,它將接受用戶進程ID(PID)作爲輸入並轉儲該用戶進程的所有地址空間,如堆​​棧,堆段。使用來自內核模塊的用戶進程的堆大小

我把mm->start_brk作爲堆的開始,mm->brk作爲堆的結束,然後我看到,即使用戶進程並沒有使用33頁,堆的大小顯示爲33頁 (mm->brk - mm->start_brk)。 (這我使用/proc/pid/maps驗證)。堆棧的行爲也類似。

所以有什麼辦法可以找到真正使用堆從mm->start_brk盯着,這樣我就只能轉儲使用堆。

回答

2

進程可以使用brkmmap分配內存。後者不會改變堆,但分開分配。

mm->mmap是由mmap創建的映射的鏈接列表。

+0

謝謝ugoren,但問題是,我傾倒使用我的內核模塊的用戶進程的堆內存。我用於測試的用戶進程只做了幾個字節的malloc。但從內核模塊我可以看到內核在第一次給大約32頁(33 * 4K)的堆內存(cat/proc/pid/maps alsow會解釋這一點)。因爲我的測試用戶進程只使用了幾個字節,其他都是零。所以我只是想找到正確使用的堆區域。不是mm-> brk - mm-> start_brk – Dhyan

+1

內核不知道進程管理堆的方式。如果它向內核請求32頁,那麼就內核而言,它有32頁。您可能會檢查哪些映射到物理內存 - 從未觸摸過的頁面將不會被映射。 – ugoren

+0

我的測試progarm就像下面做10字節的malloc一樣,當我做這個程序的cat/proc//maps時,我看到它的堆大小爲33頁。那麼這意味着當exec brk將使用默認的33頁調用? -------------------------------------------- include int main( ) { char * ptr; 而(1) { ptr = malloc(10); free(ptr); } } cat/proc/pid/maps 082f4000-08315000 rw-p 00000000 00:00 0 [堆] – Dhyan

相關問題