Pmem使用小结

部署运行你感兴趣的模型镜像

转自:http://blog.youkuaiyun.com/long19851105/article/details/6600452

基本原理

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很好的满足高通芯片中MDP、GPU等需要连续物理内存的设备,这里我稍微小结一些自己的理解,做个记录:
1.如何使用,这里要分两种情况:

     第一种:在一个进程中自己分配自己使用,直接open之后mmap就ok了。
     pmem_fd = open("/dev/pmem_device", O_RDWR, 0)
     pmem_base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0)

     第二种:需要在不同的进程中共享。这需要用到Pmem的Connect功能,先来理解下面的代码:
     pmem_fd0 = open("/dev/pmem_device", O_RDWR, 0)
     pmem_base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd0, 0)
     pmem_fd1 = open("/dev/pmem_device", O_RDWR, 0)
     ret = ioctl(pmem_fd1, PMEM_CONNECT, pmem_fd0)
     ret = ioctl(pmem_fd1 , PMEM_MAP, &region1)

     通过Connect之后,pmem_fd1就获得了和pmem_fd0同样的Pmem空间。一个进程打开Pmem设备,通过mmap操作映射内存到进程空间后,该进程成为了该Pmem的Master进程。其他进程通过Connect操作将自己的Pmem data和Master的Pmem data连接之后,就成为该Pmem的Client进程。在Android中,通过Binder, 实现了跨进程传递Pmem fd。相关代码见MemoryHeapBase.cpp和MemoryHeapPmem.cpp,具体使用可以看下面的简化代码:
     masterHeap = new MemoryHeapBase(Pmem_device,size,xxx)//对应主进程,申请Pmem
     clientHeap = new MemoryHeapPmem(masterHeap,xxx)//对应client进程,函数实现了connect操作
     clientHeap->slap() //对应mmap操作

2. 理解了上面,就不难理解下面surface操作的过程了:

   client = new SurfaceComposerClient()

   //向Surfaceflinger申请一个Surface,surface类型为PushBuffers
   surfaceControl = client->createSurface(getpid(), 0, W, H,PIXEL_FORMAT_RGBA_565, ISurfaceComposer::ePushBuffers)

   //获取ISurface对象
   isurface = Test::getISurface(surfaceControl)
   heap = new MemoryHeapBase(pmem_device, W * H)

   sp pmemHeap = new MemoryHeapPmem(heap, 0)

   pmemHeap->slap()

   mBufferHeap = ISurface::BufferHeap(W,H,PIXEL_FORMAT_BGRA_565, pmemHeap)

   isurface->registerBuffers(mBufferHeap)

   //得到buffer指针
   char * bp = static_cast(mBufferHeap.heap->base())

   //向buffer写位图数据,注意要是32位的
   XXXXXXXXXX

   //提交修改,通知Surface Flinger更新屏幕
   isurface->postBuffer(0)

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>我们正在讨论一个新的测试:PMEM Diode leakage @6V测试条件。根据用户提供的参数: - Int=3:积分次数(Integration count),表示测量时进行3次采样并取平均值,以提高精度 - adc=1:模数转换器设置(可能表示ADC分辨率或模式),具体需参考设备手册 - delay=1.00E-02:施加电压前的延迟时间(10ms),确保电路稳定 - rng=1E-13:电流量程设置为100fA(1e-13A),用于检测极微弱漏电流 - Force1=6.0:在SMU1上施加6.0V电压 - Compl1=2E-2:SMU1的电流合规值设为20mA(0.02A) - Pinsmu1="21":SMU1连接至引脚21(被测二极管阳极) - Gndpins="18 19 20 22":引脚18/19/20/22接地(二极管阴极) ### 测试原理与目的 该测试用于测量**相变存储器(PMEM)** 中二极管的漏电流特性。在6V反向偏置电压下,通过检测流过二极管的微小电流(fA级),评估其绝缘性能。二极管在PMEM结构中通常用作选通器件(Selector Device),其泄漏特性直接影响存储器单元的功耗和串扰[^1]。测试原理基于肖特基二极管的反向饱和电流公式: $$ I_s = A \cdot A^* \cdot T^2 \cdot e^{-\frac{q\phi_B}{kT}} $$ 其中 $I_s$ 为反向饱和电流,$A$ 为结面积,$\phi_B$ 为势垒高度。实际测量电流 $I_{\text{leak}} = I_s + I_{\text{defect}}$,其中 $I_{\text{defect}}$ 由工艺缺陷引起。通过@6V高压测试可加速暴露潜在缺陷[^2]。 ### 参数详解 | 参数 | 值/设置 | 物理意义 | |-------------|--------------|--------------------------------------------------------------------------| | **Force1** | 6.0 V | 施加的反向偏置电压,高压可检测弱势垒或缺陷导致的异常泄漏 | | **rng** | 1E-13 A | 电流量程(100fA),需匹配极低泄漏场景 | | **delay** | 0.01 s | 电压稳定等待时间,避免瞬态电流干扰 | | **Compl1** | 20 mA | 保护性限流,防止二极管击穿时损坏设备 | | **Int** | 3 | 多次积分取平均,降低噪声(尤其对fA级信号至关重要) | | **Gndpins** | 18,19,20,22 | 多引脚并联接地降低接触电阻,确保阴极电位稳定 | ### 测试设备要求 1. **高精度参数分析仪** 需支持fA级电流测量(如Keysight B1500A配备UHVU模块),关键指标: - 最小电流分辨率:≤0.1fA - 电压输出范围:0~±100V 2. **探针台与屏蔽环境** - 法拉第笼屏蔽外部电磁干扰 - 低噪声电缆(三重屏蔽同轴线) - 温控平台(测试通常在25℃±0.1℃进行) 3. **校准要求** - SMU通道需进行开尔文四线校准 - 每月执行一次fA级零点校准(Zero Calibration) ### 失效判据与典型值 - **合格标准**:$I_{\text{leak}} < 1 \text{fA}$ @6V(先进工艺节点) - **风险阈值**:$I_{\text{leak}} > 10 \text{fA}$ 可能预示以下问题: 1. 外延层缺陷(如位错导致局部电场增强) 2. 金属污染(增加产生-复合电流) 3. 边缘钝化失效(引起表面泄漏)[^3] ### 适用场景 1. **工艺开发阶段** 监控离子注入退火工艺对二极管特性的影响(如快速热退火RTA温度优化)。 2. **可靠性测试** 结合HTOL(高温工作寿命测试)评估二极管耐久性。 3. **量产监控** 通过抽样测试检测晶圆边缘的泄漏异常(边缘效应导致漏电流偏高)。 ### 测试配置示意图 ```plaintext ┌─────────────┐ │ 参数分析仪 │ │ SMU1 ────────► Pin 21 (Diode Anode) │ GND ──┬─────► Pin 18 (Cathode GND) │ ├─────► Pin 19 (Cathode GND) │ ├─────► Pin 20 (Cathode GND) └─────────┼─────► Pin 22 (Cathode GND) └───── 机箱接地(防静电) ``` > **注意**:多引脚接地(Gndpins="18 19 20 22")可减少接触电阻引起的压降误差,尤其对高压测试至关重要[^4]。 §§相关问题§§ 1. 为什么PMEM二极管需要在6V高压下测试漏电流?是否可通过降低电压缩短测试时间? 2. 测试中出现漏电流超标(>10fA)可能由哪些工艺缺陷引起?如何定位故障点? 3. 如何优化Int和delay参数以平衡测试精度与效率? [^1]: 相变存储器中二极管选通器件的电学特性要求。 [^2]: 半导体器件物理中的肖特基势垒模型。 [^3]: 晶圆制造中常见的二极管失效模式分析。 [^4]: 多引脚并联接地的优势与接地电阻计算。 </think>### PMEM Diode leakage @6V测试详解 #### 测试参数解析 根据您提供的测试条件: - **Int=3**:积分次数为3次,通过多次采样提高测量精度 - **adc=1**:模数转换器设置为标准模式(需结合设备手册确认具体ADC分辨率) - **delay=1.00E-02**:电压施加前的延迟时间 **0.01秒**,确保电路稳定 - **rng=1E-13**:电流量程 **100 fA** (femtoampere),适用于超低漏电流检测 - **Force1=6.0**:施加 **6.0V** 反向偏置电压 - **Compl1=2E-2**:合规电流限制 **20 mA**,保护器件不被击穿 - **Pinsmu1="21"**:SMU1连接引脚21(被测二极管阳极) - **Gndpins="18 19 20 22"**:引脚18/19/20/22并联接地(二极管阴极) --- #### 测试原理 该测试用于评估**相变存储器(PMEM)** 中二极管的漏电流特性,核心原理是通过施加反向高压(6V),检测二极管在关断状态下的微小泄漏电流: $$ I_{\text{leak}} = I_s \left( e^{\frac{qV}{kT}} - 1 \right) + I_{\text{defect}} $$ 其中: - $I_s$ 为反向饱和电流(理想值) - $I_{\text{defect}}$ 由工艺缺陷(如晶格损伤、金属污染)引起 - **测试目标**:量化 $I_{\text{defect}}$ 值,评估器件可靠性[^1] > **高压意义**:6V远超正常工作电压(通常1-3V),可加速暴露工艺缺陷(氧化物薄弱点/界面态),模拟长期老化效应。 --- #### 适用场景 1. **工艺开发验证** - 监控离子注入/退火工艺对二极管特性的影响 - 检测金属污染(如Fe、Cu离子导致漏电增加) 2. **可靠性筛选** - 识别早期失效器件(漏电流 >100 fA预示高风险) - HTOL(高温操作寿命)测试前的预筛 3. **故障分析** - 定位晶圆边缘失效(Edge defect) - 验证钝化层完整性(SiN/SiO₂界面质量)[^2] --- #### 设备要求 | 设备类型 | 关键规格 | 说明 | |-------------------|-----------------------------------|--------------------------| | **参数分析仪** | 电流分辨率 ≤0.1 fA | 如Keysight B1500A | | **探针台** | 屏蔽箱 + 低噪声电缆 | 抑制环境电磁干扰 | | **温控平台** | 精度 ±0.1℃ (@25℃) | 漏电流对温度敏感 | | **校准标准** | NIST可溯源标准电阻(10 GΩ) | 确保fA级测量精度 | > **设备配置要点**: > - SMU需启用**高阻模式**(>100 GΩ输入阻抗) > - 采用**开尔文连接**消除接触电阻误差 > - 接地引脚并联(Gndpins)降低回路电阻 --- #### 典型测试流程 ```mermaid graph TD A[初始化设备] --> B[校准SMU通道] B --> C[连接引脚:21→阳极/18-19-20-22→阴极] C --> D[设置参数:Force1=6V, rng=100fA] D --> E[延迟10ms后测量电流] E --> F[重复3次取平均值] F --> G[判定:I_leak < 50fA → 合格] ``` --- #### 失效判据与优化建议 - **失效阈值**: - **>50 fA** @6V → 工艺缺陷风险 - **>100 fA** @6V → 可靠性失效(需100%筛除) - **参数优化方向**: - 若噪声过大 → 提升 **Int** 至5-10次 - 若延迟不足 → 延长 **delay** 至0.1秒 - 低良率场景 → 增加 **Compl1** 至50mA(防误判)[^3] --- #### 故障诊断参考 若漏电流异常偏高: 1. **检查工艺步骤**: - 离子注入剂量是否超标($D_I > 1 \times 10^{15} cm^{-2}$) - 退火温度是否不足(需>400℃激活掺杂) 2. **分析失效定位**: - 通过 **EMMI**(发射显微镜)定位发光缺陷点 - **FIB-SEM** 切片观察界面缺陷[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值