程序的虛擬記憶體

2022-06-26 06:09:14 字數 2367 閱讀 6109

程序屬性資訊的task_struct結構體,其中包含程序使用的記憶體資訊。在32位的作業系統中,當程序建立的時候(程式執行時),系統會為每乙個程序分配大小為4gb的虛擬記憶體空間,用於儲存程序屬性資訊。

c語言中的變數,通常使用&運算子來獲得其位址,那麼,這個位址就是虛擬位址,在簡單的微控制器中,編寫的**編譯時都需要指定物理ram空間分布,不會有虛擬位址的概念,位址就是指在ram中的實際實體地址

首先程式**和資料必須駐留在記憶體中才能得以執行,然而系統記憶體大小是有限的,有時可能不能容納乙個完整的程式的所有**和資料,更何況在多工系統中,可能同時要開啟子處理程式、瀏覽器等多種任務,想讓記憶體駐留所有的這些程式顯然不太可能。因此,首先能想到的是將程式分割成小份,只讓當前系統執行它的所有需要的那部分留在記憶體,其他部分都留在硬碟。當系統處理完當前任務片段後,再從外存中調入下乙個待執行的任務片段。老式系統就是這樣處理大任務的,而且這個工作是由開發者自行完成。然而隨著程式越來越豐富,由於程式的行為幾乎準確**,因此很難再靠預見性來靜態分配固定大小的記憶體,然後再機械地輪換程式片進入記憶體執行。系統必須採用一種能按需分配的新技術

這種按需分配的技術就是虛擬記憶體機制。之所以稱之為虛擬記憶體,說明記憶體只是邏輯上存在的,並非真實的物理記憶體,而且程序的分配的虛擬記憶體空間可能比實際使用物理記憶體要大很多。程式最終的執行,也是由cpu操作物理記憶體完成的。因此,虛擬記憶體需要與實際的物理記憶體建立起一定的聯絡,從而對於程序來說,保證訪問的虛擬記憶體空間是有意義的,而不是訪問了乙個假設的位址值

物理記憶體與虛擬記憶體建立聯絡通過位址對映得來。所謂對映,就是乙個位址轉換的過程,通俗地講,就是讓虛擬位址與實體地址建立一一對應的關係。一旦這種關係建立,程序只需操作虛擬位址即可,然後通過查詢這一虛擬位址與實際位址建立的關係,即可實現對實際位址的使用。當程序退出不需要記憶體資源釋放時,將這一對應關係斷開即可,此時虛擬位址就毫無意義,因為它沒有和任何實體地址有關係

系統雖然為每乙個程序分配了4gb的虛擬記憶體空間,但實際情況是程序按照當前執行對記憶體的需求,通過與實際的物理記憶體建立對映關係,獲取分配的記憶體資源。在這一過程中,所需的位址在其生命週期中可以發生變化。同時,虛擬記憶體使得程序認為它的擁有連續可用的記憶體(一段連續完整的記憶體);但實際上,它通常是對映的多個不連續的物理記憶體分段來的

實體地址與虛擬位址建立關係,程序通過操作虛擬位址,而得到與之建立關係的實際實體地址的使用。這種位址關係建立,是通過頁對映表現的

虛擬記憶體的規劃之一是將每個程式使用的記憶體切割成小型的、固定大小的「頁」單位(一般頁面的大小為4096位元組=4kb)。相應地,將ram劃分成一系列與虛擬頁尺寸相同的頁幀。核心需要為每乙個程序維護一張頁對映表。該頁對映表中的每個條目指出乙個虛擬「頁」在ram中的所在位置,在程序虛擬位址空間中,並非所有的位址範圍都需要頁表條目。由於可能存在大段的虛擬位址空間並未投入使用,故而也沒有必要為其維護相應的頁表條目

程序與程序、程序與核心相互隔離,乙個程序不能讀取或修改另乙個程序或核心的記憶體,這是因為每個程序的頁表條目指向ram中的截然不同的物理頁面集合

適當情況下,兩個或者多個程序能夠共享記憶體。這是因為核心可以使不同程序的頁表條目指向相同的ram頁

便於實現記憶體保護機制:也就是說,可以對頁表條目進行標記,以表示相關頁面的內容是可讀、可寫、可執行抑或是這些保護措施的組合。多個程序共享ram頁時,允許每個程序對記憶體採取不同的保護措施。例如,乙個程序可能以唯讀方式訪問某ram頁,而另乙個程序則以讀寫方式訪問該頁

程式設計師和編譯器、鏈結器之類的工具無須關注程式在ram中的物理布局

因為需要駐留在記憶體中的僅是程式的一部分,所以程式的載入和執行都很快。而且,乙個程序所占用的虛擬記憶體大小能夠超出ram容量

linux作業系統採用的虛擬記憶體管理技術,該虛擬記憶體空間大小為4gb的線性虛擬空間,程序只管自己的訪問虛擬位址,無須知道實體地址的對映情況。利用這種虛擬位址不但更安全(使用者不能直接訪問物理記憶體),而且使用者程式可以使用比實際物理記憶體更大的位址空間

4gb的程序位址空間會被分成兩個部分--使用者空間與核心空間。使用者位址空間是03gb(0xc00000000),核心位址空間佔據34gb。通常情況下,使用者只能訪問使用者的虛擬位址,不能訪問核心空間虛擬位址。只有使用者程序使用系統呼叫(代表使用者程序在核心態執行)時才可以訪問核心空間。當程序切換時,使用者空間就會跟發生變化;而核心空間是由核心負責對映的,是固定的,它並不會隨著程序改變。核心空間位址有自己對應的頁表,使用者程序各自由不同的表,每個程序的使用者空間都是完全獨立、互不相干

程式**段:源**,具有唯讀屬性,包含程式**(.init和.text)和唯讀資料(.rodata)

資料段:存放的是全域性變數和靜態變數。其中初始化資料段(.data)【靜態資料區】存放顯示初始化的全域性(global)變數和靜態(static)變數;未初始化資料段,此段通常也被稱為bss段(.bss),存放未進行顯示初始化的全域性變數和靜態變數

堆:使用者管理,存放動態分配的資料,一般由程式動態分配和釋放,若程式不釋放,程式結束時可能由作業系統**。例如:使用malloc()函式申請空間

程序虛擬記憶體模型

以32位的作業系統為例,32位的作業系統每個程序對應的虛擬記憶體為4g 232 其中核心區1g,使用者區3g 程序控制塊pcb 1.pcb是程序存在的資料結構,系統通過pcb的存在而感知程序的存在 2.系統通過pcb對程序進行排程和管理 3.程序 pcb 與pid是一對一關係,而與程式檔案之間是多對...

Linux程序的虛擬記憶體

使用者程序的虛擬位址空間是linux的乙個重要的抽象 它為每個執行程序提供了同樣的系統檢視,這使得多個程序可以同時執行,而不會干擾到其他程序記憶體中的內容。每個應用程式都有自己的線性位址空間,與所有其他應用程式隔開。各程序虛擬位址空間起始於0,延伸到task sieze 1,其上是核心位址空間。使用...

Linux程序虛擬記憶體簡介

使用者態和核心態 程序在執行時一般存在兩種狀態 使用者態 核心態。使用者態是指程序在執行使用者 核心態時指程序在執行核心 所以在linux中每個程序都存在兩個棧分別使用者使用者態和核心態的執行。使用者空間和核心空間 在32位系統中linux程序的虛擬記憶體為4gb,linux核心將這4g位元組的空間...