- 一句話概括mmap
mmap的作用,在應(yīng)用這一層,是讓你把文件的某一段,當(dāng)作內(nèi)存一樣來(lái)訪問(wèn)。將文件映射到物理內(nèi)存,將進(jìn)程虛擬空間映射到那塊內(nèi)存。
這樣,進(jìn)程不僅能像訪問(wèn)內(nèi)存一樣讀寫文件,多個(gè)進(jìn)程映射同一文件,還能保證虛擬空間映射到同一塊物理內(nèi)存,達(dá)到內(nèi)存共享的作用。
- 虛擬內(nèi)存?虛擬空間?
其實(shí)是一個(gè)概念,前一篇對(duì)于這個(gè)詞沒(méi)有確切的定義,現(xiàn)在定義一下:
虛擬空間就是進(jìn)程看到的所有地址組成的空間,虛擬空間是某個(gè)進(jìn)程對(duì)分配給它的所有物理地址(已經(jīng)分配的和將會(huì)分配的)的重新映射。
而虛擬內(nèi)存,為啥叫虛擬內(nèi)存,是因?yàn)樗筒皇钦嬲膬?nèi)存,是假的,因?yàn)樗怯傻刂方M成的空間,所以在這里,使用虛擬空間這個(gè)詞更加確切和易懂。(不過(guò)虛擬內(nèi)存這個(gè)詞也不算錯(cuò))
2.1 虛擬空間原理
2.1.1物理內(nèi)存
首先,物理地址實(shí)際上也不是連續(xù)的,通常是包含作為主存的DRAM和IO寄存器
以前的CPU(如X86)是為IO劃分單獨(dú)的地址空間,所以不能用直接訪問(wèn)內(nèi)存的方式(如指針)IO,只能用專門的方法(in/read/out/write)諸如此類。
現(xiàn)在的CPU利用PCI總線將IO寄存器映射到物理內(nèi)存,所以出現(xiàn)了基于內(nèi)存訪問(wèn)的IO。
還有一點(diǎn)補(bǔ)充的,就如同進(jìn)程空間有一塊內(nèi)核空間一樣,物理內(nèi)存也會(huì)有極小一部分是不能訪問(wèn)的,為內(nèi)核所用。
2.1.2三個(gè)總線
這里再補(bǔ)充下三個(gè)總線的知識(shí),即:地址總線、數(shù)據(jù)總線、控制總線
- 地址總線,用來(lái)傳輸?shù)刂?/li>
- 數(shù)據(jù)總線,用來(lái)傳輸數(shù)據(jù)
- 控制總線,用來(lái)傳輸命令
比如CPU通過(guò)控制總線發(fā)送讀取命令,同時(shí)用地址總線發(fā)送要讀取的數(shù)據(jù)虛地址,經(jīng)過(guò)MMU后到內(nèi)存
內(nèi)存通過(guò)數(shù)據(jù)總線將數(shù)據(jù)傳輸給CPU。
虛擬地址的空間和指令集的地址長(zhǎng)度有關(guān),不一定和物理地址長(zhǎng)度一致,比如現(xiàn)在的64位處理器,從VA角度看來(lái),可以訪問(wèn)64位的地址,但地址總線長(zhǎng)度只有48位,所以你可以訪問(wèn)一個(gè)位于2^52這個(gè)位置的地址。
2.1.3虛擬內(nèi)存地址轉(zhuǎn)換(虛地址轉(zhuǎn)實(shí)地址)
上面已經(jīng)明確了虛擬內(nèi)存是虛擬空間,即地址的集合這一概念?;诖耍瑏?lái)說(shuō)說(shuō)原理。
如果還記得操作系統(tǒng)課程里面提到的虛地址,那么這個(gè)虛地址就是虛擬空間的地址了,虛地址通過(guò)轉(zhuǎn)換得到實(shí)地址,轉(zhuǎn)換方式課程內(nèi)也講得很清楚,虛地址頭部包含了頁(yè)號(hào)(段地址和段大小,看存儲(chǔ)模式:頁(yè)存儲(chǔ)、段存儲(chǔ),段頁(yè)式),剩下部分是偏移量,經(jīng)過(guò)MMU轉(zhuǎn)換成實(shí)地址。
存儲(chǔ)方式
如圖則是頁(yè)式存儲(chǔ)動(dòng)態(tài)地址變換的方式
虛擬地址頭部為頁(yè)號(hào)通過(guò)查詢頁(yè)表得到物理頁(yè)號(hào),假設(shè)一頁(yè)時(shí)1K,那么頁(yè)號(hào)*偏移量就得到物理地址
如圖所示,段式存儲(chǔ)
虛擬地址頭部為段號(hào),段表中找到段基地址加上偏移量得到實(shí)地址
段頁(yè)式結(jié)合兩者,如圖所示。
- mmap映射
至此,如果對(duì)虛擬空間已經(jīng)了解了,那么接下來(lái),作為coder,應(yīng)該自動(dòng)把虛擬空間無(wú)視掉,因?yàn)?a href="http://wenjunhu.com/v/tag/538/" target="_blank">Linux的目的也是要讓更多額進(jìn)程能享用內(nèi)存,又不讓進(jìn)程做麻煩的事情,是將虛擬空間和MMU都透明化,讓進(jìn)程(和coder)只需要管對(duì)內(nèi)存怎樣使用。
所以現(xiàn)在開(kāi)始不再?gòu)?qiáng)調(diào)虛擬空間了。
mmap就是將文件映射到內(nèi)存上,進(jìn)程直接對(duì)內(nèi)存進(jìn)行讀寫,然后就會(huì)反映到磁盤上。
- 虛擬空間獲取到一段連續(xù)的地址
- 在沒(méi)有讀寫的時(shí)候,這個(gè)地址指向不存在的地方(所以,上圖中起始地址和終止地址是還沒(méi)分配給 進(jìn)程的)
- 好了,根據(jù)偏移量,進(jìn)程要讀文件數(shù)據(jù)了,數(shù)據(jù)占在兩個(gè)頁(yè)當(dāng)中(物理內(nèi)存著色部分)
- 這時(shí),進(jìn)程開(kāi)始使用內(nèi)存了,所以O(shè)S給這兩個(gè)頁(yè)分配了內(nèi)存(即缺頁(yè)異常)(其余部分還是沒(méi)有分配)
- 然后剛分配的頁(yè)內(nèi)是空的,所以再將相同偏移量的文件數(shù)據(jù)拷貝到物理內(nèi)存對(duì)應(yīng)頁(yè)上。
-
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120576 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3031瀏覽量
74119 -
文件
+關(guān)注
關(guān)注
1文章
568瀏覽量
24765
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論