Linux 程式位址空間

2021-10-09 23:28:39 字數 1362 閱讀 9515

我們所說的位址是乙個虛擬的位址空間,只是一堆位址編號的描述,非物理記憶體位址;虛擬位址不具備儲存能力,資料儲存依然放到物理記憶體中

程序中訪問的位址都是虛擬位址,非物理記憶體位址

程式位址空間也是乙個虛擬位址空間,是作業系統為程序通過乙個mm_struct 結構體所描述的乙個假的位址空間

mm_struct (task_size, start_codde, end_code)  通過大小及區域的編號描述

問:程序直接訪問物理記憶體有什麼不好?

(2)程序直接訪問物理記憶體,如果有乙個野指標,在操作時可能把其他程序中的資料改變了。(無法進行記憶體訪問控制)

(3)程式執行載入通常要使用一塊連續的記憶體空間。(對記憶體利用率較低)

通過虛擬位址空間對映到物理記憶體上進行資料儲存,可實現資料在物理記憶體上離散式儲存,提高記憶體利用率

在cpu和物理記憶體之間進行位址轉換時,mmu將位址從虛擬位址空間對映到物理記憶體空間

問:為什麼?

答:(1)程序可以擁有乙個完整的連續的線性空間

(2)通過頁表對映獲取實體地址,實現資料在記憶體上的離散式儲存,提高記憶體利用率

(3)通過頁表進行對映訪問,可以實現更強的記憶體訪問控制

分頁式的記憶體管理:

頁表:頁號,實體地址,缺頁中斷....

虛擬位址的組成:頁號+頁內偏移

對映邏輯:拿到虛擬位址,解析出頁號,通過頁號在頁表中找到對應的頁表項,取出頁表項中的實體地址,與頁內偏移進行相加

分段式的記憶體管理:將記憶體分為各個段(編譯編譯器進行位址管理)

段表:段號+段內偏移

位址的組成:段號+物理記憶體段起始位址;

對映邏輯:拿到虛擬位址,解析出段號,通過段號在段表中找到對應的段表項,取出段表項中的實體地址,與段內偏移進行相加

段頁式的記憶體管理:將記憶體進行分段,在每個段內採用分頁管理

缺頁中斷:通過虛擬位址,找到頁表項之後,如果當前位址本來存放的資料不在記憶體中,就會觸發缺頁中斷

問:為什麼乙個資料沒在記憶體中?

答:當物理記憶體不夠用的時候,作業系統會根據一定的演算法, 找出一塊物理記憶體,將其中的資料放到磁碟的交換分割槽中進行儲存,騰出這塊記憶體進行使用。當觸發缺頁中斷的的時候,這塊記憶體中的原有資料重新被置換回來。(記憶體置換法:最久未使用)

程式位址空間

上圖也可以進一步細分 1.棧區 棧又叫堆疊,通常存放程式臨時建立的非靜態區域性變數 即函式大括號中定義的區域性變數 以及函式呼叫時的引數,呼叫後的返回值等。由編譯器自動分配釋放。棧是向下增長的。棧具有 小記憶體 自動化 可能會溢位 的特點。棧頂的位址和棧的最大容量一般是系統預先規定好的,通常不會太大...

程式位址空間

乙個全域性變數,在子程序中修改後,列印100,父程序還是列印1 資料不同,表示肯定沒有使用同一塊記憶體空間 一塊記憶體空間不能儲存兩個資料 父子程序列印的資料不同,但是位址卻是相同的 此處產生矛盾,因為實際程序中訪問的位址都是虛擬位址,且程式位址空間時機上也是乙個程序的虛擬位址空間。size 表示記...

c程式位址空間

我們都知道指標在計算機中占有很重要的部分,但指標究竟是什麼呢?有人說 指標就是位址,因為指標都是指向乙個位址空間的,這麼說也沒毛病,但不準確。例如 int a 10 int p a 很顯然指標變數p中所存的是 a,不過這只是指標變數的一部分,是指標變數作為左值的表現,還有指標變數作為右值的呢,那麼p...