首页 > 代码库 > Linux——虚拟内存

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;理论说这是可以访问

Linux——虚拟内存