Linux——虚拟内存
问题的提出
pro1.c
#include <stdio.h> #include <stdlib.h> main() { int *a=malloc(4); *a=9999; //*(a+1)=1000; //*(a+1000)=10000; printf("%p\n",a); while(1); }
gcc pro1.c -omain1 运行 main1 结果:0x8a01008
pro2.c
#include <stdio.h> #include <stdlib.h> main() { int *a=(int*)0x8a01008;//逻辑地址 没有与之相对应的物理地址 要建立关联才有意义 这个过程就是内存映射 printf("%d\n",*a); while(1); }
猜会不会打印9999
gcc pro2.c -omain2 运行 main2 结果:段错误
原因:
一个程序不能访问另外一个程序的地址指向的空间.
理解:
1.每个程序的开始地址0x80084000
2.程序中使用的地址不是物理地址,而是逻辑地址(虚拟内存).
逻辑地址仅仅是编号.编号使用int 4字节整数表示.
4294967296=4G
每个程序提供了4G的访问能力
问题:
逻辑地址与物理地址关联才有意义:过程称为内存映射.
结论:
虚拟地址与物理地址映射的时候有一个基本单位:至少会映射4K
4k 1000 内存页.
段错误:无效访问. 那段内存没有映射
非合法访问:比如malloc分配的空间之外的空间可以访问(没有段错误),但访问非法.因是越界访问
内存访问分两种:一个是可以访问,但不一定是合法的,比如malloc几个字节,
内存会给你映射4K空间,int* p=malloc(0); *(p+1000)=9999;理论说这是可以访问
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。