9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
學習啦>學習電腦>電腦知識大全>

物理地址映射是什么

時間: 春健736 分享

  為了保證CPU執行指令時可正確訪問存儲單元,需將用戶程序中的邏輯地址轉換為運行時由機器直接尋址的物理地址,這一過程稱為地址映射。那么物理地址映射是什么呢?下面大家跟著學習啦小編一起來了解一下吧。

  物理地址映射方法

  一般情況下,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()函數中進行。

看過“ 物理地址映射是什么 ”的人還看了:

1.物理地址與虛擬地址映射

2.物理地址與虛擬地址怎么轉換

3.linux虛擬地址怎么映射物理地址

4.虛擬地址空間映射到物理地址空間

5.物理地址和邏輯地址的區別

720720 主站蜘蛛池模板: 亚洲码和欧洲码一二三四| 99中文字幕精品国产| 国产区精品视频自产自拍| 国产AV国片精品有毛| 亚洲天堂在线免费| 国产情侣激情在线对白| 国内不卡的一区二区三区| 国产欧美精品一区二区三区-老狼| 中文字幕无线码中文字幕免费| 国产成人午夜福利在线播放| 国产精一区二区黑人巨大| 另类 专区 欧美 制服丝袜| 久久人妻无码一区二区| 亚洲午夜爱爱香蕉片| 日韩成人高精品一区二区| 亚洲最大的成人网站| 神马视频| 五月天天天综合精品无码| 视频网站在线观看不卡| 国产综合久久99久久| 深夜av免费在线观看| 国产成人午夜福利在线播放| 国产精品亚洲五月天高清| 午夜福利影院不卡影院| 国产成人精品永久免费视频| 免费观看的AV毛片的网站不卡| 亚洲午夜成人精品电影在线观看 | 黑人巨大AV在线播放无码| 国产精品一区二区中文| 鲁一鲁一鲁一鲁一澡| 精品亚洲国产成人av在线| 成人亚洲欧美一区二区三区 | 少妇精品视频一码二码三| 天堂va欧美ⅴa亚洲va在线| 大地资源高清免费观看| 在线精品自拍亚洲第一区| 一级毛片网| 国产精品福利一区二区久久| 唐人社视频呦一区二区| 人妻少妇无码精品专区| 日韩人妻精品中文字幕|