• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 學習電腦 > 網絡知識 > 網絡基礎知識 > 物理地址與虛擬地址映射

    物理地址與虛擬地址映射

    時間: 春健736 分享

    物理地址與虛擬地址映射

      MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為物理地址、硬件地址,用來定義網絡設備的位置。今天學習啦小編給大家介紹一下物理地址與虛擬地址的映射吧。供大家參考!

      物理地址虛擬地址映射

      參考如下

      一般情況下,Linux系統中,進程的4GB內存空間被劃分成為兩個部分------用戶空間和內核空間,大小分別為0~3G,3~4G。

      用戶進程通常情況下,只能訪問用戶空間的虛擬地址,不能訪問到內核空間。

      每個進程的用戶空間都是完全獨立、互不相干的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它并不會跟著進程改變,是固定的。內核空間地址有自己對應的頁表,內核的虛擬空間獨立于其他程序。

      3~4G之間的內核空間中,從低地址到高地址依次為:物理內存映射區—隔離帶—vmalloc虛擬內存分配區—隔離帶—高端內存映射區—專用頁面映射區—保留區。

      【內核空間內存動態申請】

      主要包括三個函數:kmalloc(), __get_free_pages, vmalloc。

      kmalloc(), __get_free_pages申請的內存位于物理地址映射區,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。而vmalloc申請的內存位于vmalloc虛擬內存分配區(這些區都是以線性地址為度量),它在虛擬內存空間給出一塊連續的內存區,實質上,這片連續的虛擬內存在物理內存中并不一定連續,而vmalloc申請的虛擬內存和物理內存之間也沒有簡單的換算關系。

      因為vmalloc申請的在虛擬內存空間連續的內存區在物理內存中并不一定連續,可以想象為了完成vmalloc,新的頁表需要被建立,因此,知識調用vmalloc來分配少量內存是不妥的。

      一般來講,kmalloc用來分配小于128K的內存,而更大的內存塊需要用vmalloc來實現。

      【虛擬地址與物理地址關系】

      對于內核物理內存映射區的虛擬內存(用kmalloc(), __get_free_pages申請的),使用virt_to_phys()和phys_to_virt()來實現物理地址和內核虛擬地址之間的互相轉換。它實際上,僅僅做了3G的地址移位。

      上述方法適用于常規內存(內核物理內存映射區),高端內存的虛擬地址與物理地址之間不存在如此簡單的換算關系。因為它涉及到了分離物理頁的頁表控制機制。

      【ioremap】

      在ARM中,設備的寄存器或者存儲塊的這部分空間屬于內存空間的一部分,我們稱之為IO內存。

      在內核中訪問IO內存之前,我們只有IO內存的物理地址,這樣是無法通過軟件直接訪問的,需要首先用ioremap()函數將設備所處的物理地址映射到內核虛擬地址空間(3GB~4GB)。然后,才能根據映射所得到的內核虛擬地址范圍,通過訪問指令訪問這些IO內存資源。

      在將I/O內存資源的物理地址映射成核心虛地址后,理論上講我們就可以象讀寫RAM那樣直接讀寫I/O內存資源了。為了保證驅動程序的跨平臺的可移植性,我們應該使用Linux中特定的函數來訪問I/O內存資源,而不應該通過指向核心虛地址的指針來訪問。

      【mmap】

      用mmap映射一個設備,意味著使用戶空間的一段地址關聯到設備內存上,這使得只要程序在分配的地址范圍內進行讀取或者寫入,實際上就是對設備的訪問。這種數據傳輸是直接的,不需要用到內核空間作為數據轉移的中間站。

      remap_page_range函數的功能是構造用于映射一段物理地址的新頁表,實現了內核空間與用戶空間的映射。

      在內核驅動程序的初始化階段,通過ioremap()將物理地址映射到內核虛擬空間;在驅動程序的mmap系統調用中,使用remap_page_range()將該塊ROM映射到用戶虛擬空間。這樣內核空間和用戶空間都能訪問這段被映射后的虛擬地址。

      Ioremap:

      進程空間ç內核空間çIO內存

      其中,后面兩個指的是同一段物理內存區域,只是一個為虛擬地址,一個為物理地址。進程空間和內核空間對應著不同的物理地址,它們之間的數據傳遞,是實際的數據的拷貝。

      Mmap:

      進程空間çIO內存

      其中,進程空間mmap得到的那段虛擬地址跟IO內存對應著同一段物理地址。這個過程沒有額外的數據中轉,讀寫都直接針對硬件的物理地址進行。

      一般來講,小數據量的傳輸用ioremap()就足夠了,

      【IO內存的一般訪問方法】

      1. 首先是調用request_mem_region()申請資源,即告訴內核,本驅動正在使用這段物理內存,其他驅動不得訪問它們。在設備驅動模塊加載或open()函數中進行。

      2. 接著講寄存器地址通過ioremap()映射到內核空間虛擬地址,之后就可以通過Linux設備訪問編程接口訪問這些設備的寄存器了。在設備驅動初始化、write(),read(),ioctl()函數中進行。

      3. 訪問完成之后,應對ioremap()申請的虛擬地址進行釋放,并釋放release_mem_region()申請的IO內存資源。在設備驅動模塊卸載或release()函數中進行。

      學習啦小編介紹了物理地址虛擬地址映射的相關知識,希望你喜歡。

    579959 主站蜘蛛池模板: 天天碰免费视频| 99视频精品全部在线播放| 久久精品视频免费看| 亚洲欧美综合一区| 免费看少妇作爱视频| 国产亚洲欧美日韩亚洲中文色| 国产麻豆一精品一aV一免费| 嫩草影院在线播放www免费观看| 日本特黄特色aaa大片免费| 欧美一区二区三区在线观看 | 99在线免费观看视频| 三上悠亚日韩精品一区在线| 久久久伊人影院| 久久国产精彩视频| 久久无码人妻一区二区三区午夜| 亚洲乱码卡三乱码新区| 亚洲午夜精品一区二区公牛电影院 | 久久亚洲av无码精品色午夜| 亚洲AV日韩精品久久久久久| 亚洲国产品综合人成综合网站 | 四虎在线成人免费网站| 1000部国产成人免费视频| 97国产在线视频公开免费| 99久久综合精品五月天| 99re视频在线播放| 亚洲综合伊人制服丝袜美腿 | 久香草视频在线观看免费| 亚洲一区二区精品视频| 久久精品国产网红主播| 久久伊人精品热在75| 中文字幕丰满伦子无码| 一区二区视频免费观看| 99精品热视频| 18禁免费无码无遮挡不卡网站 | chinese18国产高清| 人人爽天天爽夜夜爽曰| 青青青国产免费线在| 精品无人区麻豆乱码1区2区| 熟妇人妻videos| 最近2019中文字幕无吗| 无码A级毛片日韩精品|