更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_vm_shm_pri.h 文件参考

浏览源代码.

函数

VOID OsShmFork (LosVmSpace *space, LosVmMapRegion *oldRegion, LosVmMapRegion *newRegion)
 fork 一个共享线性区 更多...
 
VOID OsShmRegionFree (LosVmSpace *space, LosVmMapRegion *region)
 释放共享线性区 更多...
 
BOOL OsIsShmRegion (LosVmMapRegion *region)
 是否为共享线性区,是否有标签? 更多...
 

函数说明

◆ OsIsShmRegion()

BOOL OsIsShmRegion ( LosVmMapRegion region)

是否为共享线性区,是否有标签?

在文件 shm.c435 行定义.

436{
437 return (region->regionFlags & VM_MAP_REGION_FLAG_SHM) ? TRUE : FALSE;
438}
UINT32 regionFlags
Definition: los_vm_map.h:125
这是这个函数的调用关系图:

◆ OsShmFork()

VOID OsShmFork ( LosVmSpace space,
LosVmMapRegion oldRegion,
LosVmMapRegion newRegion 
)

fork 一个共享线性区

在文件 shm.c393 行定义.

394{
395 struct shmIDSource *seg = NULL;
396
397 SYSV_SHM_LOCK();
398 seg = ShmFindSeg(oldRegion->shmid);//通过老区ID获取对应的共享资源ID结构体
399 if (seg == NULL) {
400 SYSV_SHM_UNLOCK();
401 VM_ERR("shm fork failed!");
402 return;
403 }
404
405 newRegion->shmid = oldRegion->shmid;//一样的共享区ID
406 newRegion->forkFlags = oldRegion->forkFlags;//forkFlags也一样了
407 ShmVmmMapping(space, &seg->node, newRegion->range.base, newRegion->regionFlags);//新线性区与共享内存进行映射
408 seg->ds.shm_nattch++;//附在共享线性区上的进程数++
409 SYSV_SHM_UNLOCK();
410}
STATIC struct shmIDSource * ShmFindSeg(int shmid)
通过ID找到共享内存资源
Definition: shm.c:357
STATIC VOID ShmVmmMapping(LosVmSpace *space, LOS_DL_LIST *pageList, VADDR_T vaddr, UINT32 regionFlags)
共享内存映射
Definition: shm.c:375
VADDR_T base
Definition: los_vm_map.h:84
UINT32 shmid
Definition: los_vm_map.h:126
UINT8 forkFlags
Definition: los_vm_map.h:127
LosVmMapRange range
Definition: los_vm_map.h:123
LOS_DL_LIST node
Definition: shm.c:148
struct shmid_ds ds
Definition: shm.c:146
unsigned long shm_nattch
当前使用该共享内存段的进程数量
Definition: shm.c:133
函数调用图:
这是这个函数的调用关系图:

◆ OsShmRegionFree()

VOID OsShmRegionFree ( LosVmSpace space,
LosVmMapRegion region 
)

释放共享线性区

在文件 shm.c412 行定义.

413{
414 struct shmIDSource *seg = NULL;
415
416 SYSV_SHM_LOCK();
417 seg = ShmFindSeg(region->shmid);//通过线性区ID获取对应的共享资源ID结构体
418 if (seg == NULL) {
419 SYSV_SHM_UNLOCK();
420 return;
421 }
422
423 LOS_ArchMmuUnmap(&space->archMmu, region->range.base, region->range.size >> PAGE_SHIFT);//解除线性区的映射
424 ShmPagesRefDec(seg);//ref --
425 seg->ds.shm_nattch--;//附在共享线性区上的进程数--
426 if (seg->ds.shm_nattch <= 0 && (seg->status & SHM_SEG_REMOVE)) {
427 ShmFreeSeg(seg);//就释放掉物理内存!注意是:物理内存
428 } else {
429 seg->ds.shm_dtime = time(NULL);
430 seg->ds.shm_lpid = LOS_GetCurrProcessID(); /* may not be the space's PID. */
431 }
432 SYSV_SHM_UNLOCK();
433}
STATUS_T LOS_ArchMmuUnmap(LosArchMmu *archMmu, VADDR_T vaddr, size_t count)
LOS_ArchMmuUnmap 解除进程空间虚拟地址区间与物理地址区间的映射关系
Definition: los_arch_mmu.c:619
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
Definition: los_process.c:2161
STATIC INLINE VOID ShmFreeSeg(struct shmIDSource *seg)
释放seg->node 所占物理页框,seg本身重置
Definition: shm.c:310
STATIC VOID ShmPagesRefDec(struct shmIDSource *seg)
seg下所有共享页引用减少
Definition: shm.c:233
UINT32 size
Definition: los_vm_map.h:85
LosArchMmu archMmu
Definition: los_vm_map.h:157
UINT32 status
Definition: shm.c:147
time_t shm_dtime
最后一个进程离开共享内存的时间
Definition: shm.c:129
pid_t shm_lpid
最后操作共享内存的进程ID
Definition: shm.c:132
time_t time(time_t *t)
Definition: time.c:1224
函数调用图:
这是这个函数的调用关系图: