问题标签 [virtualalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
5364 浏览

c++ - Windows C 代码上的内存分配

我想知道在 Windows C 编程中推荐哪种方法:使用 malloc 或 Win32 HeapAlloc(可能是 VirtualAlloc?)函数。

我已经阅读了 MSDN内存管理函数文章和有关 malloc 和 HeapAlloc 的 MSDN 文章,但他们没有说明应该使用哪一个以及在什么情况下使用。

0 投票
3 回答
2670 浏览

c++ - Win32 WriteProcessMemory() 神奇的偏移值

我正在尝试读取另一个进程拥有的 Win32 ListView 中的数据。不幸的是,我的 WriteProcessMemory() 调用失败并出现错误“此系统不支持此函数”。当我在 VirtualAlloc() 调用中为基地址指定“NULL”时。但是,如果我将 VirtualAlloc() 地址偏移了某个“神奇”值,而这些值我很幸运并在沮丧的时刻随机选择,那么该调用在我的系统上有效,但在其他系统上失败。(见下面的代码)

任何人都可以建议这个神奇的抵消对我有什么作用吗?通过反复试验,我可以找到适用于特定系统的值,但我找不到此问题的通用解决方案。

谢谢,保罗

澄清(由 Cd-MaN 添加):这是在 Windows Mobile 平台上,可能是非 x86 架构。所以情况可能会有所不同(ARM处理器中是否有单独的地址空间?)。

0 投票
3 回答
2206 浏览

c++ - Windows Mobile 上的连续 VirtualAlloc 行为

我一直在优化 Windows Mobile 应用程序的内存性能,并且在 Win32Windows CE上的VirtualAlloc 之间遇到了一些行为差异。

考虑以下测试:

代码“分配”从“c”开始的 4096 数据。在 Win32 上这有效。我在VirtualAlloc文档中找不到任何提及它是合法的还是巧合的,但是我通过谷歌找到了许多期望这种行为的代码示例。

在 Windows CE 5.0/5.2 上,如果我使用“c”处的内存块,在 99% 的情况下没有问题,但是在某些(不是全部)Windows Mobile 6 设备上,ReadFileWriteFile将失败并出现错误 87(参数是不正确的。)。我假设ReadFile正在调用IsBadWritePtr或类似名称,并因此返回 false。如果我执行两个ReadFile调用,那么一切正常。(当然可能还有其他 API 调用也会失败。)

我正在寻找一种方法来扩展VirtualAlloc返回的内存,以便我可以完成上述工作。在 Windows CE 上保留大量内存是有问题的,因为每个进程仅获得 32MB,并且由于正在加载其他项目,因此不可能在不引起其他问题的情况下保留大量内存。(可以在共享区域中保留更多的内存,但这也有其他问题。)

有没有办法让VirtualAlloc扩大或合并区域而不预先保留它?

鉴于以下示例,我怀疑这可能会出现问题:

0 投票
1 回答
332 浏览

c++ - VirtualAlloc 在 hdd 的某些配置上失败

由于某种原因,当我的应用程序在某些硬盘配置(RAID、随机分区、通过单独的 IDE 控制器,而不是在操作系统分区上)上运行时,返回VirtualAlloc代码为.nullGetLastErrorERROR_INVALID_PARAMETER

除了(MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE)传入的标志之外,唯一的参数是计算为从磁盘几何获得的扇区大小的倍数的大小(不幸的是,由于 NDA 等原因,我无法发布代码)。

只是想知道是否有人有这方面的经验?或者如果有人知道为什么 Windows 可能会在属于 raid 或分区的磁盘上以不同方式处理页面大小的任何原因?非常感谢任何帮助,谢谢!

0 投票
1 回答
3828 浏览

windows - 尽管 WinMobile 上有大量物理内存,VirtualAlloc 怎么会失败(没有内存)?

我经常看到 VirtualAlloc 调用以保留内存失败。我请求 2MB,以便分配不计入我的每个进程虚拟内存,而是使用系统共享内存。发生故障时,系统报告有超过 100 MB 的可用物理内存。

我在 windows mobile 6.1 设备上运行。到目前为止,这是一个特定于设备的问题。它适用于许多相同的设备,但在一台设备上失败。我希望能够确定此设备上的其他进程是否正在保留共享内存,从而阻止我这样做。不知道我怎么能做到这一点。

这是我所依赖的文档,我看不出任何可以解释这个问题的东西:http: //msdn.microsoft.com/en-us/library/aa908768.aspx

有任何想法吗?谢谢。

0 投票
4 回答
15840 浏览

linux - 有什么方法可以在linux中保留但不提交内存?

Windows 有 VirtualAlloc,它允许您保留一个连续的地址空间区域,但实际上并不使用任何物理内存。稍后当您想使用它(或其中的一部分)时,您再次调用 VirtualAlloc 以提交先前保留页面的区域。

这实际上非常有用,但我想最终将我的应用程序移植到 linux - 所以如果我以后不能移植它,我不想使用它。linux有办法做到这一点吗?

编辑 - 用例

我正在考虑分配 4 GB 或类似的虚拟地址空间,但一次只提交 64K。这将为我提供一种零拷贝方式来将数组增加到 4 GB。这很重要,因为典型的双倍数组大小和副本会为非常大的数组引入看似随机的不可接受的延迟。

0 投票
2 回答
423 浏览

memory-management - 获取windows中最低的空闲虚拟内存地址

标题几乎说明了一切:有没有办法在 windows 下获得最低的空闲虚拟内存地址?我应该补充一点,我在程序开始时对这些信息感兴趣(在完成任何动态内存分配之前)。

为什么我需要它:尝试malloc在 Windows 下构建一个实现。如果不可能,我将不得不在VirtualAlloc()将 NULL 作为第一个参数时返回任何返回值。虽然您希望它做一些明智的事情,比如在可用的底部分配内存,但不能保证。

0 投票
1 回答
617 浏览

c - VS-2010 中的函数指针(+ Virtual Alloc 调用)

作为一个实验,我正在尝试编写以下程序,它允许我在运行时生成代码。即我执行以下操作:

1.用我要执行的指令的操作码填充缓冲区。
2.声明一个函数指针并使其指向缓冲区的开始。
3.使用上面的func-ptr调用函数。

代码如下:(按照下面AndreyT的说明更新。)

这段代码在使用 gcc 的 linux 机器上编译得很好。
现在我将它迁移到 Windows (visual-studio-2010)。

AFAIK,mmap功能由windows 上的virtualAllocvirtualProtect提供。

我已经浏览了 MSDN 和网上的其他文档,
但我仍然无法找到让这个程序在 Windows 上的 VS-2010 上运行的方法。


更新:

@AndreyT 谢谢。它现在似乎正在工作。虽然我收到以下错误:

我想我需要现在交换mmap()电话virtualAlloc()
非常感谢大家。接下来我想我需要深入研究 MSDN virtualAlloc()

0 投票
2 回答
2020 浏览

windows - 关于内存页保护的问题

这是我在阅读<Windows via C/C++ 5th Edition> 时遇到的另一个问题。首先,让我们看一些引文。

最后一个参数 fdwProtect 表示应该分配给区域的保护属性。 与区域关联的保护属性对映射到该区域的提交存储没有影响。

保留区域时,分配将最常用于该区域的存储的保护属性。例如,如果您打算提交具有 PAGE_READWRITE 保护属性的物理存储,则应使用 PAGE_READWRITE 保留该区域。当区域的保护属性与提交存储的保护属性匹配时,系统的内部记录保存会更有效。

(提交存储时)...您通常传递调用 VirtualAlloc 以保留区域时使用的相同页面保护属性,尽管您可以指定不同的保护属性。

上面的引用完全让我感到困惑。

  • 如果与区域关联的保护属性对提交的存储没有影响,我们为什么需要它?

  • 既然建议对保留和提交使用相同的保护属性,为什么 Windows 仍然为我们提供使用不同属性的选项?这不是误导和悖论吗?

  • 保留区域和已提交存储的保护属性分别存储在哪里?

非常感谢您的见解。

0 投票
3 回答
1864 浏览

c++ - 如何将文件的内容复制到虚拟内存中?

我有一个小文件,我查看它并计算其中的字节数:

现在我分配相同大小的虚拟内存:

我现在想将文件的内容复制到 nyBuf 中。我该怎么做?

谢谢!