Linux內(nèi)核運(yùn)行在X86機(jī)器的物理內(nèi)存管理使用簡單平坦內(nèi)存模型,每個用戶進(jìn)程內(nèi)存(虛擬內(nèi)存)地址范圍為從0到TASK_SIZE字節(jié),超過此內(nèi)存的限制不能被用戶訪問。用戶進(jìn)程被分為幾個邏輯段,成為虛擬內(nèi)存區(qū)域,內(nèi)核跟蹤和管理用戶進(jìn)程的虛擬內(nèi)存區(qū)域提供適當(dāng)?shù)膬?nèi)存管理和內(nèi)存保護(hù)處理。
do_brk()是一個內(nèi)核函數(shù),用于間接調(diào)用管理進(jìn)程的內(nèi)存堆的增加和縮減 (brk),它是一個mmap(2)系統(tǒng)調(diào)用的簡化版本,只處理匿名映射(如未初始化數(shù)據(jù))。
do_brk()改變進(jìn)程的地址空間。地址是代表數(shù)據(jù)段結(jié)束的一個指針(事實(shí)上是進(jìn)程的堆區(qū)域)。 do_brk()的參數(shù)是一個絕對邏輯地址,這個地址代表地址空間新的結(jié)尾。更實(shí)際地說,我們在編寫用戶程序的時候從來就不應(yīng)該使用這個函數(shù)。使用這個函數(shù)的用戶程序就不能再使用malloc(),這是一個大問題,因?yàn)闃?biāo)注庫的許多部分依賴于malloc()。 如果在用戶程序中使用do_brk()可能會導(dǎo)致難以發(fā)現(xiàn)的程序崩潰。
do_brk(addr, len)函數(shù)給從addr到addr+len建立虛擬內(nèi)存區(qū)vm_area_struct(該區(qū)的起始地址為addr;結(jié)束地址為addr+len),該虛擬內(nèi)存區(qū)作為進(jìn)程的堆來使用。 malloc將從此區(qū)域獲取內(nèi)存空間(虛擬內(nèi)存), free()將會把malloc()獲取的虛擬空間釋放掉(歸還到該進(jìn)程的堆的空閑空間中去)