最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

內(nèi)存管理:詳解虛擬地址空間-MMU

2022-09-15 20:55 作者:Linux遠(yuǎn)航者  | 我要投稿

虛擬內(nèi)存

虛擬內(nèi)存就是在你電腦的物理內(nèi)存不夠用時(shí)把一部分硬盤(pán)空間作為內(nèi)存來(lái)使用,這部分硬盤(pán)空間就叫作虛擬內(nèi)存。

硬盤(pán)傳輸?shù)乃俣纫葍?nèi)存?zhèn)鬏斔俣嚷枚?,所以虛擬內(nèi)存比物理內(nèi)存的效率要慢得多。

斷電后數(shù)據(jù)丟失。

虛擬地址空間

虛擬地址空間是一個(gè)非常抽象的概念,先根據(jù)字面意思進(jìn)行解釋?zhuān)?/p>

  • 它可以用來(lái)加載程序數(shù)據(jù)(數(shù)據(jù)可能被加載到物理內(nèi)存上,空間不夠就加載到虛擬內(nèi)存中)

  • 它對(duì)應(yīng)著一段連續(xù)的內(nèi)存地址,起始位置為 0。

  • 之所以說(shuō)虛擬是因?yàn)檫@個(gè)起始的 0 地址是被虛擬出來(lái)的, 不是物理內(nèi)存的 0 地址。

虛擬地址空間的大小也由操作系統(tǒng)決定,32位的操作系統(tǒng)虛擬地址空間的大小為 2^32 字節(jié),也就是 4G,64 系統(tǒng)的操作系統(tǒng)虛擬地址空間大小為 2^64 字節(jié),這是一個(gè)非常大的數(shù),感興趣的可以自己計(jì)算一下。

關(guān)于虛擬4G內(nèi)存的描述和解析:

一個(gè)進(jìn)程用到的虛擬地址是由內(nèi)存區(qū)域表來(lái)管理的,實(shí)際用不了4G。而用到的內(nèi)存區(qū)域,會(huì)通過(guò)頁(yè)表映射到物理內(nèi)存。

所以每個(gè)進(jìn)程都可以使用同樣的虛擬內(nèi)存地址而不沖突,因?yàn)樗鼈兊奈锢淼刂穼?shí)際上是不同的。內(nèi)核用的是3G以上的1G虛擬內(nèi)存地址,其中896M是直接映射到物理地址的,128M按需映射896M以上的所謂高位內(nèi)存。各進(jìn)程使用的是同一個(gè)內(nèi)核。

首先要分清“可以尋址”和“實(shí)際使用”的區(qū)別。

其實(shí)我們講的每個(gè)進(jìn)程都有4G虛擬地址空間,講的都是“可以尋址”4G,意思是虛擬地址的0-3G對(duì)于一個(gè)進(jìn)程的用戶態(tài)和內(nèi)核態(tài)來(lái)說(shuō)是可以訪問(wèn)的,而3-4G是只有進(jìn)程的內(nèi)核態(tài)可以訪問(wèn)的。并不是說(shuō)這個(gè)進(jìn)程會(huì)用滿這些空間。

其次,所謂“獨(dú)立擁有的虛擬地址”是指對(duì)于每一個(gè)進(jìn)程,都可以訪問(wèn)自己的0-4G的虛擬地址。虛擬地址是“虛擬”的,需要轉(zhuǎn)化為“真實(shí)”的物理地址。

好比你有你的地址簿,我有我的地址簿。你和我的地址簿都有1、2、3、4頁(yè),但是每頁(yè)里面的實(shí)際內(nèi)容是不一樣的,我的地址簿第1頁(yè)寫(xiě)著3你的地址簿第1頁(yè)寫(xiě)著4,對(duì)于你、我自己來(lái)說(shuō)都是用第1頁(yè)(虛擬),實(shí)際上用的分別是第3、4頁(yè)(物理),不沖突。

內(nèi)核用的896M虛擬地址是直接映射的,意思是只要把虛擬地址減去一個(gè)偏移量(3G)就等于物理地址。同樣,這里指的還是尋址,實(shí)際使用前還是要分配內(nèi)存。而且896M只是個(gè)最大值。如果物理內(nèi)存小,內(nèi)核能使用(分配)的可用內(nèi)存也小。

進(jìn)程的虛擬地址空間分為用戶區(qū)(03G)和內(nèi)核區(qū)(34G), 其中內(nèi)核區(qū)是受保護(hù)的, 用戶是不能夠?qū)ζ溥M(jìn)行讀寫(xiě)操作的;

內(nèi)核區(qū)對(duì)于所有進(jìn)程是共享的;系統(tǒng)中所有進(jìn)程對(duì)應(yīng)的虛擬地址空間的內(nèi)核區(qū)都會(huì)映射到同一塊物理內(nèi)存上(系統(tǒng)內(nèi)核只有一個(gè))。

虛擬地址空間中用戶區(qū)地址范圍是 0~3G,里邊分為多個(gè)區(qū)塊:

  • 保留區(qū): 位于虛擬地址空間的最底部,未賦予物理地址。任何對(duì)它的引用都是非法的,程序中的空指針(NULL)指向的就是這塊內(nèi)存地址。

  • .text段: 代碼段也稱(chēng)正文段或文本段,通常用于存放程序的執(zhí)行代碼 (即 CPU 執(zhí)行的機(jī)器指令),代碼段一般情況下是只讀的,這是對(duì)執(zhí)行代碼的一種保護(hù)機(jī)制。

  • .data段: 數(shù)據(jù)段通常用于存放程序中已初始化且初值不為 0 的全局變量和靜態(tài)變量。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配 (靜態(tài)存儲(chǔ)區(qū)),可讀可寫(xiě)。

  • .bss段: 未初始化以及初始為 0 的全局變量和靜態(tài)變量,操作系統(tǒng)會(huì)將這些未初始化的變量初始化為 0

  • 堆(heap):用于存放進(jìn)程運(yùn)行時(shí)動(dòng)態(tài)分配的內(nèi)存。

    • 堆中內(nèi)容是匿名的,不能按名字直接訪問(wèn),只能通過(guò)指針間接訪問(wèn)。

    • 堆向高地址擴(kuò)展 (即 “向上生長(zhǎng)”),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)用鏈表來(lái)存儲(chǔ)空閑內(nèi)存地址,自然不連續(xù),而鏈表從低地址向高地址遍歷。

  • 內(nèi)存映射區(qū)(mmap):作為內(nèi)存映射區(qū)加載磁盤(pán)文件,或者加載程序運(yùn)作過(guò)程中需要調(diào)用的動(dòng)態(tài)庫(kù)。

  • 棧(stack): 存儲(chǔ)函數(shù)內(nèi)部聲明的非靜態(tài)局部變量,函數(shù)參數(shù),函數(shù)返回地址等信息,棧內(nèi)存由編譯器自動(dòng)分配釋放。棧和堆相反地址 “向下生長(zhǎng)”,分配的內(nèi)存是連續(xù)的。

  • 命令行參數(shù):存儲(chǔ)進(jìn)程執(zhí)行的時(shí)候傳遞給 main() 函數(shù)的參數(shù),argc,argv [],env[]

  • 環(huán)境變量: 存儲(chǔ)和進(jìn)行相關(guān)的環(huán)境變量,比如:工作路徑,進(jìn)程所有者等信息

內(nèi)存管理單元MMU

MMU位于CPU內(nèi),作用:

  • 程序中使用的地址均是虛擬內(nèi)存地址,進(jìn)程中的數(shù)據(jù)是如何進(jìn)入到物理內(nèi)存中的呢?

  • MMU完成虛擬內(nèi)存到物理內(nèi)存的映射,即虛擬地址映射為物理地址;

  • 流水線中預(yù)取指令取到的地址是虛擬地址,需要MMU轉(zhuǎn)換以及設(shè)置訪問(wèn)權(quán)限

MMU采用分頁(yè)機(jī)制(即按頁(yè)來(lái)劃分物理內(nèi)存)

用MMU的是:Windows、MacOS、Linux、Android;

不用MMU的是:FreeRTOS、VxWorks、UCOS……

與此相對(duì)應(yīng)的:CPU也可以分成兩類(lèi),帶MMU的、不帶MMU的。

帶MMU的是:Cortex-A系列、ARM9、ARM11系列;

不帶MMU的是:Cortex-M系列……(STM32是M系列,沒(méi)有MMU,不能運(yùn)行Linux,只能運(yùn)行一些UCOS、FreeRTOS等等)。

虛擬地址和物理地址的映射關(guān)系存儲(chǔ)在頁(yè)表中,而現(xiàn)在頁(yè)表又是分級(jí)的

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。?/p>


內(nèi)核學(xué)習(xí)網(wǎng)站:

Linux內(nèi)核源碼/內(nèi)存調(diào)優(yōu)/文件系統(tǒng)/進(jìn)程管理/設(shè)備驅(qū)動(dòng)/網(wǎng)絡(luò)協(xié)議棧-學(xué)習(xí)視頻教程-騰訊課堂ke.qq.com/course/4032547?flowToken=1040236

頁(yè)表

實(shí)現(xiàn)從頁(yè)號(hào)到物理塊號(hào)的地址映射。

邏輯地址轉(zhuǎn)換成物理地址的過(guò)程是:用頁(yè)號(hào)p去檢索頁(yè)表,從頁(yè)表中得到該頁(yè)的物理塊號(hào),把它裝入物理地址寄存器中。同時(shí),將頁(yè)內(nèi)地址d直接送入物理地址寄存器地塊內(nèi)地址字段中。這樣,物理地址寄存器中的內(nèi)容就是由二者拼接成的實(shí)際訪問(wèn)內(nèi)存的地址,從而完成了從邏輯地址到物理地址的轉(zhuǎn)換。

TLB快表

TLB是MMU中的一塊高速緩存,也是一種Cache.

TLB就是頁(yè)表的Cache,其中存儲(chǔ)了當(dāng)前最可能被訪問(wèn)到的頁(yè)表項(xiàng),其內(nèi)容是部分頁(yè)表項(xiàng)的一個(gè)副本。只有在TLB無(wú)法完成地址翻譯任務(wù)時(shí),才會(huì)到內(nèi)存中查詢頁(yè)表,這樣就減少了頁(yè)表查詢導(dǎo)致的處理器性能下降。

如果沒(méi)有TLB,則每次取數(shù)據(jù)都需要兩次訪問(wèn)內(nèi)存,即查頁(yè)表獲得物理地址和取數(shù)據(jù).

虛擬地址空間以頁(yè)為單位進(jìn)行劃分,而相應(yīng)的物理地址空間也被劃分,其使用的單位稱(chēng)為頁(yè)幀,頁(yè)幀和頁(yè)必須保持相同,因?yàn)?strong>內(nèi)存與外部存儲(chǔ)器之間的傳輸是以頁(yè)為單位進(jìn)行傳輸?shù)?/strong>。例如,MMU可以通過(guò)一個(gè)映射項(xiàng)將VA的一頁(yè)0xb70010000xb7001fff映射到PA的一頁(yè)0x20000x2fff,如果CPU執(zhí)行單元要訪問(wèn)虛擬地址0xb7001008,則實(shí)際訪問(wèn)到的物理地址是0x2008。

虛擬內(nèi)存的哪個(gè)頁(yè)面映射到物理內(nèi)存的哪個(gè)頁(yè)幀是通過(guò)頁(yè)表(Page Table)來(lái)描述的,頁(yè)表保存在物理內(nèi)存中,MMU會(huì)查找頁(yè)表來(lái)確定一個(gè)VA應(yīng)該映射到什么PA。

  • 內(nèi)存訪問(wèn)級(jí)別的設(shè)置和修改(內(nèi)存保護(hù)),在完成映射的同時(shí),會(huì)設(shè)置CPU訪問(wèn)該段內(nèi)存的訪問(wèn)級(jí)別(3,2,1,0 Linux只有用戶空間3,內(nèi)核空間0),

如圖:

ro表示read only

0和3表示訪問(wèn)級(jí)別

程序運(yùn)行了兩次,產(chǎn)生兩個(gè)獨(dú)立的進(jìn)程,因此虛擬地址空間不一樣

兩個(gè)進(jìn)程共用一個(gè)內(nèi)核區(qū),映射一份(圖中也要通過(guò)MMU映射,懶得話而已)即可,其中兩個(gè)進(jìn)程的PCB不一樣

用戶區(qū)需要單獨(dú)映射

MMU執(zhí)行過(guò)程

OS和MMU是這樣配合的:

  1. 操作系統(tǒng)在初始化或分配、釋放內(nèi)存時(shí)會(huì)執(zhí)行一些指令在物理內(nèi)存中填寫(xiě)頁(yè)表,然后用指令設(shè)置MMU,告訴MMU頁(yè)表在物理內(nèi)存中的什么位置。

  2. 設(shè)置好之后,CPU每次執(zhí)行訪問(wèn)內(nèi)存的指令都會(huì)自動(dòng)引發(fā)MMU做查表和地址轉(zhuǎn)換操作,地址轉(zhuǎn)換操作由硬件自動(dòng)完成,不需要用指令控制MMU去做。

我們?cè)诔绦蛑惺褂玫淖兞亢秃瘮?shù)都有各自的地址,在程序被編譯后,這些地址就成了指令中的地址,指令中的地址就成了CPU執(zhí)行單元發(fā)出的內(nèi)存地址,所以在啟用MMU的情況下, 程序中使用的地址均是虛擬內(nèi)存地址,都會(huì)引發(fā)MMU進(jìn)行查表和地址轉(zhuǎn)換操作。(注意理解這句話)

內(nèi)存保護(hù)機(jī)制

中斷和異常

  • 中斷由外部設(shè)備產(chǎn)生,而 異常由CPU內(nèi)部產(chǎn)生的

  • 中斷產(chǎn)生與CPU當(dāng)前執(zhí)行的指令無(wú)關(guān),而異常是由于當(dāng)前執(zhí)行的指令出現(xiàn)問(wèn)題導(dǎo)致的g

處理器一般有用戶模式(User Mode)和特權(quán)模式(privileged Mode)之分。操作系統(tǒng)可以在頁(yè)表中設(shè)置每個(gè)頁(yè)表訪問(wèn)權(quán)限,有些頁(yè)表不可以訪問(wèn),有些頁(yè)表只能在特權(quán)模式下訪問(wèn),有些頁(yè)表在用戶模式和特權(quán)模式下都可以訪問(wèn),同時(shí),訪問(wèn)權(quán)限又分為可讀、可寫(xiě)可執(zhí)行三種。這樣設(shè)定之后,當(dāng)CPU要訪問(wèn)一個(gè)VA(Virtual Address)時(shí),MMU會(huì)檢查CPU當(dāng)前處于用戶模式還是特權(quán)模式,訪問(wèn)內(nèi)存的目的是讀數(shù)據(jù)、寫(xiě)數(shù)據(jù)還是取指令執(zhí)行,如果與操作系統(tǒng)設(shè)定的權(quán)限相符,則允許訪問(wèn),把VA轉(zhuǎn)換成PA,否則不允許執(zhí)行,產(chǎn)生異常(Exception)

在正常情況下處理器在用戶模式執(zhí)行用戶程序,在中斷或異常情況下處理器切換到特權(quán)模式執(zhí)行內(nèi)核程序,處理完中斷或異常之后再返回用戶模式繼續(xù)執(zhí)行用戶程序。

段錯(cuò)誤我們已經(jīng)遇到過(guò)很多次了,它是這樣產(chǎn)生的:

  1. 用戶程序要訪問(wèn)的一個(gè)虛擬機(jī)地址,經(jīng)MMU檢查無(wú)權(quán)訪問(wèn)。

  2. MMU產(chǎn)生一個(gè)異常,CPU從用戶模式切換到特權(quán)模式,跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行異常服務(wù)程序。

  3. 內(nèi)核把這個(gè)異常解釋為段錯(cuò)誤,把引發(fā)異常的進(jìn)程終止掉。

用戶空間與內(nèi)核通信方式有哪些?

1)系統(tǒng)調(diào)用。用戶空間進(jìn)程通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核空間,訪問(wèn)指定的內(nèi)核空間數(shù)據(jù);

2)共享映射區(qū)mmap。在代碼中調(diào)用接口,實(shí)現(xiàn)內(nèi)核空間與用戶空間的地址映射,在實(shí)時(shí)性要求很高的項(xiàng)目中為首選,省去拷貝數(shù)據(jù)的時(shí)間等資源,但缺點(diǎn)是不好控制;

3)驅(qū)動(dòng)程序。用戶空間進(jìn)程可以使用封裝后的系統(tǒng)調(diào)用接口訪問(wèn)驅(qū)動(dòng)設(shè)備節(jié)點(diǎn),以和運(yùn)行在內(nèi)核空間的驅(qū)動(dòng)程序通信;

4)copy_to_user()、copy_from_user(),是在驅(qū)動(dòng)程序中調(diào)用接口,實(shí)現(xiàn)用戶空間與內(nèi)核空間的數(shù)據(jù)拷貝操作,應(yīng)用于實(shí)時(shí)性要求不高的項(xiàng)目中。


內(nèi)存管理:詳解虛擬地址空間-MMU的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
揭阳市| 龙游县| 赫章县| 六枝特区| 含山县| 重庆市| 柳林县| 五常市| 望奎县| 浦城县| 孝感市| 衡南县| 英德市| 海丰县| 鹿邑县| 富宁县| 天峻县| 兴义市| 彝良县| 枣庄市| 定兴县| 云和县| 丰都县| 垫江县| 卫辉市| 车险| 商水县| 长汀县| 宁强县| 政和县| 麦盖提县| 松溪县| 怀集县| 元阳县| 庐江县| 桂阳县| 五大连池市| 吉林市| 专栏| 来安县| 介休市|