0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

mmap原理詳解

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-09 14:59 ? 次閱讀
  1. 一句話概括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)存共享的作用。

  1. 虛擬內(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é)合兩者,如圖所示。

  1. 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è)上。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5357

    瀏覽量

    120576
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3031

    瀏覽量

    74119
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    568

    瀏覽量

    24765
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    拆解mmap內(nèi)存映射的本質(zhì)!

    mmap 內(nèi)存映射里所謂的內(nèi)存其實(shí)指的是虛擬內(nèi)存,在調(diào)用 mmap 進(jìn)行匿名映射的時(shí)候(比如進(jìn)行堆內(nèi)存的分配),是將進(jìn)程虛擬內(nèi)存空間中的某一段虛擬內(nèi)存區(qū)域與物理內(nèi)存中的匿名內(nèi)存頁(yè)進(jìn)行映射,當(dāng)調(diào)用
    的頭像 發(fā)表于 01-24 14:30 ?1787次閱讀
    拆解<b class='flag-5'>mmap</b>內(nèi)存映射的本質(zhì)!

    編譯例程partition_mmap,報(bào)錯(cuò)no such vaddr range怎么解決?

    內(nèi)存映射問(wèn)題:編譯例程partition_mmap,報(bào)錯(cuò)no such vaddr range怎么解決?
    發(fā)表于 09-26 07:03

    Linux的mmap文件內(nèi)存映射機(jī)制

    Linux的mmap文件內(nèi)存映射機(jī)制在講述文件映射的概念時(shí), 不可避免的要牽涉到虛存(SVR 4的VM). 實(shí)際上, 文件映射是虛存的中心概念, 文件映射一方面給用戶提供了一組措施, 好似用戶將文件
    發(fā)表于 03-08 09:54

    字符設(shè)備驅(qū)動(dòng)另一種寫法—mmap方法操作LED

    。經(jīng)過(guò)自己的研究之后,我發(fā)現(xiàn)還有另外一種寫法,直接在應(yīng)用層操作,省去了內(nèi)核中的地址映射部分,使得用戶可以在應(yīng)用層直接操作LED。 mmap方法是把設(shè)備物理地址直接映射到用戶空間的一種系統(tǒng)調(diào)用方法,他使得
    發(fā)表于 01-02 17:38

    dma_alloc_coherent申請(qǐng)內(nèi)存的訪問(wèn)速度,請(qǐng)問(wèn)有什么辦法能加快訪問(wèn)mmap的DMA內(nèi)存?

    使用dma_alloc_coherent申請(qǐng)了一塊內(nèi)存,然后使用mmap映射到用戶空間。然后,我用千兆網(wǎng)卡(CPSW驅(qū)動(dòng))進(jìn)行發(fā)送(UDP方式),測(cè)量到的速度僅有12.5MB/s。 我又另外做了一個(gè)測(cè)試
    發(fā)表于 06-04 07:47

    mmap()函數(shù)映射到內(nèi)存中出現(xiàn)bus error的錯(cuò)誤

    在2440開(kāi)發(fā)板上將一副BMP圖片顯示到LCD上(不用GUI),我的做法是將BMP圖片用mmap()函數(shù)映射到內(nèi)存中,在將其讀到Framebuffer設(shè)備中顯示(frambuffer有驅(qū)動(dòng)),映射
    發(fā)表于 02-25 12:42

    在arm里怎樣實(shí)現(xiàn)mmap編寫驅(qū)動(dòng)和應(yīng)用共享內(nèi)存呢

    ② 確定屬性:是否使用 cache、buffer③ 建立映射關(guān)系在file_operation里面建立mmap進(jìn)行mmap的函數(shù)編寫這樣在驅(qū)動(dòng)程序的內(nèi)存空間就被建立了映射,用應(yīng)用程序訪問(wèn)讀取,都行應(yīng)用程序
    發(fā)表于 05-17 09:59

    rt-smart qemu-vexpress-a9平臺(tái)mmap錯(cuò)誤是什么原因?

    mmap系統(tǒng)調(diào)用傳進(jìn)去的pgoffset有問(wèn)題是什么原因?
    發(fā)表于 11-01 11:06

    linux_mmap_access_performance

    linux 內(nèi)存訪問(wèn)提升性能的一片論文,需要理解kernel的mmap方式,比較適合優(yōu)化驅(qū)動(dòng)
    發(fā)表于 02-23 15:48 ?14次下載

    mmap系統(tǒng)調(diào)用和vmalloc獲取地址空間

    mmap()系統(tǒng)調(diào)用是在用戶進(jìn)程與內(nèi)核之間共享內(nèi)存區(qū)域的常用方法。我們最近有個(gè)程序,需要應(yīng)用進(jìn)程能夠讀取內(nèi)核驅(qū)動(dòng)獲取的數(shù)據(jù),經(jīng)過(guò)簡(jiǎn)單的調(diào)研,決定采用mmap方式。
    的頭像 發(fā)表于 02-02 16:13 ?4364次閱讀

    mmap作為L(zhǎng)inux內(nèi)存管理的關(guān)鍵之一

    mmap將一個(gè)文件或者其它對(duì)象映射進(jìn)內(nèi)存。文件被映射到多個(gè)頁(yè)上,如果文件的大小不是所有頁(yè)的大小之和,最后一個(gè)頁(yè)不被使用的空間將會(huì)清零。munmap執(zhí)行相反的操作,刪除特定地址區(qū)域的對(duì)象映射。
    發(fā)表于 04-28 17:16 ?620次閱讀
    <b class='flag-5'>mmap</b>作為L(zhǎng)inux內(nèi)存管理的關(guān)鍵之一

    linux drivers中的mmap實(shí)現(xiàn)

    將設(shè)備驅(qū)動(dòng)內(nèi)核空間的內(nèi)存映射到用戶空間里,可以通過(guò)用戶空間中的mmap系統(tǒng)調(diào)用代替系統(tǒng)調(diào)用write和read。目的是提高讀寫效率。
    發(fā)表于 05-15 10:31 ?1608次閱讀

    Linux的mmap文件內(nèi)存映射機(jī)制

    講述mmap和munmap系統(tǒng)調(diào)用了. mmap調(diào)用實(shí)際上就是一個(gè)內(nèi)存對(duì)象vma的創(chuàng)建過(guò)程, mmap的調(diào)用格式是:  void * mmap(void *start, size_t
    發(fā)表于 04-02 14:35 ?445次閱讀

    一文詳細(xì)了解mmap內(nèi)存映射

    mmap是一種內(nèi)存映射的方法,這一功能可以用在文件的處理上,即將一個(gè)文件或者其它對(duì)象映射到進(jìn)程的地址空間,實(shí)現(xiàn)文件磁盤地址和進(jìn)程虛擬地址空間中一段虛擬地址的一一對(duì)映關(guān)系。在編程時(shí)可以使某個(gè)磁盤文件
    的頭像 發(fā)表于 05-05 15:32 ?2393次閱讀

    內(nèi)核mmap_sem鎖的危害和相關(guān)優(yōu)化

    mmap_sem鎖是進(jìn)程為了保護(hù)自身虛擬地址空間不受多線程并發(fā)訪問(wèn)影響而設(shè)計(jì)的。
    的頭像 發(fā)表于 02-07 16:01 ?738次閱讀