首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

内存地址映射的 4GB 有关问题?

2012-06-08 
内存地址映射的 4GB问题??????????朋友们:看很多书和资料都说内存地址映射的4GB的分配很重要,但是我不明白

内存地址映射的 4GB 问题??????????
朋友们:
  看很多书和资料都说内存地址映射的4GB的分配很重要,但是我不明白这4GB是怎么回事,哪儿有这4GB的空间啊,如果没有那他又是怎么来分配的啦。。。。。。实际中也没有这4GB的空间,如果是虚拟的,我的实际地址也没有4GB,那么它怎么对应到实际物理地址呢????????????????
  希望大虾指点,谢谢!!!
  欢迎朋友们共同讨论!!!

[解决办法]
http://server.zdnet.com.cn/server/2009/0105/1301428.shtml
[解决办法]
操作系统中内存管理有说吧 呵呵...
[解决办法]

探讨
哦哦,不过有点不明白。。。。。。。。。。。

[解决办法]
分配内存好像是OS的事情,win与linux内存分配不一样。
[解决办法]
不错,学习了!
[解决办法]
6楼解释基本上清楚了。
虚拟内存就是进程本身拥有的不对应具体物理内存的空间,很显然一个Hello World的可执行文件不会占用4G的物理内存,因为事实上根本没那么多物理内存。再比如malloc函数分配的内存,在分配结束之后,只要不对他访问,就不会去映射具体物理内存,那么malloc这段内存就永远是虚拟的,当要对该内存进行写访问的时候,MMU 发现该内存还没有被映射,于是就会进入中断程序,在linux里面中断最终会执行do_page_fault函数,在这个函数里面,操作系统会分配一页真正的物理内存,然后映射到你进程的这段地址空间里面,这样你才能访问真正的物理内存。

最后提供一个例子:
C/C++ code
#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main(){    int    status;    pid_t  pid_arr[10];    int    i;    void * xxx;    for (i=0; i<10; i++)    {        pid_arr[i] = 0;    }    pid_arr[0] = fork();    if (pid_arr[0] == -1)    {        printf("fork failed\n");        exit(1);    }    pid_arr[1] = fork();    if (pid_arr[1] == -1)    {        printf("fork failed\n");        exit(1);    }    pid_arr[2] = fork();    if (pid_arr[2] == -1)    {        printf("fork failed\n");        exit(1);    }    pid_arr[3] = fork();    if (pid_arr[3] == -1)    {        printf("fork failed\n");        exit(1);    }    xxx = malloc(2*1024*1024*1000);    if (xxx == NULL)        printf("malloc failed\n");    sleep(10);    for (i=0; i<10; i++)    {        if (pid_arr[i] != 0)        {            waitpid(pid_arr[i], &status, 0);        }    }    printf("process exit!\n");    return 0;}
[解决办法]
2的32次方。
[解决办法]
地址空间是指CPU最大能寻址多少空间范围

不要把它与你的内存条大小混为一谈

它是通过MMU(采用页映射)来对应到实际内存上去的

在需要用到某一页中的地址范围时,就会将该页与内存确立映射 关系
[解决办法]
linux
[解决办法]
因为地址线是32根,所以逻辑寻址范围是4G BYTE,2的32次方。当然实际可能没有这么大就需要mmu。
具体的google之。

热点排行