|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对SD卡进行分区,然后试图从SD加载EXT3文件系统。但是,在加载过程中会有如下报错:0 {% T0 g; S' F
4 c; I; @4 a3 {4 i
.......) R) ^. B" u3 B3 a7 b
9 o* i* f. r+ G# m" I1 ^
VFS: Cannot open root device "179:2" or unknown-block(179,2)
9 a5 {# _9 c. K8 v# h( OPlease append a correct "root=" boot option' N( o) \! F- |' K
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
8 ^7 j Z, m# X( b7 v
# S+ a# [( ?9 u; s+ R5 v6 L8 [" c6 T) w, C
! P. f: r8 P1 o1 K, C5 _5 t, [& u
首先,先确保你的SD卡没有写保护。如果写保护了,也有可能造成上面的输出。
- b$ l* Z! z2 M# C, }
9 |! _( _6 D+ ?其次,修改Uboot的bootargs。修改内容如下: H: A' ^, E. `* ]
7 k9 `# \% w3 h6 b, b: eU-Boot> setenv bootargs noinitrd root=179:2 rw rootdelay=3 rootfstype=ext3 console=ttySAC0
2 s$ V# R1 \8 \* V8 D& _- q2 ]; ? E
其实就是增加rootdelay这个参数,该参数的目的是让根文件系统的加载时间推迟3秒。+ i! ]6 p7 M7 Z: y" r
7 A# S4 M7 a+ Z$ c$ }推迟3秒是为了让sd卡能够先初始化完毕,让后再从sd卡加载文件系统。" i; |1 y. K+ K8 ?, ?: d, L
( N0 `- X: ^0 `So之所以内核会panic就是因为sd卡都没有初始化,还要让内核去sd卡加载文件系统,怎么可能加载成功。" y8 S3 a( h. i1 j- w7 W
: A* F; N, s. U- E' B; C. v1 x, h8 h4 D# l; P" c
& J! q' m( J4 p- L5 l- ~+ Y
那么怎么可以推断出是因为根文件系统的加载早于sd卡的初始化,所以造成内核panic的呢?- o V6 u3 L. F' y8 `2 p, [6 ?
1 x6 N6 ^: M6 a `+ w5 Q来看下正常情况下,根文件系统位于nandflash中,内核从nandflash加载yaffs2根文件系统,同时,SD卡已插入卡槽中。/ S/ P r$ j Y
5 F6 B, } [- {' F a给开发板上电,我们看下输出信息:4 [! W& Y( V& K8 y
$ C/ _' B# C) g& Q/ z. ]' K....
" ?) D6 Z+ C% Q9 X9 s& N9 `( y/ _. A' v" H2 _( L% T
yaffs: dev is 32505856 name is "mtdblock0"6 a$ X: h' A. K w" D) ]2 o
yaffs: passed flags ""
4 L- @: U/ E9 p+ t6 L" ~) uyaffs: Attempting MTD mount on 31.0, "mtdblock0" i& X, I( H u* y9 X5 T* r
block 419 is bad
' T3 M. n7 x) yblock 420 is bad
3 c6 Y2 v3 v0 U) Iblock 421 is bad
( c. Y/ l5 r8 g" y/ u: R+ Fblock 423 is bad
% A" b, m4 M5 `! |block 424 is bad
3 _, \1 k, f( {. |, X8 Jblock 425 is bad3 W% v" }6 t M
block 426 is bad
0 j5 y) f& O$ l4 c6 q1 y7 ?" h |VFS: Mounted root (yaffs filesystem).
- }9 N' O$ F0 C7 vFreeing init memory: 104K
; r3 s4 G7 F# ^: |2 z6 C1 r" Ymmc0: card is read-write
3 y9 Z, V/ `2 X) P. Z; immcblk0: mmc0:5996 SD02G 1921024KiB
. N" u/ s) V8 F: z, f- `9 W; g- k mmcblk0: p1 p2
+ d: c" r* g" c' Gstarting udev...kjournald starting. Commit interval 5 seconds
; z; T7 B! Q+ o; L. Y) R5 \) ]EXT3 FS on mmcblk0p2, internal journal
) l) i, N0 P$ z5 d% Q i1 S$ NEXT3-fs: recovery complete.: ^& t; U+ M! E/ L- v" `
EXT3-fs: mounted filesystem with ordered data mode." |' I. p7 W: T" q) t# \% I: ?
done
1 R. @" r7 @4 y& Y J- p: r8 \
' h* J9 G6 _9 @8 w/ R4 d....0 f1 t; u& i+ S' t6 R
$ p. j$ u9 O7 [' k3 A+ [& x6 N
我们可以看到,内核首先加载了根文件系统yaffs,然后才加载了sd卡。5 C! J: F V. G* u9 ]
+ X0 S2 q4 o1 I N* R, w
因此,如果不推迟根文件系统加载的时间,sd卡根本得不到初始化的机会。
0 z+ U: Y4 Z* Y/ @. U/ y: Y! P3 [; g$ X! u5 |- A
& M0 _6 }3 t) {. s x: P5 G
/ q5 D5 }. U4 V4 o2 x最后,我们看下加入rootdelay参数后的输出情况。
4 H3 Y& |8 M9 Q- G6 q3 }& H7 D6 M: a' K/ \# N4 S
...! t& S+ O0 a" d
5 i) }( Q. B& [# O$ i
Waiting 3sec before mounting root device...- a, _' e9 w* D. W8 E
mmc0: card is read-write3 e `- V2 |7 c
mmcblk0: mmc0:5996 SD02G 1921024KiB ; v9 \! u' ?9 J/ Z: a2 _( z
mmcblk0: p1 p29 c' F Q5 V; R n6 p
kjournald starting. Commit interval 5 seconds
5 i# a! @& P8 AEXT3 FS on mmcblk0p2, internal journal
! z ~+ q+ M- b( Y; WEXT3-fs: recovery complete.
& z+ b2 K' f# w2 p& AEXT3-fs: mounted filesystem with ordered data mode.2 v v, v( J' R6 W. y& b' _8 z
VFS: Mounted root (ext3 filesystem).% s: N/ W2 G) Y
Freeing init memory: 104K& c1 p6 m8 A, p; G: P3 e
starting udev...done& d* v; `/ |% i0 c" \! J! R1 Y+ J
* w: P3 W8 o% A# _' t6 [ C
...
# D1 b+ c* {8 I1 ^9 ~9 E; r( B; i; {0 O9 M
从上面的输出来看,内核推迟了3秒加载根文件系统,先加载了SD卡,然后挂载了ext3文件系统。8 u3 v2 |" ~1 i/ q. C' j( _( l
# j6 Q x" c) R! ?* U" k* Y
* V( n7 X4 @0 Z: T# Y1 O5 y t
1 ?0 |2 [; l& F0 B1 _
6 G) K$ ^8 ]2 z6 q |
|