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