Linux进程地址空间与进程内存布局详解,内核空间与用户空间
Linux進程地址空間與進程內存布局詳解
程序段(Text):程序代碼在內存中的映射,存放函數體的二進制代碼。
初始化過的數據(Data):在程序運行初已經對變量進行初始化的數據。
未初始化過的數據(BSS):在程序運行初未對變量進行初始化的數據。
棧 (Stack):存儲局部、臨時變量,函數調用時,存儲函數的返回指針,用于控制函數的調用和返回。在程序塊開始時自動分配內存,結束時自動釋放內存,其操作方式類似于數據結構中的棧。
堆 (Heap):存儲動態內存分配,需要程序員手工分配,手工釋放.注意它與數據結構中的堆是兩回事,分配方式類似于鏈表。
二 內核空間和用戶空間
Linux的虛擬地址空間范圍為0~4G,Linux內核將這4G字節的空間分為兩部分, 將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF)供內核使用,稱為“內核空間”。而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF)供各個進程使用,稱為“用戶空間。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。于是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。
Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用,每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的,最高的1GB字節虛擬內核空間則為所有進程以及內核所共享。
內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處于虛擬空間中。 雖然內核空間占據了每個虛擬空間中的最高1GB字節,但映射到物理內存卻總是從最低地址(0x00000000),另外, 使用虛擬地址可以很好的保護 內核空間被用戶空間破壞,虛擬地址到物理地址轉換過程有操作系統和CPU共同完成(操作系統為CPU設置好頁表,CPU通過MMU單元進行地址轉換)。
注:多任務操作系統中的每一個進程都運行在一個屬于它自己的內存沙盒中,這個 沙盒就是虛擬地址空間(virtual address space),在32位模式下,它總是一個4GB的內存地址塊。這些虛擬地址通過頁表(page table)映射到物理內存,頁表由操作系統維護并被處理器引用。每個進程都擁有一套屬于它自己的頁表。
總結
以上是生活随笔為你收集整理的Linux进程地址空间与进程内存布局详解,内核空间与用户空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs(visual studio)调试功
- 下一篇: relocation R_X86_64_