“奇怪的”虚拟内存块

时间:2018-08-02 08:37:08

标签: c linux memory-management embedded-linux

我有一个在Ubuntu 14.04上运行的ARM 32位C / C ++程序。该程序的最大常驻内存约为90MB。但是,该程序的虚拟内存容量很大-约为400MB。我使用带有x开关的pmap来检查详细信息,我发现并且不太了解的是大约有20-30个虚拟内存块,每个块的大小为8188KB,模式为RWX。每个8188KB块的实际居民大小非常小,类似于8K,12KB,24KB。以下是快照供您参考。

Address   Kbytes     RSS   Dirty Mode  Mapping
00010000      12      12       0 r-x-- theApp
00022000       4       4       4 r---- theApp
00023000       4       4       4 rw--- theApp
00024000    3556    3536    3536 rw---   [ anon ]
9941c000       4       0       0 -----   [ anon ]
9941d000    8188       8       8 rwx--   [ anon ]
99c1c000       4       0       0 -----   [ anon ]
99c1d000    8188       8       8 rwx--   [ anon ]
9a41c000       4       0       0 -----   [ anon ]
9a41d000    8188       8       8 rwx--   [ anon ]
9ac1c000       4       0       0 -----   [ anon ]
9ac1d000    8188       8       8 rwx--   [ anon ]
9b41c000       4       0       0 -----   [ anon ]
9b41d000    8188       8       8 rwx--   [ anon ]
9bc1c000       4       0       0 -----   [ anon ]
9bc1d000    8188      24      24 rwx--   [ anon ]
...
b57f6000      28      28      28 rw--- libcrypto.so.1.0.0
b57fd000      12       4       4 rw---   [ anon ]
b5800000       4       0       0 -----   [ anon ]
b5801000    8188      12      12 rwx--   [ anon ]
...

在GDB中,运行后没有任何信息-信息符号“块的地址”。我也将一些数据块转储(转储内存命令),每个位为零。

在该程序中,没有直接调用mmap。它仅显式调用malloc和new进行堆内存分配。而且我没有发现任何内存分配大小为8188KB。实际上,我可以从pmap的输出中识别代码的每个堆分配。当然,该程序还使用了一些我不知道内部实现的第三方共享库。

我的问题是:

  1. 内存块可能来自哪里?
  2. 还有其他追踪方法吗?
  3. 如果系统的交换文件被禁用,程序仍可以正常运行吗?由于实际的物理RAM小于400MB。

任何输入将不胜感激!

谢谢, -尼尔

0 个答案:

没有答案