Linux内存布局
内存空间布局
内存管理api
sbrk和brk函数
brk内存管理
makefile
main:main.cgcc $^ -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.cgcc $^ -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;}



