码迷,mamicode.com
首页 > 系统相关 > 详细

Linux——虚拟内存

时间:2014-09-01 22:45:43      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:io   使用   问题   html   sp   linux   c   htm   程序   

问题的提出

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——虚拟内存

标签:io   使用   问题   html   sp   linux   c   htm   程序   

原文地址:http://blog.csdn.net/u012409883/article/details/38986315

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!