2012-01-26 48 views
5

所以我正在玩Olly调试器,嗅探我还可以找出有关窗口的内容,然后按下M按钮,弹出内存映射窗口。所以我搜索了一些关于这个主题的文章,我发现我实际上可以写入64K以上的地址,我尝试了很好,为什么它不起作用。关于那些较低的2GB空间:窗口进程内存布局

  • 为什么有这些差距?例如,有0x10000-0x1FFFF R/Wable空间,然后有128K没有,然后一些只是可读的空间。我的意思是这已经是分页的权利,所以在物理空间中是否有过去的东西(不提到0x20000-0x40000应该完全可以反转),为什么有人会决定不要随意使用一些地址空间? 很可能我只是感到困惑,因为在olly调试器的内存映射中,很多行在列中显示为'Contains'时被留空。有没有可能我可以从olly对这个内存映射的一些参考,并找出什么空间有什么目的,因此是或不是这样的页面?

  • 假设我真的不会在内存管理方面搞点什么,可以使用低内存而不是使用堆来编写windows程序,还是可以遇到一些问题?

感谢您阅读此问题。

编辑

here我们去在0x10000什么那可能也是为什么页面让写。

+1

在操作系统上学习:) – Adrian

+0

嗯..这就是我想用这个:) – Pyjong

+0

关于你的最后一个问题......我怀疑你可以写保护内存。它的位置取决于操作系统。因此,阅读更多有关制作操作系统的知识,然后阅读ab如何映射其内存(我认为自从您提到Olly以来就赢了) – Adrian

回答

1

并非所有内存都可供应用程序使用。例如,某些类型的硬件需要内存,因此系统(BIOS或OS)将分配一块物理内存,并让硬件自行管理。该内存可能无法直接读取(或可写),因为执行此类操作会影响硬件。硬件本身可能有自己的限制,它可以使用什么内存范围。

如果你在Windows中,你不能写入任意的内存位置 - 操作系统不会让你(在用户模式至少),并且无论如何都会分页,所以你认为你的地址'重新看(虚拟地址)将不会匹配实际的物理内存地址。

一般情况下,您只应读取和写入由操作系统请求并分配给您的内存。

+0

是的,它可能是分页内存,这就是为什么我不明白为什么像这样的地图,而不是连续的虚拟内存块。 – Pyjong

+0

@stupid_idiot可能是碎片;也许MS决定在他们的算法中这样做 – Adrian

3

您似乎没有专注的问题,因此很难提供有价值的答案。但是,您似乎暗示了这个问题Windows如何映射用户空间内存?

首先,低虚拟内存空间—从零到64K或更多—未分配以捕获基于NULL的指针解引用。这些是我们想要立即知道的常见编程错误。该程序几乎肯定会在发生时终止。通过保留这个空间未映射,Windows的等效SEGFAULT发生。很有用。

通常,接下来分配代码和常量空间。一旦程序开始运行,通常不需要更改这个空间,所以它被设置为只读,并且它的一部分通常被标记为可执行的第一部分,其可以是空间的99%。如果共享代码库,那么这些代码库通常会在主代码之后(通常)映射到,通常会有小的间隔,以便库代码段与页面对齐(可能为4K,可能是64K或更大),以实现高效的内存管理寄存器使用。很少需要保存虚拟内存空间。

之后是数据空间。这可以是初始化的内存,也可以是未初始化的。这一切都必须是可读写的。而且它需要在其上面保留空间,以便它可以为堆空间增长而增长。

上面的数据空间的方式是堆栈空间。它必须是可读写的,并且在以下有的空间,因此它可以增长。所有现代CPU堆栈都向低内存方向发展。

并且在堆栈之上是系统空间。

如果进程请求访问共享内存(使用其他进程),则映射窗口的大小决定了它可以放在内存映射中的哪个位置。映射太靠近堆增长的地方是一个问题,太靠近潜在的堆栈增长也是一个问题。幸运的是,相当简单的放置算法可以为绝大多数程序解决这个问题。只要想想各种需求,你就可以弄清楚为什么操作系统要做它的工作。