函数 | |
STATIC INLINE BOOL | LOS_IsNamedMapping (unsigned long flags) |
STATIC INLINE BOOL | LOS_IsAnonymousMapping (unsigned long flags) |
是否匿名映射 匿名映射:没有映射对应的相关文件,这种映射的内存区域的内容会被初始化为0 更多... | |
VADDR_T | LOS_MMap (VADDR_T vaddr, size_t len, unsigned prot, unsigned long flags, int fd, unsigned long pgoff) |
STATUS_T | LOS_UnMMap (VADDR_T addr, size_t size) |
解除映射关系 更多... | |
VOID * | LOS_DoBrk (VOID *addr) |
INT32 | LOS_DoMprotect (VADDR_T vaddr, size_t len, unsigned long prot) |
修改内存段的访问权限 更多... | |
VADDR_T | LOS_DoMremap (VADDR_T oldAddress, size_t oldSize, size_t newSize, int flags, VADDR_T newAddr) |
重新映射虚拟内存地址。 更多... | |
VOID | LOS_DumpMemRegion (VADDR_T vaddr) |
输出内存线性区 更多... | |
UINT32 | ShmInit (VOID) |
UINT32 | ShmDeinit (VOID) |
INT32 | ShmGet (key_t key, size_t size, INT32 shmflg) |
ShmGet 得到一个共享内存标识符或创建一个共享内存对象 更多... | |
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 更多... | |
VOID * LOS_DoBrk | ( | VOID * | addr | ) |
用户进程向内核申请空间,进一步说用于扩展用户堆栈空间,或者回收用户堆栈空间 扩展当前进程的堆空间 一个进程所有的线性区都在进程指定的线性地址范围内, 线性区之间是不会有地址的重叠的,开始都是连续的,随着进程的运行出现了释放再分配的情况 由此出现了断断续续的线性区,内核回收线性区时会检测是否和周边的线性区可合并成一个更大 的线性区用于分配。
addr |
在文件 los_vm_syscall.c 第 259 行定义.
修改内存段的访问权限
在文件 los_vm_syscall.c 第 337 行定义.
VADDR_T LOS_DoMremap | ( | VADDR_T | oldAddress, |
size_t | oldSize, | ||
size_t | newSize, | ||
int | flags, | ||
VADDR_T | newAddr | ||
) |
重新映射虚拟内存地址。
在文件 los_vm_syscall.c 第 460 行定义.
VOID LOS_DumpMemRegion | ( | VADDR_T | vaddr | ) |
输出内存线性区
在文件 los_vm_syscall.c 第 555 行定义.
是否匿名映射 匿名映射:没有映射对应的相关文件,这种映射的内存区域的内容会被初始化为0
在文件 los_vm_syscall.h 第 54 行定义.
VADDR_T LOS_MMap | ( | VADDR_T | vaddr, |
size_t | len, | ||
unsigned | prot, | ||
unsigned long | flags, | ||
int | fd, | ||
unsigned long | pgoff | ||
) |
mmap基础概念: 一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系. 实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上, 即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间, 从而可以实现不同进程间的文件共享。 https://www.cnblogs.com/huxiao-tee/p/4660352.html http://abcdxyzk.github.io/blog/2015/09/11/kernel-mm-mmap/ 参数 描述 addr 指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。 length 代表将文件中多大的部分映射到内存。 prot 用于设置内存段的访问权限,有如下权限: PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 flags 控制程序对内存段的改变所造成的影响,有如下属性: MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。 MAP_SHARED 对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。 MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。 MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。 MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。 MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。 fd: 要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。 有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。 offset 文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是PAGE_SIZE的整数倍。 成功返回:虚拟内存地址,这地址是页对齐。 失败返回:(void *)-1。
vaddr | |
len | |
prot | |
flags | |
fd | |
pgoff |
在文件 los_vm_syscall.c 第 149 行定义.
解除映射关系
在文件 los_vm_syscall.c 第 211 行定义.
ShmAt
用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
shm_flg | 是一组标志位,通常为0。 |
shmaddr | 指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。 |
shmid | 是shmget()函数返回的共享内存标识符 |
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 |
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 | ) |