【Linux】虚拟地址空间
文章目錄
- 1. 物理地址和虛擬地址定義
- 2. 虛擬地址空間分布
- 2.1 內(nèi)核空間
- 2.2 棧(stack)
- 2.3 堆(heap)
- 2.4 BSS段
- 2.5 數(shù)據(jù)段(Data)
- 2.6 代碼段(text)
- 2.7 保留區(qū)
- 3. 分段式存儲(chǔ)
- 3.1 分段式存儲(chǔ)定義
- 3.2 分段式存儲(chǔ)示例
- 3.3 分段式存儲(chǔ)優(yōu)缺點(diǎn)
- 4. 分頁(yè)式存儲(chǔ)
- 4.1 分頁(yè)式存儲(chǔ)定義
- 4.2 分頁(yè)式存儲(chǔ)示例
- 4.3 分頁(yè)式存儲(chǔ)優(yōu)缺點(diǎn)
1. 物理地址和虛擬地址定義
物理地址 (physical address): 放在尋址總線上的地址。放在尋址總線上,如果是讀,電路根據(jù)這個(gè)地址每位的值就將相應(yīng)地址的 物理內(nèi)存中的數(shù)據(jù)放到 數(shù)據(jù)總線中傳輸。如果是寫,電路根據(jù)這個(gè)地址每位的值就在相應(yīng)地址的 物理內(nèi)存中放入 數(shù)據(jù)總線上的內(nèi)容。 物理內(nèi)存是以 字節(jié)(8位)為單位 編址的。
虛擬地址 (virtual address): CPU啟動(dòng) 保護(hù)模式后,程序運(yùn)行在虛擬 地址空間中。注意,并不是所有的“程序”都是運(yùn)行在虛擬地址中。CPU在啟動(dòng)的時(shí)候是運(yùn)行在實(shí)模式的,Bootloader以及內(nèi)核在初始化頁(yè)表之前并不使用虛擬地址,而是直接使用物理地址的。
2. 虛擬地址空間分布
2.1 內(nèi)核空間
內(nèi)核總是駐留在內(nèi)存中,是操作系統(tǒng)的一部分。內(nèi)核空間為內(nèi)核保留,不允許應(yīng)用程序讀寫該區(qū)域的內(nèi)容或直接調(diào)用內(nèi)核代碼定義的函數(shù)。
2.2 棧(stack)
-
棧是由高地址向低地址擴(kuò)展的連續(xù)內(nèi)存,棧的大小一般為 2M 或者 10M。
-
棧內(nèi)存是由系統(tǒng)分配,系統(tǒng)釋放的,以函數(shù)為單位進(jìn)行棧內(nèi)存分配,函數(shù)棧幀,局部變量,形參變量等都存放在棧內(nèi)存上。
-
棧的內(nèi)存分配釋放速度快效率高,內(nèi)存都是連續(xù)的。
2.3 堆(heap)
-
堆是由低地址向高地址擴(kuò)展的非連續(xù)內(nèi)存,堆的大小影響的因素比較多,和系統(tǒng)虛擬內(nèi)存的大小有關(guān)系。
-
堆內(nèi)存是由用戶自己分配的,C 語(yǔ)言用 malloc/free進(jìn)行分配釋放,C++用 new/delete 進(jìn)行分配釋放,由于堆需要用戶自己管理,因此堆內(nèi)存很容易造成內(nèi)存泄露,而棧內(nèi)存不會(huì)。
-
堆內(nèi)存的分配釋放相對(duì)于棧來(lái)說(shuō)效率低一些,內(nèi)存不一定連續(xù),容易產(chǎn)生內(nèi)存碎片,但是靈活性高。
2.4 BSS段
BSS(Block Started by Symbol)段中通常存放程序中以下內(nèi)容
-
未初始化的全局變量和靜態(tài)局部變量
-
初始值為0的全局變量和靜態(tài)局部變量(依賴于編譯器實(shí)現(xiàn))
-
未定義且初值不為0的符號(hào)(該初值即common block的大小)
2.5 數(shù)據(jù)段(Data)
數(shù)據(jù)段通常用于存放程序中已初始化且初值不為0的全局變量和靜態(tài)局部變量。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配(靜態(tài)存儲(chǔ)區(qū)),可讀可寫。
數(shù)據(jù)段保存在目標(biāo)文件中(在嵌入式系統(tǒng)里一般固化在鏡像文件中),其內(nèi)容由程序初始化。例如,對(duì)于全局變量int gVar = 10,必須在目標(biāo)文件數(shù)據(jù)段中保存10這個(gè)數(shù)據(jù),然后在程序加載時(shí)復(fù)制到相應(yīng)的內(nèi)存。
2.6 代碼段(text)
代碼段也稱正文段或文本段,通常用于存放程序執(zhí)行代碼(即CPU執(zhí)行的機(jī)器指令)。
2.7 保留區(qū)
位于虛擬地址空間的最低部分,未賦予物理地址。任何對(duì)它的引用都是非法的,用于捕捉使用空指針和小整型值指針引用內(nèi)存的異常情況。
3. 分段式存儲(chǔ)
3.1 分段式存儲(chǔ)定義
段式管理(segmentation),是指把一個(gè)程序分成若干個(gè)段(segment)進(jìn)行存儲(chǔ),每個(gè)段都是一個(gè)邏輯實(shí)體(logical entity),程序員需要知道并使用它。它的產(chǎn)生是與程序的模塊化直接有關(guān)的。段式管理是通過段表進(jìn)行的,它包括段號(hào)或段名、段起點(diǎn)、裝入位、段的長(zhǎng)度等。此外還需要主存占用區(qū)域表、主存可用區(qū)域表。
3.2 分段式存儲(chǔ)示例
假設(shè)有兩個(gè)進(jìn)程 A 和 B ,進(jìn)程 A 所需內(nèi)存大小為 10M ,其虛擬地址空間分布在 0x00000000 到 0x00A00000 ,進(jìn)程 B 所需內(nèi)存為 100M ,其虛擬地址空間分布為 0x00000000 到 0x06400000 。那么按照分段的映射方法,進(jìn)程 A 在物理內(nèi)存上映射區(qū)域?yàn)?0x00100000 到 0x00B00000 ,,進(jìn)程 B 在物理內(nèi)存上映射區(qū)域?yàn)?0x00C00000 到 0x07000000 。于是進(jìn)程 A 和進(jìn)程 B 分別被映射到了不同的內(nèi)存區(qū)間,彼此互不重疊,實(shí)現(xiàn)了地址隔離。從應(yīng)用程序的角度看來(lái),進(jìn)程 A 的地址空間就是分布在 0x00000000 到 0x00A00000 ,在做開發(fā)時(shí),開發(fā)人員只需訪問這段區(qū)間上的地址即可。應(yīng)用程序并不關(guān)心進(jìn)程 A 究竟被映射到物理內(nèi)存的那塊區(qū)域上了,所以程序的運(yùn)行地址也就是相當(dāng)于說(shuō)是確定的了。
3.3 分段式存儲(chǔ)優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
在段式存儲(chǔ)管理中,每個(gè)段地址的說(shuō)明為兩個(gè)量:一個(gè)段名和一個(gè)位移。在段內(nèi),是連續(xù)完整存放的。而在段與段之間是不一定連續(xù)編址的。段名和位移構(gòu)成了一種二維編址。 段式管理是不連續(xù)分配內(nèi)存技術(shù)中的一種。其最大特點(diǎn)在于他按照用戶觀點(diǎn),即按程序段、數(shù)據(jù)段等有明確邏輯含義的“段”,分配內(nèi)存空間。克服了頁(yè)式的、硬性的、非邏輯劃分給保護(hù)和共享與支態(tài)伸縮帶來(lái)的不自然性。 段的最大好處是可以充分實(shí)現(xiàn)共享和保護(hù),便于動(dòng)態(tài)申請(qǐng)內(nèi)存,管理和使用統(tǒng)一化,便于動(dòng)態(tài)鏈接。
缺點(diǎn)
(1) 有內(nèi)存碎片產(chǎn)生問題。
(2) 在分段的映射方法中,每次換入換出內(nèi)存的都是整個(gè)程序, 這樣會(huì)造成大量的磁盤訪問操作,導(dǎo)致效率低下。
4. 分頁(yè)式存儲(chǔ)
4.1 分頁(yè)式存儲(chǔ)定義
將各進(jìn)程的虛擬空間劃分成若干個(gè)長(zhǎng)度相等的頁(yè)(page),頁(yè)式管理把內(nèi)存空間按頁(yè)的大小劃分成片或者頁(yè)面(page frame),然后把頁(yè)式虛擬地址與內(nèi)存地址建立一一對(duì)應(yīng)頁(yè)表,并用相應(yīng)的硬件地址變換機(jī)構(gòu),來(lái)解決離散地址變換問題。頁(yè)式管理采用請(qǐng)求調(diào)頁(yè)或預(yù)調(diào)頁(yè)技術(shù)實(shí)現(xiàn)了內(nèi)外存存儲(chǔ)器的統(tǒng)一管理。
4.2 分頁(yè)式存儲(chǔ)示例
一個(gè)可執(zhí)行文件 (PE 文件 ) 其實(shí)就是一些編譯鏈接好的數(shù)據(jù)和指令的集合,它也會(huì)被分成很多頁(yè),在 PE 文件執(zhí)行的過程中,它往內(nèi)存中裝載的單位就是頁(yè)。在 PE 文件的第一頁(yè)包含了 PE 文件頭和段表等信息,進(jìn)程根據(jù)文件頭和段表等信息,將 PE 文件中所有的段一一映射到虛擬地址空間中相應(yīng)的頁(yè) (PE 文件中的段的長(zhǎng)度都是頁(yè)長(zhǎng)的整數(shù)倍 ) 。這時(shí) PE 文件的真正指令和數(shù)據(jù)還沒有被裝入內(nèi)存中,操作系統(tǒng)只是根據(jù) PE 文件的頭部等信息建立了 PE 文件和進(jìn)程虛擬地址空間中頁(yè)的映射關(guān)系而已。當(dāng) CPU 要訪問程序中用到的某個(gè)虛擬地址時(shí),當(dāng) CPU 發(fā)現(xiàn)該地址并沒有相相關(guān)聯(lián)的物理地址時(shí), CPU 認(rèn)為該虛擬地址所在的頁(yè)面是個(gè)空頁(yè)面, CPU 會(huì)認(rèn)為這是個(gè)頁(yè)錯(cuò)誤 (Page Fault) , CPU 也就知道了操作系統(tǒng)還未給該 PE 頁(yè)面分配內(nèi)存, CPU 會(huì)將控制權(quán)交還給操作系統(tǒng)。操作系統(tǒng)于是為該 PE 頁(yè)面在物理空間中分配一個(gè)頁(yè)面,然后再將這個(gè)物理頁(yè)面與虛擬空間中的虛擬頁(yè)面映射起來(lái),然后將控制權(quán)再還給進(jìn)程,進(jìn)程從剛才發(fā)生頁(yè)錯(cuò)誤的位置重新開始執(zhí)行。由于此時(shí)已為 PE 文件的那個(gè)頁(yè)面分配了內(nèi)存,所以就不會(huì)發(fā)生頁(yè)錯(cuò)誤了。隨著程序的執(zhí)行,頁(yè)錯(cuò)誤會(huì)不斷地產(chǎn)生,操作系統(tǒng)也會(huì)為進(jìn)程分配相應(yīng)的物理頁(yè)面來(lái)滿足進(jìn)程執(zhí)行的需求。
4.3 分頁(yè)式存儲(chǔ)優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
(1) 由于它不要求作業(yè)或進(jìn)程的程序段和數(shù)據(jù)在內(nèi)存中連續(xù)存放,從而有效地解決了碎片問題。
(2) 動(dòng)態(tài)頁(yè)式管理提供了內(nèi)存和外存統(tǒng)一管理的虛存實(shí)現(xiàn)方式,使用戶可以利用的存儲(chǔ)空間大大增加。這既提高了主存的利用率,又有利于組織多道程序執(zhí)行。
缺點(diǎn)
(1) 要求有相應(yīng)的硬件支持。例如地址變換機(jī)構(gòu),缺頁(yè)中斷的產(chǎn)生和選擇淘汰頁(yè)面等都要求有相應(yīng)的硬件支持。這增加了機(jī)器成本。
(2) 增加了系統(tǒng)開銷,例如缺頁(yè)中斷處理機(jī)。
(3) 請(qǐng)求調(diào)頁(yè)的算法如選擇不當(dāng),有可能產(chǎn)生抖動(dòng)現(xiàn)象。
(4) 雖然消除了碎片,但每個(gè)作業(yè)或進(jìn)程的最后一頁(yè)內(nèi)總有一部分空間得不到利用果頁(yè)面較大,則這一部分的損失仍然較大。
總結(jié)
以上是生活随笔為你收集整理的【Linux】虚拟地址空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】Makefile文件
- 下一篇: linux 其他常用命令