Linux内存布局
内存空间布局
内存管理api
sbrk和brk函数
brk内存管理
makefile
main:main.c
gcc $^ -g -o $@
main.c
#include<stdio.h>
#include<unistd.h>
int main()
{
void * heap1 = sbrk(4); //荻取一个虚掀地址作为堆幵始(4byte) ,但不能使用
void * heap2 = sbrk(4); //返回之前虚拟地址+4,但不能使用
int pid = getpid();
printf("pid = %d \n",pid);
printf(" sbrk1 = %p \n",heap1);
printf(" sbrk2 = %p \n",heap2);
// *heap1 = 100; //程序崩潰
//荻取堆指針
int * heap3 = (int *) sbrk (0);
//分配sizeof(int) *1字节的堆空向
brk(heap3 + 1);
printf("sbrk3 = %p \n",heap3) ;
*heap3 = 100;
//将堆指针还原到幵始位置,释放堆空向
brk (heap3) ;
*heap3 = 99; //释放后无法使用堆空囘,此时程序奔溃
getchar() ;
return 0;
}
malloc和free函数
makefile
ccc:ccc.c
gcc $^ -g -o $@
c语言的内存管理
ccc.c
#include<stdio.h>
#include<malloc.h>
int main(){
//根据用户输入,创建指定大小的数据
int number = 0;
printf("请输入你要分配空间的个数:");
scanf("%d",&number);
int *p1 = malloc(sizeof(int)*number);
for(int i=0;i<number;i++){
scanf("%d",&p1[i]);
}
printf("%d %d",p1[0],p1[1]);
//申请10个int类型的空间
int *p = (int*)malloc(sizeof(int)*10);
p[0]=100;
p[1]=200;
printf("\n%d %d\n",p[0],p[1]);
//需要释放
free(p);
free(p1);
p = NULL;
return 0;
}
mmap和munmap
每个进程都有一个假的4g虚拟空间,通过mmap跟物理地址关联,物理地址大小(物理内存大小)和内存条有关
内存分页
#include<stdio.h>
#include<unistd.h>
int main(){
long page = sysconf(_SC_PAGESIZE);
printf("system page size = %ld kb \n",page / 1024);
return 0;
}
mmap虚拟内存管理
#include<unistd.h>
#include<sys/mman.h>
#include<stdio.h>
int main(){
printf("pid = %d\n",getpid());
void* p = mmap (
0,//申靖位置,默人系統分配
100,//申靖空甸大小,自功対齐4k,这里填4096一样
PROT_READ|PROT_WRITE,// 内存属性,读写
MAP_ANONYMOUS|MAP_PRIVATE, // 匿名私有
0,//要映射的文件描述符,没有使用
0);//文件偏移,没有使用
printf(" map : %p\n", p);
char *pbuff = (char*)p;//转换成字符串
pbuff[4095] = 22;//対斉4k,不会崩潰
pbuff[4096] = 99;//修改最后一个字苜崩潰
munmap(p, 100); // 秤放虚掫内存
return 0;
}