0

問題の要点は次のとおりです。実行中にユーザーランドアプリが破損する可能性は何ですか? ハードウェア障害以外。

ハードウェア リグ: Linux カーネル + FS + ユーザーランド アプリ用の ARM9 (at91sam9xe) NAND フラッシュ。

ARM9 (at91sam9xe) の組み込み Linux でアプリを実行していました。数か月間は問題はありませんでしたが、突然 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 に関連していると思います。

実行可能ファイルが破損することを恐れたので、NAND 上のファイルと PC のファイルの差分を実行しました...発生してはならない違いがありました。さらに、違いは、それらが含むべき値ではなく、「0x00」値としてほとんどすべてでした。

私が本当に知りたいのは、ハードウェアの障害以外に、ユーザーランド アプリがどのように破損する可能性があるかということです。

原因: NAND フラッシュは常に書き込み可能であったため、フラッシュに書き込みが行われているときに電源が切れるという偶然が起こったという仮説を立てました。

ソリューション FS を RAM に移動し、何かを書き込む必要がある場合にのみ、NAND パーティションの一部のみを書き込み可能としてマウントします。NAND 書き込み保護は、アプリからの書き込み要求がある場合にのみ有効になるように、ハードウェア ピンを介して制御されました。

4

0 に答える 0