内存地址映射的 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之。