【问题标题】:Vxworks memory allocation failure even though there is enough memory即使有足够的内存,Vxworks 内存分配失败
【发布时间】:2015-05-07 12:04:46
【问题描述】:

我对 vxworks 比较陌生,我正在构建一个 RTP 应用程序,它需要动态分配一些内存。我已将内核配置为 750MB 的内存大小。

我在程序一开始就以 10 个数字块分配内存,每个数字大小为 32MB,但在第 5 或第 6 个块分配之后,我在控制台上收到消息 memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608 的分配失败。

当有足够的可用内存时,内存分配怎么会失败?我不认为内存已经足够碎片化,以至于在我的程序开始时分配失败,并且根据memShow() 的输出,确实有足够的可用内存来满足请求。

如果内存确实由于任何奇怪的原因而碎片化,有没有办法压缩可用空间并在 Vxworks 中继续?

【问题讨论】:

  • 你做了 memShow 1 吗?这将显示每个空闲块的地址和大小...

标签: malloc vxworks


【解决方案1】:

这是一个老问题,所以这个答案现在可能没有实际意义,并且在一定程度上是基于问题中有限信息的推测。

虽然内核可能配置为支持 750MB,但这将是可用的总内存。虽然我们不会期望太多,但其中一些将被 OS 映像使用,我们可以假设至少 700MB 应该可以使用。

将使用一些额外的内存来为每个任务提供堆栈 - 多少取决于应用程序,因为它在 taskSpawn 中指定。您可以检查这一点,但同样不太可能产生重大影响。

让我们大方一点,假设您真的只有 650MB。从理论上讲,这应该足够了。

然而我们有这个错误:

memPartAlloc: block too big 15912260 bytes (0x10 aligned) in partition 0xe004608

会发生什么?这是什么意思? 此错误告诉您内存分配器无法分配内存,因为请求太大。有趣的是,请求是 15912260,不是 32MB,实际上是 15MB 以上的阴影。因此,值得检查您实际请求的内容。

其次,此错误消息来自memPartAlloc。您是否使用malloc()memPartAlloc() 分配内存?区别很重要,因为 malloc 将从系统内存分区分配内存,而 memPartAlloc 从用户指定和创建的分区分配内存。

如果您使用 memPartAlloc,请确保您从正确的分区分配内存,并且已创建它具有足够的内存来满足请求。

编辑:

看起来这是一个 RTP,您还应该确认 RTP 分配了足够大的堆。这是通过环境变量指定的,正如answer 所描述的那样。

【讨论】:

  • 感谢您这么长时间后的答复。无论您说什么,都可能是导致问题的原因,即尝试从不够大的内存分区进行分配,即使其他分区中可能有可用空间。然而当时,我只是将我的程序从 RTP 更改为 DKM,它开始工作一切正常,因为我认为在 DKM 中,内存总是从系统分区分配的。
  • @Ajoy 我没有发现这是一个 RTP - 更新了相应的问题和答案
猜你喜欢
  • 2013-09-26
  • 2012-09-21
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多