Pmem使用小結

2021-06-02 10:47:11 字數 1759 閱讀 3400

基本原理

android pmem是為了實現共享大尺寸連續物理記憶體而開發的一種機制,該機制對dsp,gpu等部件非常有用。pmem相當於把系統記憶體劃分出一部分單獨管理,即不被linux mm管理,實際上linux mm根本看不到這段記憶體。

pmem與ashmem的區別

pmem和ashmem都通過mmap來實現共享記憶體,其區別在於pmem的共享區域是一段連續的物理記憶體,而ashmem的共享區域在虛擬空間是連續的,物理記憶體卻不一定連續。dsp和某些裝置只能工作在連續的物理記憶體上,這樣cpu與dsp之間的通訊就需要通過pmem來實現。

pmem的實現

pmem的源**在drivers/misc/pmem.c中,pmem驅動依賴於linux的misc device和platform driver框架,乙個系統可以有多個pmem,預設的是最多10個。pmem暴露4組操作,分別是platform driver的probe和remove操作; misc device的fops介面和vm_ops操作。模組初始化時會註冊乙個platform driver,在之後probe時,建立misc裝置檔案,分配記憶體,完成初始化工作。

pmem通過pmem_info,pmem_data,pmem_region三個結構體維護分配的共享記憶體,其中pmem_info代表乙個pmem裝置分配的記憶體塊,pmem_data代表該記憶體塊的乙個子塊,pmem_region則把每個子塊分成多個區域。 pmem_data是分配的基本單位,即每次應用層要分配一塊pmem記憶體,就會有乙個pmem_data來表示這個被分配的記憶體塊,實際上在open的時候,並不是open乙個pmem_info表示的整個pmem記憶體塊,而是建立乙個pmem_data以備使用。乙個應用可以通過ioctl來分配 pmem_data中的乙個區域,並可以把它map到程序空間;並不一定每次都要分配和map整個pmem_data記憶體塊。

上面三個資料結構的關係可以用下面的圖來表示

pmem驅動會建立/dev/pme、/dev/adsp,實現了pmem_open,pmem_mmap,pmem_release和pmem_ioctl,應用層可以通過open,mmap,close,ioctl來操作pmem裝置檔案。其中ioctl支援的命令如下:

l pmem_get_phys獲取實體地址

l pmem_map對映一段記憶體

l pmem_get_size返回pmem分配的記憶體大小

l pmem_unmapunmap一段記憶體

l pmem_allocate分配pmem空間,len 是引數,如果已分配則失敗

l pmem_connect將乙個pmem file與其他相連線

l pmem_get_total_size返回pmem device記憶體的大小

使用者介面

乙個程序首先開啟pmem裝置,通過ioctl(pmem_allocate)分配記憶體,它mmap這段記憶體到自己的程序空間後,該程序成為 master程序。其他程序可以重新開啟這個pmem設 備,通過呼叫ioctl(pmem_connect)將自己的pmem_data與master程序的pmem_data建立連線關係,這個程序就成為client程序。client程序可以通過mmap將master pmem中的一段或全部重新對映到自己的程序空間,這樣就實現了共享pmem記憶體。如果是gpu或dsp則可以通過ioctl(pmem_get_phys)獲取實體地址進行操作

Pmem使用小結

基本原理 android pmem是為了實現共享大尺寸連續物理記憶體而開發的一種機制,該機制對dsp,gpu等部件非常有用。pmem相當於把系統記憶體劃分出一部分單獨管理,即不被linux mm管理,實際上linux mm根本看不到這段記憶體。pmem與ashmem的區別 pmem和ashmem都通...

Pmem 移植與測試

為了在video裝置中分配大塊連續物理記憶體,移植android pmem 驅動部分 1 pmem driver 檔案從android linux中copy,並配置好makefile和config 2 在devs.c中新增 ifdef config android pmem include incl...

Xshell使用小結

複製和貼上 複製 ctrl insert 貼上 shift insert 另外還可以設定點滑鼠右鍵就是貼上,設定選項在 tools options general 的right button 但如果此項設定了之後,右鍵選單就沒有了。將當前 shell 中的內容複製到 記事本 中 xshell 中內建...