虛擬位址空間
實體地址空間
程序向核心申請記憶體需要位址連續的記憶體塊,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位址處 另一方面...