linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)
一、linux的內存布局
1、32位模式下內存的經典布局?
圖1
32位模式下內存經典布局
?
注:這種內存布局模式是linux內核2.6.7以前的默認內存布局形式
說明:(1)在32的機器上,loader將可執行文件的各個段次依次載入到從0x80048000(128M)位置開始的空間中。程序能夠訪問的最后地址是0xbfffffff(3G)的位置,3G以上的位置是給內核使用的,應用程序不能直接訪問。
(2)內存布局從低地址到高地址依次為:txet段、data段、bss段、heap、mmap映射區、stack堆棧區。
(3)?heap和mmap是相對增長的,也就意味著heap只有1G的虛擬地址空間可供使用。?
(4)?stack區域不需要映射的,用戶可以直接訪問該區域。這也是利用堆棧溢出進行攻擊的基礎。
2、32位模式下內存的默認布局?
圖2
32位模式下內存的默認布局
注:這種內存布局是linux內核2.6.7之后32位機器的默認內存布局方式。
說明:(1)這種內存布局方式加入了幾個Random
offset的隨機偏移,這樣的話內存溢出的攻擊就不會那么容易了。
(2)
?棧是自頂向下擴展的,但是棧是有邊界的棧大小就有了限制(linux小t乃下可以使用ulimit
-s
命令進行查看其大小)。堆是自底向上擴展的,mmap映射區自頂向下擴展。故mmap和heap是相對擴展的,直至消耗盡虛擬地址空間中的剩余區域,這種結構便于C運行庫使用mmap映射區和堆進行內存分配。
3、?64位模式下內存的默認布局
圖3
64位模式下內存的默認布局
說明:這種內存布局方式沿用的32位模式下內存的經典布局,但是棧和mmap的映射區域不再是從一個固定的地方開始,每次啟動時的值都不一樣。這樣一來,使得使用緩沖區溢出攻擊變得更加困難。
?二、操作系統內存分配的相關函數
1、總括?
heap和mmap映射區域是可以提供給用戶程序使用的虛擬內存空間,獲得該區域的內存的操作有:?
(1)對于heap操作,操作系統提供了brk()系統調用,c運行庫提供了sbrk()庫函數。
?
(2)對于mmap映射區的操作,操作系統提供了mmap()和munm()系統調用。
(3)linux內存管理的基本思想:內存延遲分配。即只有在真正訪問一個地址的時候才建立這個地址的物理映射。linux內核在用戶申請內存的時候,只是給它分配了一個虛擬地址,并沒有分配實際的物理地址,只有當用戶使用這塊內存的時候,內核才會分配具體的物理地址給用戶使用。
2、heap操作的相關函數?
(1)brk()是系統調用、sbrk()是庫函數。c語言的動態內存分配基本函數是malloc(),在?linux上的實現是:malloc()函數調用庫函數sbrk(),sbrk()的實質是調用brk()函數。brk()是一個簡單的系統調用,只是簡單的改變mm_struct結構體的成員變量brkd的值。
(2)函數原型:
#include
???
int brk(void *
addr);
?
void *
sbrk(intptr_t increment);
//當參數increment為0時,sbrk()返回的是進程當前的brk值,increment為正數時擴展brk值,當increment為負數時收縮brk值
(3)mm_struct結構中的成員變量
start_code
和 end_code 是進程代碼段的起始和結束地址、
start_data
和 end_data 是進程數據段的起始和終止地址。
start_stack ?是進程堆棧段的起始地址。
start_brk
是進程動態內存分配的起始地址(堆的起始地址)。
?brk 是進程動態內存分配當前的終止地址(堆的當前最后地址)。
?3、Mmap映射區域操作的相關函數
?
(1)mmap()函數將一個文件或者其他對象映射進內存。文件被映射到多個頁上,如果文件大小不是所有頁大小之和,最后一個頁不被使用的空間將會清零。munmap執行相反的操作,刪除特定地址區域的對象映射。
(2)函數原型
#include?
void * mmap(void * addr,size_t length,int
prot,int flags,int fd,off_t offset)
?
int munmap(void *addr,size_t
length);
參數:start — 映射區的開始地址。
length —
映射區的長度。
prot —
期望的內存保護標志。
?flags —
指定映射對象的類型,映射選項和映射頁是否可以共享。
fd — 有效的文件描述符。
offset —
被映射對象內容的起點。?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux挂载efi分区,IBM X38
- 下一篇: linux卸载es,Ubuntu卸载el