结构体 | |
struct | ipc_perm |
struct | shmid_ds |
struct | shminfo |
struct | shmIDSource |
函数 | |
UINT32 | ShmInit (VOID) |
LOS_MODULE_INIT (ShmInit, LOS_INIT_LEVEL_VM_COMPLETE) | |
UINT32 | ShmDeinit (VOID) |
STATIC VOID | ShmSetSharedFlag (struct shmIDSource *seg) |
给共享段中所有物理页框贴上共享标签 更多... | |
STATIC VOID | ShmClearSharedFlag (struct shmIDSource *seg) |
给共享段中所有物理页框撕掉共享标签 更多... | |
STATIC VOID | ShmPagesRefDec (struct shmIDSource *seg) |
seg下所有共享页引用减少 更多... | |
STATIC INT32 | ShmAllocSeg (key_t key, size_t size, INT32 shmflg) |
为共享段分配物理内存 例如:参数size = 4097, LOS_Align(size, PAGE_SIZE) = 8192 分配页数 size >> PAGE_SHIFT = 2页 更多... | |
STATIC INLINE VOID | ShmFreeSeg (struct shmIDSource *seg) |
释放seg->node 所占物理页框,seg本身重置 更多... | |
STATIC INT32 | ShmFindSegByKey (key_t key) |
通过key查找 shmId 更多... | |
STATIC INT32 | ShmSegValidCheck (INT32 segNum, size_t size, INT32 shmFlg) |
共享内存段有效性检查 更多... | |
STATIC struct shmIDSource * | ShmFindSeg (int shmid) |
通过ID找到共享内存资源 更多... | |
STATIC VOID | ShmVmmMapping (LosVmSpace *space, LOS_DL_LIST *pageList, VADDR_T vaddr, UINT32 regionFlags) |
共享内存映射 更多... | |
VOID | OsShmFork (LosVmSpace *space, LosVmMapRegion *oldRegion, LosVmMapRegion *newRegion) |
fork 一个共享线性区 更多... | |
VOID | OsShmRegionFree (LosVmSpace *space, LosVmMapRegion *region) |
释放共享线性区 更多... | |
BOOL | OsIsShmRegion (LosVmMapRegion *region) |
是否为共享线性区,是否有标签? 更多... | |
STATIC INT32 | ShmSegUsedCount (VOID) |
获取共享内存池中已被使用的段数量 更多... | |
STATIC INT32 | ShmPermCheck (struct shmIDSource *seg, mode_t mode) |
对共享内存段权限检查 更多... | |
INT32 | ShmGet (key_t key, size_t size, INT32 shmflg) |
ShmGet 得到一个共享内存标识符或创建一个共享内存对象 更多... | |
INT32 | ShmatParamCheck (const VOID *shmaddr, INT32 shmflg) |
LosVmMapRegion * | ShmatVmmAlloc (struct shmIDSource *seg, const VOID *shmaddr, INT32 shmflg, UINT32 prot) |
分配一个共享线性区并映射好 更多... | |
VOID * | ShmAt (INT32 shmid, const VOID *shmaddr, INT32 shmflg) |
ShmAt 用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。 更多... | |
INT32 | ShmCtl (INT32 shmid, INT32 cmd, struct shmid_ds *buf) |
ShmCtl 此函数可以对shmid指定的共享存储进行多种操作(删除、取信息、加锁、解锁等) 更多... | |
INT32 | ShmDt (const VOID *shmaddr) |
当对共享存储的操作已经结束时,则调用shmdt与该存储段分离 如果shmat成功执行,那么内核将使与该共享存储相关的shmid_ds结构中的shm_nattch计数器值减1 更多... | |
STATIC VOID | OsShmInfoCmd (VOID) |
STATIC VOID | OsShmDeleteCmd (INT32 shmid) |
STATIC VOID | OsShmCmdUsage (VOID) |
UINT32 | OsShellCmdShm (INT32 argc, const CHAR *argv[]) |
共享内存 更多... | |
SHELLCMD_ENTRY (shm_shellcmd, CMD_TYPE_SHOW, "shm", 2,(CmdCallBackFunc) OsShellCmdShm) | |
变量 | |
STATIC LosMux | g_sysvShmMux |
STATIC struct shminfo | g_shmInfo |
STATIC struct shmIDSource * | g_shmSegs = NULL |
STATIC UINT32 | g_shmUsedPageCount |
什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个物理内存。共享内存是在两个正在运行的进程之间 共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同 一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言 函数malloc()分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段 共享内存的任何其他进程。 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制 可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问 共享线性区可以由任意的进程创建,每个使用共享线性区都必须经过映射.
在文件 shm.c 中定义.
LOS_MODULE_INIT | ( | ShmInit | , |
LOS_INIT_LEVEL_VM_COMPLETE | |||
) |
BOOL OsIsShmRegion | ( | LosVmMapRegion * | region | ) |
是否为共享线性区,是否有标签?
共享内存
STATIC VOID OsShmCmdUsage | ( | VOID | ) |
STATIC VOID OsShmDeleteCmd | ( | INT32 | shmid | ) |
VOID OsShmFork | ( | LosVmSpace * | space, |
LosVmMapRegion * | oldRegion, | ||
LosVmMapRegion * | newRegion | ||
) |
fork 一个共享线性区
STATIC VOID OsShmInfoCmd | ( | VOID | ) |
VOID OsShmRegionFree | ( | LosVmSpace * | space, |
LosVmMapRegion * | region | ||
) |
释放共享线性区
SHELLCMD_ENTRY | ( | shm_shellcmd | , |
CMD_TYPE_SHOW | , | ||
"shm" | , | ||
2 | , | ||
(CmdCallBackFunc) | OsShellCmdShm | ||
) |
为共享段分配物理内存 例如:参数size = 4097, LOS_Align(size, PAGE_SIZE) = 8192 分配页数 size >> PAGE_SHIFT = 2页
key | |
size | |
shmflg |
ShmAt
用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
shm_flg | 是一组标志位,通常为0。 |
shmaddr | 指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。 |
shmid | 是shmget()函数返回的共享内存标识符 |
LosVmMapRegion * ShmatVmmAlloc | ( | struct shmIDSource * | seg, |
const VOID * | shmaddr, | ||
INT32 | shmflg, | ||
UINT32 | prot | ||
) |
分配一个共享线性区并映射好
|
inline |
给共享段中所有物理页框撕掉共享标签
ShmCtl
此函数可以对shmid指定的共享存储进行多种操作(删除、取信息、加锁、解锁等)
buf | 是一个结构指针,它指向共享内存模式和访问权限的结构。 |
cmd | command是要采取的操作,它可以取下面的三个值 : IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。 IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值 IPC_RMID:删除共享内存段 |
shmid | 是shmget()函数返回的共享内存标识符 |
UINT32 ShmDeinit | ( | VOID | ) |
INT32 ShmDt | ( | const VOID * | shmaddr | ) |
当对共享存储的操作已经结束时,则调用shmdt与该存储段分离 如果shmat成功执行,那么内核将使与该共享存储相关的shmid_ds结构中的shm_nattch计数器值减1
shmaddr |
STATIC struct shmIDSource * ShmFindSeg | ( | int | shmid | ) |
通过ID找到共享内存资源
STATIC INT32 ShmFindSegByKey | ( | key_t | key | ) |
通过key查找 shmId
STATIC INLINE VOID ShmFreeSeg | ( | struct shmIDSource * | seg | ) |
释放seg->node 所占物理页框,seg本身重置
ShmGet
得到一个共享内存标识符或创建一个共享内存对象
key | 建立新共享内存对象 标识符是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案。 为此,每个IPC对象都与一个键(key)相关联,这个键作为该对象的外部名,无论何时创建IPC结构(通过msgget、semget、shmget创建), 都应给IPC指定一个键, key_t由ftok创建,ftok当然在本工程里找不到,所以要写这么多. |
shmflg | IPC_CREAT IPC_EXCL IPC_CREAT: 在创建新的IPC时,如果key参数是IPC_PRIVATE或者和当前某种类型的IPC结构无关,则需要指明flag参数的IPC_CREAT标志位, 则用来创建一个新的IPC结构。(如果IPC结构已存在,并且指定了IPC_CREAT,则IPC_CREAT什么都不做,函数也不出错) IPC_EXCL: 此参数一般与IPC_CREAT配合使用来创建一个新的IPC结构。如果创建的IPC结构已存在函数就出错返回, 返回EEXIST(这与open函数指定O_CREAT和O_EXCL标志原理相同) |
size | 新建的共享内存大小,以字节为单位 |
UINT32 ShmInit | ( | VOID | ) |
STATIC VOID ShmPagesRefDec | ( | struct shmIDSource * | seg | ) |
seg下所有共享页引用减少
STATIC INT32 ShmPermCheck | ( | struct shmIDSource * | seg, |
mode_t | mode | ||
) |
对共享内存段权限检查
STATIC INT32 ShmSegUsedCount | ( | VOID | ) |
共享内存段有效性检查
|
inline |
给共享段中所有物理页框贴上共享标签
STATIC VOID ShmVmmMapping | ( | LosVmSpace * | space, |
LOS_DL_LIST * | pageList, | ||
VADDR_T | vaddr, | ||
UINT32 | regionFlags | ||
) |
共享内存映射
STATIC struct shminfo g_shmInfo |
STATIC struct shmIDSource* g_shmSegs = NULL |