1.**段:**段用來存放可執行檔案的操作指令,也就是說它是可執行程式在記憶體中的映象,**段需要防止在執行時被非法修改,所以只允許讀取操作,不允許寫操作,—它是不可寫的
2.資料段:資料段用來存放可執行檔案中的已初始化的全域性變數,換句話說就是存放程式靜態分配的變數和全域性變數
3.bss段:bss段包含了程式中未初始化的全域性變數,在記憶體中bss段全部置零
4.堆:堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或者縮減,當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除
5.棧:棧時使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且等到呼叫結束後,函式的返回值也會被存放回棧中
這裡也就能提出三個問題:
1.程序空間位址如何管理
2.程序位址如何對映到物理記憶體
3.物理記憶體如何被管理
同樣由上述問題引發的一些子問題:比如系統虛擬位址分布,記憶體分配介面,連續記憶體分配與非連續記憶體分配
linux作業系統採用虛擬記憶體管理技術,使得每個程序都有各自互不干涉的程序位址空間,該空間是大小為4g的線性虛擬空間,使用者所看到和接觸到的都是虛擬位址,無法看到實際的物理記憶體位址。利用這種虛擬位址不但能祈禱保護作業系統的效果(使用者不能直接訪問物理記憶體),而且更重要的是,使用者程式可使用比實際物理記憶體更大的位址空間。
需要澄清的幾個問題
程序記憶體管理的物件是程序線性空間上的記憶體映象,這些記憶體映象其實就是程序使用的虛擬記憶體區域,程序的虛擬空間是個32或64為平台的位址空間,為了方便管理,虛擬空間被劃分為大小可變化的(4096的倍數)記憶體區域,這些區域在程序線性位址中有序排列。這些區域的劃分原則是"將訪問屬性一致的位址空間存放在一起",可讀可寫可執行。
可以通過cat/proc//maps獲得某個程序所占用的記憶體區域。
每行資料的格式如下:
(記憶體區域)開始 - 結束 訪問許可權 偏移 主裝置號:次裝置號 i節點 檔案
在linux核心中對應程序記憶體區域的資料結構是:vm_area_struct,核心將每個記憶體區域作為乙個單獨的記憶體物件管理,相應的操作也都一致。採用物件導向是vma結構體可以代表多種型別的記憶體區域—比如記憶體對映檔案或者程序的使用者空間棧等,對這些區域的操作也都不盡相同。
vm_area_struct結構比較複雜,關於它的詳細結構請參閱相關材料。我們這裡只對它的組織方法做一些補充說明,vm_area_struct是描述程序位址空間的基本管理單元,對於乙個程序來說往往需要多個記憶體區域描述它的虛擬空間,如何關聯這些不同的記憶體區域呢?大家可能都會想到使用鍊錶,的確vm_area_struct結構缺實是以鍊錶形式鏈結,不過為了方便查詢,核心又以紅黑樹(以前的核心使用平衡樹)的形式組織記憶體區域,以便降低搜尋耗時。並存的兩種組織形式,並非冗餘,鍊錶用於需要遍歷全部節點的時候用,而紅黑樹是用於位址空間中定位特定的記憶體區域的時候用,核心為了記憶體區域上的各種不同的操作都能過得高效能,所以同時使用了兩種資料結構。
程序的位址空間對應的描述結構是"記憶體描述符結構",它表示程序的全部位址空間,——包含了和程序位址空間有關的全部資訊,其中當然包含程序的記憶體區域。
我們之前就知道,程序所能直接操作的位址是虛擬位址,但是當程序執行時,從核心獲得的僅僅是虛擬的記憶體區域,而不是實際的實體地址,獲得的僅僅是對乙個新的線性位址區間的使用權,實際的物理記憶體只有當進**的去訪問新獲取的虛擬位址時,才會由"請求頁機制"產生缺頁異常,從而進入分配實際頁面的例程。
該異常是虛擬記憶體機制賴以存在的基本保證——它會告訴核心去真正為程序分配物理頁,並建立對應的頁表,這時候虛擬位址才實實在在地對映到了系統的物理記憶體上。
這種請求頁機制把頁面的分配推遲到不能再推遲為止。
作業系統記憶體管理
作業系統記憶體管理 一 程序的虛擬位址空間 每個程序都被賦予自己的虛擬位址空間,對於32位程序來說,這個位址空間為4g,因此程序中的位址可以為0x00000000至0xffffffff之間的任何乙個值。其中4g空間中的低區的2g空間留給程序使用,而高區的2g空間則留給系統使用。在windows200...
作業系統記憶體管理
作業系統記憶體管理一 程序的虛擬位址空間 每個程序都被賦予自己的虛擬位址空間,對於 32位程序來說,這個位址空間為 4g,因此程序中的位址可以為 0x00000000 至0xffffffff 之間的任何乙個值。其中 4g空間中的低區的 2g空間留給程序使用,而高區的 2g空間則留給系統使用。在win...
作業系統記憶體管理
記憶體,毫無疑問是最重要的資源,顯然,作業系統對記憶體的管理我必須清楚。這裡主要介紹了分頁管理和分段管理。1.頁式管理 a.頁式管理的基本思想 打破儲存分配的連續性 將邏輯上連續的使用者程式對映到離散的記憶體塊 使用者程式與記憶體空間被劃分為若干等長的區域 邏輯頁 與 物理頁 使用者程式的劃分由系統...