Kernel
核心 mmap 操作的記憶體大小
我對 Linux mmap 文件到主記憶體的方式感興趣(在我的上下文中它用於執行,但我猜 mmap 過程對於寫入和讀取也是相同的)以及它使用的大小。
所以我知道 Linux 使用頁面大小通常為 4kB 的分頁(在核心中哪裡可以找到這個大小?)。但這對於分配的記憶體究竟意味著什麼:假設您有一個大小為幾千字節的二進製文件,假設為 5812B 並執行它。核心中發生了什麼:它是否分配了 2*4kB 然後將 5812B 複製到這個空間中,在第 2 頁浪費了 >3KB 的主記憶體?
如果有人知道核心原始碼中定義頁面大小的文件,那就太好了。
我猜我的第二個問題也很簡單:我假設 5812B 作為文件大小。對嗎,這個大小只是取自 inode 嗎?
執行檔的大小與記憶體大小之間沒有直接關係。以下是執行二進製文件時發生的情況的快速概述:
- 核心解析文件並將其分成幾個部分。有些部分在單獨的頁面中直接載入到記憶體中。有些部分根本沒有載入(例如調試符號)。
- 如果執行檔是動態連結的,核心呼叫動態載入器,載入所需的共享庫並根據需要進行連結編輯。
- 程序開始執行它的程式碼,通常它會請求更多的記憶體來儲存數據。
有關可執行格式、連結和可執行載入的更多資訊,您可以閱讀John R. Levine 的Linkers and Loaders。
在一個 5kB 的執行檔中,除了標頭之外,很可能所有內容都是需要載入到記憶體中的程式碼或數據。可執行程式碼至少有一頁,也許兩頁,然後至少有一頁用於堆棧,可能是一頁或堆(其他數據),加上共享庫使用的記憶體。
在 Linux 下,您可以使用
cat /proc/$pid/maps
. 格式記錄在proc(5)
手冊頁中;另請參閱了解 Linux /proc/id/maps。