malloc中的系统调用brk和mmap
环境

brk
例子
/* sbrk, brk 例子 */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
void *curr_brk, *tmp_brk = NULL;
printf("Welcome to sbrk example:%d\n", getpid());
/* sbrk(0) 获取当前 program break 位置 */
tmp_brk = curr_brk = sbrk(0);
printf("Program Break Location1:%p\n", curr_brk);
getchar();
/* 使用 brk 增加 program break 位置 */
brk(curr_brk+4096);
curr_brk = sbrk(0);
printf("Program break Location2:%p\n", curr_brk);
getchar();
/* 使用 brk 减小 program break 位置 */
brk(tmp_brk);
curr_brk = sbrk(0);
printf("Program Break Location3:%p\n", curr_brk);
getchar();
return 0;
}
00602000-00603000 rw-p 00000000 00:00 0 [heap]
- 00602000-00603000是堆段的虚拟地址范围
- rw-p的标准含义是Read、Write、 NoeXecute、Private
- 00000000 是文件偏移量,由于没有映射任何文件所以为0
- 00:00 是major/minor device number,由于没有映射任何文件所以为0
- 0是inode 也是没有映射任何文件所以为0
- 【heap】是堆段
mmap
- malloc使用mmap创建一个私有匿名的映射段,这个映射段的主要目的是申请一块(零值初始化的)新内存,并且这块内存只能被调用的这个进程独占使用。
/* 使用mmap系统调用做私有匿名映射的例子 */
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
void static inline errExit(const char* msg)
{
printf("%s failed. Exiting the process\n", msg);
exit(-1);
}
int main()
{
int ret = -1;
printf("Welcome to private anonymous mapping example::PID:%d\n", getpid());
printf("Before mmap\n");
getchar();
char* addr = NULL;
addr = mmap(NULL, (size_t)132*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED)
errExit("mmap");
printf("After mmap\n");
getchar();
/* Unmap mapped region. */
ret = munmap(addr, (size_t)132*1024);
if(ret == -1)
errExit("munmap");
printf("After munmap\n");
getchar();
return 0;
}
-
调用mmap之前:可以看到,属于libc.so和ld-linux.so共享库的内存映射段。

-
调用mmap之后:如下我们可以看到,mmap映射的内存段已经从上图红色框内分配出去(0xe0000-0xbf000=0x21000).

- 调用munmap之后,如下输出可以看到mmap已经被解除映射了。
