操作系统中库里的函数是通过调用下层函数来实现的
函数 调用的库 调用的下层函数
自动分配/释放内存auto_ptr STL 调用了标准C++
构造/析构 new/delete C++ 调用了标准C
malloc/free 标准C 调用了POSIX
brk/sbrk POSIX 调用了Linux系统接口
mmap/munmap Linux系统接口 调用了内核接口
kmalloc/vmalloc 内核 调用了驱动
get_free_page 驱动 。。。
标准C
void* malloc(size_t size)
申请堆内存的大小
void free(void* ptr)
ptr为malloc申请内存的返回值,释放这块申请的内存空间
POSIX
void* sbrk(intptr_t increment)
increment:
0 获取未分配前的内存首地址
>0 增加内存空间
<0 释放内存空间
返回未分配内存的首地址,以字节为单位
int brk(void* addr)
功能:设置未分配内存的首地址,一般用来释放内存
成功返回0,失败返回-1
注意:brk/sbrk分配和释放内存只是修改了使用权,真正的映射工作是mmap/munmap完成的
Linux系统接口
void* mmap(void* addr,size_t length,int prot,int flags,int fd,off_t offset)
功能:把虚拟内存地址与物理内存或文件建立起映射关系
addr:映射的虚拟地址,NULL操作系统会自动选择
length:映射字节数
prot:权限
flags:映射标志
fd:文件描述符
offset:文件映射偏移值
成功返回虚拟内存地址,失败返回0xffffffff
int munmap(void* addr,size_t length)
功能:取消映射
addr:需要取消映射的内存首地址
length:需要映射的字节数
成功返回0,失败返回-1