1 虚拟内存技术
1.1虚拟地址(逻辑地址)
操作系统中申请的物理空间,都会映射到虚拟地址上。然后可通过虚拟地址访问物理空间。
1.2 内存页面
操作系统分配(映射)物理空间时,以页为单位
malloc申请的空间后台会用一定的数据结构来管理
brk/sbrk申请的空间后台会维护一个位置
mmap申请的空间由程序员自己管理
1.3 sbrk(int n);
返回值:永远是移动之前的位置。
n>0 申请n个字节的空间,将当前位置向后移n个字节
n<0 释放n个字节的空间,将当前位置向前移n个字节
n=0 返回当前位置,如果程序中第一次调用sbrk(0),返回一个未使用过的虚拟地址,以后用sbrk,brk分配空间时,就使用这个虚拟地址。
1.4 brk(void *p);
返回值:0:成功,-1:失败
将当前位置移动到指定位置(p),如果这样的移动是向前,相当于释放空间,向后移动相当于分配空间
1.5 mmap
内存映射,mmap向操作系统申请一片内存空间,由程序员自己管理
mmap(void *p, size_t sz, int port, int flags, int fd, off_t offset)
p:指定映射好的空间的首地址,一般为NULL,让系统指定首地址
sz:大小,以页面对其
prot:
PROT_READ,PROT_WRITE,PROT_EXEC
flags:
MAP_SHARED和MAP_PRIVATE必选其一,对于内存映射没有区别,区别主要在文件映射。
MAP_ANONYMOUS,匿名映射,专门用于映射内存。如果没有此选项,默认为映射文件。
fd:文件描述符
off:文件偏移量
返回值:映射好的内存空间的首地址
(void *)-1或 MAP_FAILED 代表失败
解除映射:
相当于释放内存空间
munmap(首地址, 大小)

本文深入探讨了虚拟内存技术的关键概念,包括虚拟地址的概念及其如何映射到物理空间,内存页面的管理方式,以及通过sbrk、brk和mmap等函数进行内存分配的具体操作方法。
1489

被折叠的 条评论
为什么被折叠?



