朋友们:
看很多书和资料都说内存地址映射的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之。