这个问题相当冗长,因此我将在顶部询问问题,然后逐一探讨提出问题的方法:
- (基于Busybox的)rm是否没有执行,因为没有足够的连续RAM?
- 如果是这样,是否有一种轻巧的方法来对DMA进行碎片整理-无需重新启动系统?
- 如果不是,是什么原因造成的?我如何防止它将来发生?
在过去几天中我们的测试系统相当密集地运行之后,我通过telnet进入系统并检查了测试结果。当我删除一些数据时,系统返回了命令行(就像命令已正确执行一样)。当我检查目录是否有另一组结果时,我看到该文件仍然存在(使用ls)。
此后,我注意到越来越多的shell命令无法按预期执行。
rm无法正确执行后,我将从dmesg的输出开始:
从进程6821(rm)分配长度61440失败
DMA每个CPU:
CPU 0:嗨:0,btch:1 usd:0
Active_anon:0 active_file:1 inactive_anon:0 inactive_file:0无法清除:6脏:0回写:0不稳定:0空闲:821平板:353映射:0页表:0反弹:0
DMA空闲时间:3284kB分钟:360kB低点:448kB高位:540kB active_anon:0kB inactive_anon:0kB active_file:4kB inactive_file:0kB不可撤销:24kB当前:8128kB pages_scanned:0 all_unreclaimable?没有
lowmem_reserve []:0 0 0
DMA:31 * 4kB 47 * 8kB 42 * 16kB 64 * 32kB 1 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 0 * 4096kB = 3284kB
共14个页面缓存页面
无法为过程数据分配RAM,错误号12
最初,我以为我无法在连续内存的最大部分中运行该程序。意味着DMA过于分散,我将不得不找到一种使系统对内存进行碎片整理的方法。
然后,我进行了快速的数学/健全性检查,意识到该程序应该能够在唯一的64kB连续内存插槽中运行。Rm请求61440字节(60kB)。
我做了一个很好的旧的“手动碎片整理”,然后重新启动了系统。当我重新启动系统时,我输出/ proc / buddyinfo:
Node 0, zone DMA 2 8 3 12 0 1 0 1 0 1 0
我怀疑映射到:
- 2个4 kB
- 8 x 8 KB
- 3 x 16千字节
- 12 x 32 kb
- 1个128 kB
- 1 x 512 kb
但是,如果将上述值列表加总,则它与/ proc / meminfo的输出不匹配:
MemTotal: 6580 kB
MemFree: 3164 kB
Buffers: 0 kB
Cached: 728 kB
SwapCached: 0 kB
Active: 176 kB
Inactive: 524 kB
Active(anon): 0 kB
Inactive(anon): 0 kB
Active(file): 176 kB
Inactive(file): 524 kB`
Unevictable: 0 kB
Mlocked: 0 kB
MmapCopy: 844 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 0 kB
Mapped: 0 kB
Slab: 1268 kB
SReclaimable: 196 kB
SUnreclaim: 1072 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3288 kB
Committed_AS: 0 kB
VmallocTotal: 0 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
回顾一下,我的问题是:
- rm是否没有执行,因为没有足够的连续RAM?
- 如果是这样,是否有一种轻巧的方法来对DMA进行碎片整理-无需重新启动系统?
- 如果不是,是什么原因造成的?我如何防止它将来发生?
我正在使用运行uClinux版本2.6.30的Lantronix的XPort Pro(8MB,Linux OS)。使用中的外壳是安静的。