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