linux記憶體布局學習

2021-06-21 03:22:36 字數 1588 閱讀 6185

linux系統中的程序總是以為自己是唯一的,那程序是如何被對映到記憶體中的呢?

以前總是覺得這些東西太高深,可望而不可及;

從現在開始,讓我們慢慢揭開這神秘的面紗。

典型的linux c程式記憶體布局,從低位址到高位址分別如下:

1. **段,即cpu要執行的程式**。

**段是可共享的,同乙份**在記憶體中只有乙份拷貝;

**段是唯讀的,應用程式應該無法訪問,否則系統可能會發出sigsegv這樣的signal。

2. 已經初始化的資料段,該段用來存放的全域性變數是已經初始化過的;

3. 未初始化的資料段,該段用來存放的全域性變數是沒有經過初始化的;

核心在執行程式前,會對未初始化的變數進行初始化。

4. 堆,用於程式執行時進行動態記憶體申請;

5. mmap記憶體對映區----這部分後面有機會再講;

6. 棧,用於函式呼叫時進行的區域性變數的分配。

可以通過cat /proc//maps來檢視程序大概的記憶體布局狀況,這個會很有用。

比如我們可以知道:

棧是從高位址到低位址延伸的;

共享庫在程序中的位置,如果我們要根據pc/lr來debug,這會很重要;

...

sh-3.2# cat /proc/25938/maps

00008000-00009000 r-xp 00000000 00:11 72         /basic/test_main

00010000-00011000 rwxp 00000000 00:11 72         /basic/test_main

00011000-00032000 rwxp 00000000 00:00 0          [heap]

40009000-4000a000 rwxp 00000000 00:00 0

40021000-4003e000 r-xp 00000000 fe:00 325        /lib/ld-2.12.2.so

40045000-40046000 r-xp 0001c000 fe:00 325        /lib/ld-2.12.2.so

40046000-40047000 rwxp 0001d000 fe:00 325        /lib/ld-2.12.2.so

400b4000-401d4000 r-xp 00000000 fe:00 309        /lib/libc-2.12.2.so

401d4000-401d6000 r-xp 00120000 fe:00 309        /lib/libc-2.12.2.so

401d6000-401d7000 rwxp 00122000 fe:00 309        /lib/libc-2.12.2.so

401d7000-401db000 rwxp 00000000 00:00 0

402c9000-402ca000 rwxp 00000000 00:00 0

beb7e000-beb9f000 rwxp 00000000 00:00 0          [stack]

ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]

sh-3.2#

Linux記憶體布局

變數名稱 說明num physpages 最高可用頁框的頁框號 totalram pages 可用頁框的總數量 min low pfn ram 中在核心映像後第乙個可用頁框的頁框號 max pfn 最後乙個可用頁框的頁框號 max low pfn 被核心直接對映的最後乙個頁框的頁框號 低位址記憶體 ...

Linux記憶體布局

我們先來看下linux記憶體布局,此圖比我之前寫的那篇文章寫的布局更詳細 在linux中,每乙個程序都被抽象為task struct結構體,稱為程序描述符,儲存著程序 各方面的資訊 例如開啟的檔案,訊號以及記憶體等等 然後task struct的乙個屬性mm struct管理著程序的所有虛擬記憶體,...

2Linux記憶體布局

變數名稱 說明 num physpages 最高可用頁框的頁框號 totalram pages 可用頁框的總數量 min low pfn ram 中在核心映像後第乙個可用頁框的頁框號 max pfn 最後乙個可用頁框的頁框號 max low pfn 被核心直接對映的最後乙個頁框的頁框號 低位址記憶體...