Linux 核心原理之記憶體系統

2021-10-07 05:42:21 字數 892 閱讀 7408

虛擬位址空間

實體地址空間

程序向核心申請記憶體需要位址連續的記憶體塊,linux如何處理來盡可能保持記憶體塊的連續的呢?答案buddy system。來看下buddy system記憶體位址分配策略。

首先假設系統一開始有共16個位元組的記憶體,然後被分出去8 byte。狀態圖如下:

可以看到左邊陣列中存放的都是等大的塊,記憶體不連續的等大塊以鍊錶的方式存放在相應的索引處。

如果這個時候,有個2位元組的請求,剩餘的6個位元組就會被分別放在2

12^1

21和2

22^2

22處。當記憶體**時,核心會在等大塊中,發現可以合併的記憶體塊,並放到更上層。比如上面的8個位元組記憶體被釋放時,兩個8位元組的記憶體塊會被發現是連續的,合併放到2

42^4

24位置。當記憶體被頻繁的申請和釋放,buddy system就會有記憶體碎片問題。程序要申請一塊記憶體,剩餘記憶體總量是夠的,但是記憶體位址不連續。

下面簡單舉個記憶體碎片的例子:

初始狀態:

分配2 byte:

, ,

申請5 byte

, (記憶體碎片),

4gb虛擬位址空間被分成使用者空間和核心空間兩部分。

**段,資料段和bss段是連續存放的。**段放機器碼,資料段放已初始化的靜態變數或全域性變數。bss段包含未初始化全域性變數。(可以使用size檢視編譯程式的記憶體區域如size /bin/ls

區域位址區間

zone_dma

16mzone_normal

896m

zone_highmem

896m+

Linux核心之記憶體管理

1 核心把物理頁作為記憶體管理的基本單位 處理器的最小可定址單位一般為字 記憶體管理單元 mmu,管理記憶體並把虛擬位址轉換為實體地址的硬體 通常以頁為單位進行處理 2 不同體系結構支援的頁大小不盡相同,有些還支援多種,大多數32體系結構支援4kb的頁,64位體系結構一般支援8kb頁 3 核心用st...

作業系統原理之記憶體 一

在彙編指令中,我們有時會看到如下指令 text entry 入口 call 40 main 那麼這裡的40指向的是記憶體中的哪個位置呢?是記憶體的實際位址嗎?顯然,如果是實際位址的話我們的程式必須被裝載在記憶體0位址處,但這樣做肯定是存在問題的,一方面,如果這樣的話每個程式都要放到0位址處 另一方面...

作業系統原理之記憶體 一

在彙編指令中,我們有時會看到如下指令 text entry 入口 call 40 main 那麼這裡的40指向的是記憶體中的哪個位置呢?是記憶體的實際位址嗎?顯然,如果是實際位址的話我們的程式必須被裝載在記憶體0位址處,但這樣做肯定是存在問題的,一方面,如果這樣的話每個程式都要放到0位址處 另一方面...