日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hisi mmz内存管理

發布時間:2024/10/14 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hisi mmz内存管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

如圖所示,在海思平臺上將內存分為兩個部分:os內存和mmz內存。os內存指:由linux操作系統管理的內存;mmz內存:由mmz驅動模塊進行管理供媒體業務單獨使用的內存,在驅動加載時可以指定該模塊管理內存的大小:
insmod mmz.ko mmz=anonymous,0,0x4fa00000,6Manony=1 || report_error

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?????????該驅動主要由兩個文件組成:media-mem.c和mmz-userdev.c,加載驅動后相應的設備文件:/dev/mmz_userdev,應用層通過打開該設備文件進行ioctl(申請mmz內存、釋放mmz內存、重映射mmz內存到內核等)和直接mmap操作,而媒體底層驅動模塊則直接調用mmz驅動的導出接口進行相應操作。

二、數據結構

1、mmz區域描述符
hil_media_memory_zone描述了一個mmz區域的所有信息,可以有多個mmz區域,通過鏈表連接在一起。

struct hil_media_memory_zone {char name[HIL_MMZ_NAME_LEN+1]; //mmz區域名字:anonymousunsigned long gfp;???//區域標識:0unsigned long phys_start; //mmz區域起始物理地址:0x4fa00000unsigned long nbytes; //mmz區域大小:6Mstruct list_head list; //mmz鏈表unsigned char *bitmap; //位圖struct list_head mmb_list; //mmz區域的mmb鏈表,存放所有申請到的物理內存unsigned int alloc_type;unsigned long block_align;void (*destructor)(const void *); };

2、mmb內存描述符
hil_media_memory_block描述了從mmz區域申請一塊內存,同一個mmz區域內的所有mmb通過鏈表連接。
?

struct hil_media_memory_block { #ifndef MMZ_V2_SUPPORTunsigned int id;#endifchar name[HIL_MMB_NAME_LEN+1]; //該mmb模塊使用者名字struct hil_media_memory_zone *zone; //指向mmb所屬的mmz區域struct list_head list; //mmb鏈表unsigned long phys_addr; //申請到的mmb起始物理地址void *kvirt;??//對應內核虛擬地址,從代碼看未用unsigned long length; //申請的mmb大小unsigned long flags; //標識unsigned int order;int phy_ref; //引用計數int map_ref; //引用計數 };

3、mmz_userdev_info

該結構體保存打開該設備文件的進程信息,存放在file結構體的private_data成員里。

struct mmz_userdev_info {pid_t pid; ????????//打開設備文件的進程pidpid_t mmap_pid;struct semaphore sem; //信號量struct list_head list; //指向mmb_info鏈表 };

4、mmb_info

該結構體描述應用申請到mmb后的相關信息,同進程的mmb_info通過鏈表形式管理。
?

struct mmb_info {unsigned long phys_addr;????//申請到的物理內存,同mmb.phys.addrunsigned long align;????????/* ifyou need your phys-memory have special align size */unsigned long size;?????//申請的物理內存大小unsigned int order;void *mapped;???????//指向mmap后的虛擬地址空間union {struct {unsigned long prot??:8; /*PROT_READ or PROT_WRITE */unsigned long flags :12;/* MAP_SHARED or MAP_PRIVATE */#ifdef __KERNEL__unsigned long reserved :8; /* reserved, do not use */unsigned long delayed_free :1;unsigned long map_cached :1;#endif};unsigned long w32_stuf;};char mmb_name[HIL_MMB_NAME_LEN+1];char mmz_name[HIL_MMZ_NAME_LEN+1];unsigned long gfp;??????/*reserved, do set to 0 */#ifdef __KERNEL__int map_ref;int mmb_ref;???struct list_head list;????//mmb_info鏈表hil_mmb_t *mmb;?????//指向申請到的mmb#endif };

三、關系圖

1、mmz和mmb關系
下圖展示了mmz驅動管理mmz和mmb的關系。mmz驅動模塊支持多個mmz區域,只要在加載mmz.ko時通過參數傳遞即可,一般情況下只有一個mmz區域。多個mmz區域之間通過鏈表的形式組織在一起,鏈表頭為mmz_list;而每個mmz區域通過mmb_list維護mmb鏈表,管理該區域內所有已經申請了的物理內存區域;每個mmb通過zone成員知道自己屬于哪個mmz區域。

?????????通過/proc/media-mem可以查看mmz和mmb使用情況:

+---ZONE: PHYS(0x4FA00000, 0x4FFFFFFF),GFP=0, nBYTES=6144KB,??NAME="anonymous"

??|-MMB: phys(0x4FA00000, 0x4FA81FFF), kvirt=0x??(null), flags=0x00000000, length=520KB,???????name="DCCM_MSG_BUF"

??|-MMB: phys(0x4FA82000, 0x4FA84FFF), kvirt=0x??(null), flags=0x00000000, length=12KB,????????name="SYS_scale_coef"

??|-MMB: phys(0x4FA85000, 0x4FA87FFF), kvirt=0x??(null), flags=0x00000000, length=12KB,????????name="SYS_scale_coef"

??|-MMB: phys(0x4FA88000, 0x4FB07FFF), kvirt=0x??(null), flags=0x00000000, length=512KB,???????name="TDE_MemPool"

???|-MMB: phys(0x4FB08000, 0x4FB3CFFF),kvirt=0x??(null), flags=0x00000000,length=212KB,??????name="IVE_QUEUE"

??|-MMB: phys(0x4FB3D000, 0x4FB3DFFF), kvirt=0x??(null), flags=0x00000000, length=4KB,name="IVE_TEMP_NODE"

---MMZ_USE_INFO:

?total size=6144KB(6MB),used=1272KB(1MB +248KB),remain=4872KB(4MB + 776KB),zone_number=1,block_number=6

? ? ? ? ? ? ? ? ? ? ? ?

2、mmb、mmb_info和mmb_userdev_info關系
?????????下圖展示了mmz驅動和應用申請數據結構之間的關系:

當應用打開設備文件/dev/mmz_userdev時會申請一個屬于該進程的mmb_userdev_info結構體,mmb_userdev_info成員list指向屬于該進程的所有mmb_info,mmb_info的mmb成員指向為其分配的mmb,而*mmaped存放mmb物理內存(phy_addr)進行映射后的虛擬地址供用戶空間使用。

由于mmz大部分為媒體業務獨立使用,內存在媒體硬件模塊流轉,應用無需訪問,這時不用映射,只有當應用需要訪問時才需要進行映射。可以把mmz管理的整個內存看做存儲盤上的一個大文件,應用層要訪問mmz的物理內存通過mmap方式進行映射(類似文件),映射的文件偏移就是mmb.phy_addr,映射大小就是申請的mmb.length,通過mmap方式映射到內核后根據返回的虛擬地址就可以訪問該mmb內存。
?

總結

以上是生活随笔為你收集整理的hisi mmz内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。