在 Windows 中等效于带有 MAP_GROWSDOWN 的 mmap

Posted

技术标签:

【中文标题】在 Windows 中等效于带有 MAP_GROWSDOWN 的 mmap【英文标题】:Equivalent of mmap with MAP_GROWSDOWN in Windows 【发布时间】:2021-08-06 06:43:04 【问题描述】:

在 Linux 中,我可以使用带有 MAP_GROWSDOWN 标志的 mmap 来为自动增长的堆栈分配内存。引用手册页,

   MAP_GROWSDOWN
          This flag is used for stacks.  It indicates to the kernel
          virtual memory system that the mapping should extend
          downward in memory.  The return address is one page lower
          than the memory area that is actually created in the
          process's virtual address space.  Touching an address in
          the "guard" page below the mapping will cause the mapping
          to grow by a page.  This growth can be repeated until the
          mapping grows to within a page of the high end of the next
          lower mapping, at which point touching the "guard" page
          will result in a SIGSEGV signal.

在 Windows 中有一些等效的技术吗?甚至像询问操作系统这样丑陋的事情也会通知您页面错误,以便您可以在下面分配一个新页面(并通过要求操作系统摆弄页表使其看起来连续)?

【问题讨论】:

【参考方案1】:

使用VirtualAlloc,您可以保留一块内存,提交前两页,并使用PAGE_GUARD 设置这两页中较低的一页。当堆栈增长并访问保护页时,会引发结构化异常,您可以处理该异常以向下提交下一页并在其上设置PAGE_GUARD

上面类似于Windows进程中处理堆栈的方式。下面是使用Sysinternals VMMAP.EXE 对堆栈的描述。您可以看到它是一个 256KB 的堆栈,其中 32K 已提交,12K 保护页和 212K 保留堆栈剩余。

【讨论】:

以上是关于在 Windows 中等效于带有 MAP_GROWSDOWN 的 mmap的主要内容,如果未能解决你的问题,请参考以下文章

Windows 等效于 linux cksum 命令

Xcode 故事板等效于带有 View.GONE 的 Android LinearLayout

diff 命令的 Windows 等效项是啥?

WPF 等效于 Application.AddMessageFilter(Windows 窗体)

WPF等效于Application.AddMessageFilter(Windows窗体)

等效于带有工作“线程”的 asyncio.Queues