每个进程获得 4 GB 的虚拟地址空间,在 4 GB 之外,用户空间获得 2 GB。在这 2 GB 中,我想读取操作系统分配给进程的整个内存堆栈。
char chrArray[2000000];
假设我在堆栈上声明了一个大小为 2000,000 ( ) 的本地数组。我想问几个问题。
1)使用gcc
and cygwin
,我可以在不初始化的情况下读取它的内容,但它的内容大部分是空的(我曾经%c
将数组打印到文件中)或者这个数组末尾的一些垃圾数据。我在垃圾数据中提取了一个字符串,并在内存转储中查找它(使用DumpIt
工具获取),但内存转储中不存在此字符串。
我的问题是这些垃圾数据是从哪里来的?它是否位于硬盘中?
2)我想用fork()
在每个子进程中声明char数组,但我猜,它复制父进程的整个地址空间并使用Copy-on-Write
技术,所以它似乎没有用。我对这种解释是否正确?
3)我想要的是声明一个大数组,并且每次映射到一些新的物理内存地址。这是否可以实现,如果可以,如何实现?
通过重复这个过程,我想扫描整个内存。
我多次尝试bash
脚本来运行这个程序,但它总是从相同的虚拟基地址开始。
我试图运行一个for
声明(比如说)10个字符数组的循环,但是通过打印它们的基地址,我看到所有数组的地址都相同。
我正在使用Windows 7
和C
编程,我认为我缺乏一些必需的操作系统知识。
谢谢。
PS如果有人好奇我为什么要这样做,我正在这方面进行研究。