基本原理
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 中內建...