函数 | |
STATUS_T | OsCheckMMapParams (VADDR_T *vaddr, unsigned long flags, size_t len, unsigned long pgoff) |
STATUS_T | OsNamedMmapingPermCheck (struct file *filep, unsigned long flags, unsigned prot) |
STATUS_T | OsAnonMMap (LosVmMapRegion *region) |
匿名映射 更多... | |
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) |
解除映射关系 更多... | |
STATIC INLINE BOOL | OsProtMprotectPermCheck (unsigned long prot, LosVmMapRegion *region) |
VOID * | OsShrinkHeap (VOID *addr, LosVmSpace *space) |
收缩堆区 更多... | |
VOID * | LOS_DoBrk (VOID *addr) |
STATIC UINT32 | OsInheritOldRegionName (UINT32 oldRegionFlags) |
继承老线性区的标签 更多... | |
INT32 | LOS_DoMprotect (VADDR_T vaddr, size_t len, unsigned long prot) |
修改内存段的访问权限 更多... | |
STATUS_T | OsMremapCheck (VADDR_T addr, size_t oldLen, VADDR_T newAddr, size_t newLen, unsigned int flags) |
VADDR_T | LOS_DoMremap (VADDR_T oldAddress, size_t oldSize, size_t newSize, int flags, VADDR_T newAddr) |
重新映射虚拟内存地址。 更多... | |
VOID | LOS_DumpMemRegion (VADDR_T vaddr) |
输出内存线性区 更多... | |
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 行定义.
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 行定义.
STATUS_T OsAnonMMap | ( | LosVmMapRegion * | region | ) |
匿名映射
在文件 los_vm_syscall.c 第 99 行定义.
STATUS_T OsCheckMMapParams | ( | VADDR_T * | vaddr, |
unsigned long | flags, | ||
size_t | len, | ||
unsigned long | pgoff | ||
) |
在文件 los_vm_syscall.c 第 50 行定义.
STATUS_T OsMremapCheck | ( | VADDR_T | addr, |
size_t | oldLen, | ||
VADDR_T | newAddr, | ||
size_t | newLen, | ||
unsigned int | flags | ||
) |
在文件 los_vm_syscall.c 第 82 行定义.
STATIC INLINE BOOL OsProtMprotectPermCheck | ( | unsigned long | prot, |
LosVmMapRegion * | region | ||
) |
在文件 los_vm_syscall.c 第 219 行定义.
VOID * OsShrinkHeap | ( | VOID * | addr, |
LosVmSpace * | space | ||
) |