0

我有时会在我的 Coldfire uCLinux 系统上得到以下崩溃输出。如何找出导致问题的原因?

4 月 4 日 10:44:33(无)user.debug 系统日志:启动 NTP
sh:页面分配失败。顺序:8,模式:0xd0
来自 41da5dcc 的堆栈:
        4005b0f2 400553b6 40207431 406131f8 00000008 000000d0 00000008 00000000
        000000a2 000a2000 000a2000 0000000c 40544a14 00000000 405434fc 00000077
        41da5eac 00000000 00000010 00000000 41da5008 41da5000 00000000 00000100
        00000000 41da5000 00000000 000200d0 4024eecc 00000080 00000000 00000000
        4005de52 000000d0 00000008 4024eec8 00000000 00000001 00004d09 00079100
        00000004 00003f20 00013424 41cd7000 41da5fcc 41da5f2a 00015790 00000000
禁用 CONFIG_FRAME_POINTER 的调用跟踪:

 [4005b0f2] [400553b6] [40207431] [4005de52] [40067d64]
 [40093892] [4004b15e] [400390d8] [40020e70] [400677d8]
 [40020e70] [401f0c92] [40068468] [4006aa4e] [40020ea0]
 [4002386c]
内存信息:
每个 CPU 的 DMA:
CPU 0: hi: 0, btch: 1 usd: 0
Active_anon:0 active_file:0 inactive_anon:0
 非活动文件:4484 脏:0 写回:0 不稳定:0
 免费:8806 平板:565 映射:0 页表:0 反弹:0
DMA free:35216kB min:1016kB low:1268kB high:1524kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:17936kB present:65024kB pages_scanned:0 all_unreclaimable?不
lowmem_reserve[]:0 0 0
DMA:0*4kB 0*8kB 1*16kB 4*32kB 6*64kB 3*128kB 46*256kB 44*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 35216kB
总共 4484 个页面缓存页面
0 页内存
0 页保留
0 页面共享
0 页非共享
从进程 476 (sh) 分配长度 663552 失败
每个 CPU 的 DMA:
CPU 0: hi: 0, btch: 1 usd: 0
Active_anon:0 active_file:0 inactive_anon:0
 非活动文件:4484 脏:0 写回:0 不稳定:0
 免费:8804 平板:567 映射:0 页表:0 反弹:0
DMA free:35216kB min:1016kB low:1268kB high:1524kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:17936kB present:65024kB pages_scanned:0 all_unreclaimable?不
lowmem_reserve[]:0 0 0
DMA:0*4kB 0*8kB 1*16kB 4*32kB 6*64kB 3*128kB 46*256kB 44*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 35216kB
总共 4484 个页面缓存页面
无法为进程文本/数据分配 RAM,errno 12
sh:页面分配失败。顺序:8,模式:0xd0
来自 41ea6dcc 的堆栈:
        4005b0f2 400553b6 40207431 40645848 00000008 000000d0 00000008 00000000
        000000a2 000a2000 000a2000 0000000c 40544a6c 00000000 405434fc 00000077
        41ea6eac 00000000 00000010 00000000 41ea6008 41ea6000 00000000 00000100
        00000000 41ea6000 00000000 000200d0 4024eecc 00000080 00000000 00000000
        4005de52 000000d0 00000008 4024eec8 00000000 00000001 00004d09 00079100
        00000004 00003f20 00013424 410ae600 41ea6fcc 41ea6f2a 00015790 00000000
禁用 CONFIG_FRAME_POINTER 的调用跟踪:

 [4005b0f2] [400553b6] [40207431] [4005de52] [40067d64]
 [40093892] [4004b15e] [400390d8] [40020e70] [400677d8]
 [40020e70] [401f0c92] [40068468] [4006aa4e] [40020ea0]
 [400239c2] [4002386c]
内存信息:

4

1 回答 1

1

您的系统已用完 1 MB 可用页面。借助两个分配器的力量,您需要一个大小为 1 MB 的空闲页面来分配 663552 个字节。这是由内存碎片引起的。通常,MMU 会重新组织可用空间,以使其对于新分配看起来是连续的。

您只能通过预防来解决问题。如果 663552 字节是 sh 二进制文件,则必须防止它不断地重新加载到内存中。这可以通过将其放入 XIP 文件系统来完成。

它可能是由 shell 完成的堆分配。在这种情况下,您将不得不更改导致如此大的 malloc 的任何处理。

在系统级别,您还必须查看哪些程序较大或导致较大的 malloc 并更改它们的行为,以便它们不会导致更多碎片。

于 2012-06-07T19:22:40.783 回答