Отладка ошибки выделения страницы в Coldfire uCLinux
Иногда я получаю этот аварийный вывод ниже в моей системе Coldfire uCLinux. Как мне выяснить, что является причиной проблемы?
4 апреля 10:44:33 (нет) user.debug syslog: запуск 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] Mem-Info: DMA на процессор: CPU 0: hi: 0, btch: 1 usd: 0 Active_anon:0 active_file:0 inactive_anon:0 inactive_file:4484 dirty:0 обратная запись: 0 нестабильно: 0 свободно: 8806 плита: 565 сопоставлено: 0 страниц: 0 отказов:0 DMA свободно: 35216kB мин: 1016kB низко: 1268kB высоко:1524kB active_anon:0kB inactive_anon:0kB active_file:0kB неактивно _file:17936kB настоящее время:65024kB pages_scanned:0 all_unreclaimable? нет lowmem_reserve[]: 0 0 0 DMA: 0*4 КБ 0*8 КБ 1*16 КБ 4*32 КБ 6*64 КБ 3*128 КБ 46*256 КБ 44*512 КБ 0*1024 КБ 0*2048 КБ 0*4096 КБ 0*8192 КБ 0*16384 КБ = * 16384 КБ = 35216 КБ 4484 всего страниц кэша страниц 0 страниц ОЗУ 0 страниц зарезервировано 0 страниц общего доступа 0 страниц не передано Распределение длины 663552 из процесса 476 (sh) не удалось DMA на процессор: CPU 0: hi: 0, btch: 1 usd: 0 Active_anon:0 active_file:0 inactive_anon:0 inactive_file:4484 dirty:0 writeback:0 unstable:0 free:8804 slab:567 отображается:0 pagetables:0 отказов:0 DMA free:35216kB min:1016kB low:1268kB high:1524kB active_anon:0kB inactive_anon:0 КБ active_file: 0 КБ inactive_file:17936 КБ присутствует: 65024 КБ Pages_scanned: 0 all_unreclaimable? нет lowmem_reserve[]: 0 0 0 DMA: 0*4 КБ 0*8 КБ 1*16 КБ 4*32 КБ 6*64 КБ 3*128 КБ 46*256 КБ 44*512 КБ 0*1024 КБ 0*2048 КБ 0*4096 КБ 0*8192 КБ 0*16384 КБ = * 16384 КБ = 35216kB Всего 4484 страниц кэша страниц. Невозможно выделить оперативную память для текста / данных процесса, ошибочно 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] [4057431] [4005de52] ] [40068468] [4006aa4e] [40020ea0] [400239c2] [4002386c] Mem-Info:
1 ответ
Ваша система исчерпала 1 МБ свободных страниц. При мощности двух распределителей вам потребуется бесплатная страница размером 1 МБ для выделения 663552 байтов. Это вызвано фрагментацией памяти. Обычно MMU реорганизует свободное пространство так, чтобы оно казалось непрерывным для новых распределений.
Вы можете позаботиться о проблеме только путем профилактики. Если 663552 байта являются двоичным файлом sh, вам нужно будет предотвратить его непрерывную загрузку в память. Это может быть сделано путем помещения его в файловую систему XIP.
Это может быть выделение кучи, выполняемое оболочкой. В этом случае вам придется изменить любую обработку, вызывающую такой большой malloc.
На системном уровне вам также нужно будет увидеть, какие программы являются большими или вызывают большие mallocs, и изменить их поведение, чтобы они не вызывали большей фрагментации.