色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

mmap原理詳解

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-09 14:59 ? 次閱讀
  1. 一句話概括mmap

mmap的作用,在應用這一層,是讓你把文件的某一段,當作內存一樣來訪問。將文件映射到物理內存,將進程虛擬空間映射到那塊內存。

這樣,進程不僅能像訪問內存一樣讀寫文件,多個進程映射同一文件,還能保證虛擬空間映射到同一塊物理內存,達到內存共享的作用。

  1. 虛擬內存?虛擬空間?

其實是一個概念,前一篇對于這個詞沒有確切的定義,現在定義一下:

虛擬空間就是進程看到的所有地址組成的空間,虛擬空間是某個進程對分配給它的所有物理地址(已經分配的和將會分配的)的重新映射。

而虛擬內存,為啥叫虛擬內存,是因為它就不是真正的內存,是假的,因為它是由地址組成的空間,所以在這里,使用虛擬空間這個詞更加確切和易懂。(不過虛擬內存這個詞也不算錯)

2.1 虛擬空間原理

2.1.1物理內存

首先,物理地址實際上也不是連續的,通常是包含作為主存的DRAM和IO寄存器

圖片

以前的CPU(如X86)是為IO劃分單獨的地址空間,所以不能用直接訪問內存的方式(如指針)IO,只能用專門的方法(in/read/out/write)諸如此類。

現在的CPU利用PCI總線將IO寄存器映射到物理內存,所以出現了基于內存訪問的IO。

還有一點補充的,就如同進程空間有一塊內核空間一樣,物理內存也會有極小一部分是不能訪問的,為內核所用。

2.1.2三個總線

這里再補充下三個總線的知識,即:地址總線、數據總線、控制總線

  • 地址總線,用來傳輸地址
  • 數據總線,用來傳輸數據
  • 控制總線,用來傳輸命令

比如CPU通過控制總線發送讀取命令,同時用地址總線發送要讀取的數據虛地址,經過MMU后到內存

內存通過數據總線將數據傳輸給CPU。

虛擬地址的空間和指令集的地址長度有關,不一定和物理地址長度一致,比如現在的64位處理器,從VA角度看來,可以訪問64位的地址,但地址總線長度只有48位,所以你可以訪問一個位于2^52這個位置的地址。

2.1.3虛擬內存地址轉換(虛地址轉實地址)

上面已經明確了虛擬內存是虛擬空間,即地址的集合這一概念。基于此,來說說原理。

如果還記得操作系統課程里面提到的虛地址,那么這個虛地址就是虛擬空間的地址了,虛地址通過轉換得到實地址,轉換方式課程內也講得很清楚,虛地址頭部包含了頁號(段地址和段大小,看存儲模式:頁存儲、段存儲,段頁式),剩下部分是偏移量,經過MMU轉換成實地址。

圖片

存儲方式

圖片

如圖則是頁式存儲動態地址變換的方式

虛擬地址頭部為頁號通過查詢頁表得到物理頁號,假設一頁時1K,那么頁號*偏移量就得到物理地址

圖片

如圖所示,段式存儲

虛擬地址頭部為段號,段表中找到段基地址加上偏移量得到實地址

圖片

段頁式結合兩者,如圖所示。

  1. mmap映射

至此,如果對虛擬空間已經了解了,那么接下來,作為coder,應該自動把虛擬空間無視掉,因為Linux的目的也是要讓更多額進程能享用內存,又不讓進程做麻煩的事情,是將虛擬空間和MMU都透明化,讓進程(和coder)只需要管對內存怎樣使用。

所以現在開始不再強調虛擬空間了。

mmap就是將文件映射到內存上,進程直接對內存進行讀寫,然后就會反映到磁盤上。

圖片

  • 虛擬空間獲取到一段連續的地址
  • 在沒有讀寫的時候,這個地址指向不存在的地方(所以,上圖中起始地址和終止地址是還沒分配給 進程的)
  • 好了,根據偏移量,進程要讀文件數據了,數據占在兩個頁當中(物理內存著色部分)
  • 這時,進程開始使用內存了,所以OS給這兩個頁分配了內存(即缺頁異常)(其余部分還是沒有分配)
  • 然后剛分配的頁內是空的,所以再將相同偏移量的文件數據拷貝到物理內存對應頁上。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120235
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74008
  • 文件
    +關注

    關注

    1

    文章

    565

    瀏覽量

    24732
收藏 人收藏

    評論

    相關推薦

    拆解mmap內存映射的本質!

    mmap 內存映射里所謂的內存其實指的是虛擬內存,在調用 mmap 進行匿名映射的時候(比如進行堆內存的分配),是將進程虛擬內存空間中的某一段虛擬內存區域與物理內存中的匿名內存頁進行映射,當調用
    的頭像 發表于 01-24 14:30 ?1706次閱讀
    拆解<b class='flag-5'>mmap</b>內存映射的本質!

    編譯例程partition_mmap,報錯no such vaddr range怎么解決?

    內存映射問題:編譯例程partition_mmap,報錯no such vaddr range怎么解決?
    發表于 09-26 07:03

    Linux的mmap文件內存映射機制

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

    字符設備驅動另一種寫法—mmap方法操作LED

    。經過自己的研究之后,我發現還有另外一種寫法,直接在應用層操作,省去了內核中的地址映射部分,使得用戶可以在應用層直接操作LED。 mmap方法是把設備物理地址直接映射到用戶空間的一種系統調用方法,他使得
    發表于 01-02 17:38

    dma_alloc_coherent申請內存的訪問速度,請問有什么辦法能加快訪問mmap的DMA內存?

    使用dma_alloc_coherent申請了一塊內存,然后使用mmap映射到用戶空間。然后,我用千兆網卡(CPSW驅動)進行發送(UDP方式),測量到的速度僅有12.5MB/s。 我又另外做了一個測試
    發表于 06-04 07:47

    mmap()函數映射到內存中出現bus error的錯誤

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

    在arm里怎樣實現mmap編寫驅動和應用共享內存呢

    ② 確定屬性:是否使用 cache、buffer③ 建立映射關系在file_operation里面建立mmap進行mmap的函數編寫這樣在驅動程序的內存空間就被建立了映射,用應用程序訪問讀取,都行應用程序
    發表于 05-17 09:59

    rt-smart qemu-vexpress-a9平臺mmap錯誤是什么原因?

    mmap系統調用傳進去的pgoffset有問題是什么原因?
    發表于 11-01 11:06

    linux_mmap_access_performance

    linux 內存訪問提升性能的一片論文,需要理解kernel的mmap方式,比較適合優化驅動
    發表于 02-23 15:48 ?14次下載

    mmap系統調用和vmalloc獲取地址空間

    mmap()系統調用是在用戶進程與內核之間共享內存區域的常用方法。我們最近有個程序,需要應用進程能夠讀取內核驅動獲取的數據,經過簡單的調研,決定采用mmap方式。
    的頭像 發表于 02-02 16:13 ?4336次閱讀

    mmap作為Linux內存管理的關鍵之一

    mmap將一個文件或者其它對象映射進內存。文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最后一個頁不被使用的空間將會清零。munmap執行相反的操作,刪除特定地址區域的對象映射。
    發表于 04-28 17:16 ?613次閱讀
    <b class='flag-5'>mmap</b>作為Linux內存管理的關鍵之一

    linux drivers中的mmap實現

    將設備驅動內核空間的內存映射到用戶空間里,可以通過用戶空間中的mmap系統調用代替系統調用write和read。目的是提高讀寫效率。
    發表于 05-15 10:31 ?1601次閱讀

    Linux的mmap文件內存映射機制

    講述mmap和munmap系統調用了. mmap調用實際上就是一個內存對象vma的創建過程, mmap的調用格式是:  void * mmap(void *start, size_t
    發表于 04-02 14:35 ?438次閱讀

    一文詳細了解mmap內存映射

    mmap是一種內存映射的方法,這一功能可以用在文件的處理上,即將一個文件或者其它對象映射到進程的地址空間,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系。在編程時可以使某個磁盤文件
    的頭像 發表于 05-05 15:32 ?2379次閱讀

    內核mmap_sem鎖的危害和相關優化

    mmap_sem鎖是進程為了保護自身虛擬地址空間不受多線程并發訪問影響而設計的。
    的頭像 發表于 02-07 16:01 ?717次閱讀
    主站蜘蛛池模板: 在线观看永久免费网址| 成人在无码AV在线观看一| 国模玲玲自拍337p| 色尼姑久久超碰在线| china男士同性视频tv| 噜噜噜狠狠夜夜躁| 自拍黄色片| 狂躁美女BBBBBB视频| 曰韩一本道高清无码av| 韩国演艺圈悲惨在线| 亚洲欧美强伦一区二区另类| 国产精品第1页在线观看| 视频一区国产在线二区| 俄罗斯摘花| 乌克兰内射私拍| 国产精品亚洲高清一区二区 | 俄罗斯兽交XXXXX在线| 日韩熟女精品一区二区三区| 大胸美女脱内衣黄网站| 秋霞鲁丝片Av无码| 国产99精品在线观看| 乌克兰粉嫩摘花第一次| 国产香蕉尹人视频在线| 亚洲国产在线视频中文字| 黑人巨大交牲老太| 伊人伊人影院| 欧美残忍xxxx极端| 国产1广场舞丰满老女偷| 乡村教师电影版| 久久re热线视频国产| 91在线一区二区| 日韩欧美群交P内射捆绑| 国产精品免费观看视频| 亚洲欧美综合在线中文| 秘密影院久久综合亚洲综合| sihu国产精品永久免费| 学校女性奴sm训练调教| 快播h动漫网站| 国产成人久久AV免费看澳门| 亚洲精品在线影院| 免费完整版观看|