Linux内存布局

内存空间布局

image.png
image.png

内存管理api

image.png

sbrk和brk函数

image.png
image.png

brk内存管理

makefile

  1. main:main.c
  2. gcc $^ -g -o $@

main.c

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main()
  4. {
  5. void * heap1 = sbrk(4); //荻取一个虚掀地址作为堆幵始(4byte) ,但不能使用
  6. void * heap2 = sbrk(4); //返回之前虚拟地址+4,但不能使用
  7. int pid = getpid();
  8. printf("pid = %d \n",pid);
  9. printf(" sbrk1 = %p \n",heap1);
  10. printf(" sbrk2 = %p \n",heap2);
  11. // *heap1 = 100; //程序崩潰
  12. //荻取堆指針
  13. int * heap3 = (int *) sbrk (0);
  14. //分配sizeof(int) *1字节的堆空向
  15. brk(heap3 + 1);
  16. printf("sbrk3 = %p \n",heap3) ;
  17. *heap3 = 100;
  18. //将堆指针还原到幵始位置,释放堆空向
  19. brk (heap3) ;
  20. *heap3 = 99; //释放后无法使用堆空囘,此时程序奔溃
  21. getchar() ;
  22. return 0;
  23. }

image.png

malloc和free函数

image.png
makefile

  1. ccc:ccc.c
  2. gcc $^ -g -o $@

c语言的内存管理

ccc.c

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. int main(){
  4. //根据用户输入,创建指定大小的数据
  5. int number = 0;
  6. printf("请输入你要分配空间的个数:");
  7. scanf("%d",&number);
  8. int *p1 = malloc(sizeof(int)*number);
  9. for(int i=0;i<number;i++){
  10. scanf("%d",&p1[i]);
  11. }
  12. printf("%d %d",p1[0],p1[1]);
  13. //申请10个int类型的空间
  14. int *p = (int*)malloc(sizeof(int)*10);
  15. p[0]=100;
  16. p[1]=200;
  17. printf("\n%d %d\n",p[0],p[1]);
  18. //需要释放
  19. free(p);
  20. free(p1);
  21. p = NULL;
  22. return 0;
  23. }

mmap和munmap

image.png
image.png
image.png
每个进程都有一个假的4g虚拟空间,通过mmap跟物理地址关联,物理地址大小(物理内存大小)和内存条有关

内存分页

image.png
image.png
image.png
image.png

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main(){
  4. long page = sysconf(_SC_PAGESIZE);
  5. printf("system page size = %ld kb \n",page / 1024);
  6. return 0;
  7. }

image.png
image.png

mmap虚拟内存管理

  1. #include<unistd.h>
  2. #include<sys/mman.h>
  3. #include<stdio.h>
  4. int main(){
  5. printf("pid = %d\n",getpid());
  6. void* p = mmap (
  7. 0,//申靖位置,默人系統分配
  8. 100,//申靖空甸大小,自功対齐4k,这里填4096一样
  9. PROT_READ|PROT_WRITE,// 内存属性,读写
  10. MAP_ANONYMOUS|MAP_PRIVATE, // 匿名私有
  11. 0,//要映射的文件描述符,没有使用
  12. 0);//文件偏移,没有使用
  13. printf(" map : %p\n", p);
  14. char *pbuff = (char*)p;//转换成字符串
  15. pbuff[4095] = 22;//対斉4k,不会崩潰
  16. pbuff[4096] = 99;//修改最后一个字苜崩潰
  17. munmap(p, 100); // 秤放虚掫内存
  18. return 0;
  19. }