Встроенное пользовательское приложение linux внезапно начало падать
Суть проблемы заключается в следующем: каковы возможности повреждения пользовательского приложения во время его работы? Кроме сбоев оборудования.
Аппаратная оснастка: ARM9 (at91sam9xe) NAND Flash для: ядра Linux + FS + приложение пользователя.
У нас было приложение, работающее на встроенном linux на ARM9 (at91sam9xe), в течение нескольких месяцев не было никаких проблем, но затем внезапно ARM сообщил, что не может выполнить приложение.
Когда он был выполнен, он потерпел крах со следующим дампом:
pgd = c16b8000
[00000020] *pgd=215a0031, *pte=00000000, *ppte=00000000
Pid: 349, comm: console
CPU: 0 Not tainted (2.6.30.4-uc0 #280)
PC is at 0x4e000
LR is at 0x673e0
pc : [<0004e000>] lr : [<000673e0>] psr: 60000010
sp : bec6a728 ip : bec6acb4 fp : bec6ac9c
r10: 000bd9f8 r9 : 00000000 r8 : 00000000
r7 : 00000000 r6 : bec6acb4 r5 : 00000000 r4 : fbad2084
r3 : ffffffff r2 : bec6acb4 r1 : 00000025 r0 : 0009eab0
Flags: nZCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
Control: 0005317f Table: 216b8000 DAC: 00000015
[<c02ec3b0>] (show_regs+0x0/0x50) from [<c02f11a8>] (__do_user_fault+0x9c/0xa8)
r5:0000000b r4:c1696360
[<c02f110c>] (__do_user_fault+0x0/0xa8) from [<c02f1344>] (do_page_fault+0x114/0x244)
r7:00010000 r6:c1696360 r5:c15a62e0 r4:c1c5fde0
[<c02f1230>] (do_page_fault+0x0/0x244) from [<c02ea284>] (do_DataAbort+0x3c/0xa0)
[<c02ea248>] (do_DataAbort+0x0/0xa0) from [<c02eae00>] (ret_from_exception+0x0/0x10)
Exception stack(0xc1683fb0 to 0xc1683ff8)
3fa0: 0009eab0 00000025 bec6acb4 ffffffff
3fc0: fbad2084 00000000 bec6acb4 00000000 00000000 00000000 000bd9f8 bec6ac9c
3fe0: bec6acb4 bec6a728 000673e0 0004e000 60000010 ffffffff
Я попытался addr2line, чтобы увидеть, где он вышел из строя, но он дал ссылку на crtstuff.c =\ crtstuff.c, который не является частью нашего приложения, я думаю, он связан с GCC.
Я боялся испортить мой исполняемый файл, поэтому я запустил diff для файла на NAND и для файла с моего компьютера... были различия, которых не должно быть. Плюс, различия были почти все из них как значения "0x00" вместо значения, которое они должны содержать.
Я действительно хочу знать, как пользовательское приложение может быть повреждено, кроме сбоев оборудования?
Причина: флэш-память NAND всегда была доступна для записи, поэтому мы выдвинули гипотезу о том, что есть совпадение, когда вещи пишутся на флэш-память, а питание отключается.
Решение Переместил нашу ФС в ОЗУ, мы монтируем только часть раздела NAND как доступную для записи только тогда, когда есть необходимость что-то записать. Защита от записи NAND контролировалась через аппаратный пин-код и включалась только при наличии запроса на запись от приложения.