|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对SD卡进行分区,然后试图从SD加载EXT3文件系统。但是,在加载过程中会有如下报错:
! ^3 y- u7 l9 }4 q0 u0 J( ~3 w
I& b9 G4 W- ^4 S. m.......0 _; [- \1 |- n7 l" e+ Q( p
. O; G9 X! d+ w7 p* r
VFS: Cannot open root device "179:2" or unknown-block(179,2)
3 n Y5 a5 _7 ^: A1 ]Please append a correct "root=" boot option3 c" |, c3 g8 K
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)' D) s1 z2 d) a& N! D
4 l" }4 h% ?3 U5 s8 |- m2 O
5 p, j0 i8 D, v; T7 @# W- g) S
$ j; O+ n. A3 W6 G/ V' m
首先,先确保你的SD卡没有写保护。如果写保护了,也有可能造成上面的输出。8 D: N5 G! K+ B8 X5 H
?8 W# r- I4 b4 L其次,修改Uboot的bootargs。修改内容如下:
/ j: o+ N- ]& v% J, Y
3 J. t/ {. r: h0 l/ ^- }U-Boot> setenv bootargs noinitrd root=179:2 rw rootdelay=3 rootfstype=ext3 console=ttySAC0- N( K% a; Y# d2 t
3 y$ Z- Z3 g7 K2 ~* {
其实就是增加rootdelay这个参数,该参数的目的是让根文件系统的加载时间推迟3秒。
, t' L3 p/ K; K7 V
! T* J! ]2 j. _% |+ g; R推迟3秒是为了让sd卡能够先初始化完毕,让后再从sd卡加载文件系统。9 ?' p% N- r5 h8 N6 @$ k
8 {6 \$ K& D3 X v+ g
So之所以内核会panic就是因为sd卡都没有初始化,还要让内核去sd卡加载文件系统,怎么可能加载成功。) z, r4 w- D) ^: J4 _5 H0 v
8 D$ ?. s8 k, A0 I n5 k: h% r9 g
% ?0 ]0 q( a; Q. g0 R& u+ ?% ^
" H, v, i" b0 J) O( f$ W x7 e那么怎么可以推断出是因为根文件系统的加载早于sd卡的初始化,所以造成内核panic的呢?
Q- t7 p4 Q6 n
: u' S: z7 q$ ~( g3 U3 _来看下正常情况下,根文件系统位于nandflash中,内核从nandflash加载yaffs2根文件系统,同时,SD卡已插入卡槽中。& O! ~8 k& q3 D: d) @6 D
1 R4 Y7 j. h3 |$ l) n5 Y* G给开发板上电,我们看下输出信息:' g9 `, }7 [8 Z9 f0 t* a
/ ?& c3 d) z! `* M8 b! P
....
* y0 e; J( u! ~5 H! c+ y4 g/ _" H, ?
% [8 g4 s; H. h, ~5 c* ]yaffs: dev is 32505856 name is "mtdblock0"
1 A. P) J6 E, J0 Iyaffs: passed flags ""
; Q, L' C. o" Ryaffs: Attempting MTD mount on 31.0, "mtdblock0"
# V; ^- U3 z5 x$ K5 jblock 419 is bad
4 y4 U7 s& A* ~2 K( A, f; j0 d5 Dblock 420 is bad8 j& S) k# O) ?; {' M$ p
block 421 is bad& Q8 w$ P. _" j* X8 O3 _) z* m
block 423 is bad
: c1 M3 t$ u& J1 Q. Fblock 424 is bad5 B+ _$ ?+ T+ }8 v$ e4 |& E
block 425 is bad
3 [* V: B6 c: cblock 426 is bad
4 c. Z2 p* e6 B2 y0 yVFS: Mounted root (yaffs filesystem).
$ o) i* N4 \# MFreeing init memory: 104K
% T* T; |% m% Bmmc0: card is read-write' h3 _$ H0 G8 V+ p+ e
mmcblk0: mmc0:5996 SD02G 1921024KiB
6 X. E5 F/ M& m. w0 N6 k7 B0 u: \ mmcblk0: p1 p2
4 m; @- ?( t2 k0 _! Xstarting udev...kjournald starting. Commit interval 5 seconds
7 e1 Y8 W. ]3 b4 f: [; Y" G% g4 SEXT3 FS on mmcblk0p2, internal journal
4 \5 L$ U$ t1 Q0 k4 A7 f9 dEXT3-fs: recovery complete.$ `' Q2 o* X7 e/ ~& Z+ Q4 H# v. p
EXT3-fs: mounted filesystem with ordered data mode.
$ A" W. l, ^' P- E( odone! ?* z( q- s' w a: m( t
# p2 o3 r/ `8 W5 T....' d7 ^! \: `7 q
: V3 ]) ^4 w; }9 g4 Z
我们可以看到,内核首先加载了根文件系统yaffs,然后才加载了sd卡。
- A( N, u+ ^- e0 P/ L4 E
* A0 r7 R; n" [4 I5 {7 |因此,如果不推迟根文件系统加载的时间,sd卡根本得不到初始化的机会。, {1 S" ~8 w: w! U8 ^
: ~1 `( D j2 e6 H$ b# T2 g. N6 f4 j% H
9 D. x7 M" |0 s$ T% }! v. ~$ ~
最后,我们看下加入rootdelay参数后的输出情况。
9 f) k/ L% p# n, M% A# P W# m9 m/ c1 T$ ?
...) F: W2 S; \2 e- I
, ]) q! N) I. E/ |1 \& ^
Waiting 3sec before mounting root device...
9 q T5 R& z C5 ?mmc0: card is read-write9 o" h+ C6 I, N1 g* @
mmcblk0: mmc0:5996 SD02G 1921024KiB
! |8 _. j& C/ G% D mmcblk0: p1 p2
. U' B5 _2 k# \6 Z7 W7 v$ @7 R, r. Skjournald starting. Commit interval 5 seconds! o5 U Z, z7 O/ N, \
EXT3 FS on mmcblk0p2, internal journal+ x8 c' n+ c& g5 I+ ~$ H: e+ t
EXT3-fs: recovery complete.
7 `8 i% N, N! Z2 i$ ]EXT3-fs: mounted filesystem with ordered data mode.( U/ D, F! v+ v# S
VFS: Mounted root (ext3 filesystem).
8 ~& V1 D/ O# N2 L" qFreeing init memory: 104K
3 b; |; v! a$ Ustarting udev...done4 B2 T) X0 ^* s( s" q
5 A2 [- y0 H2 {- q...
* c( [7 w' f9 }. Y4 d \2 T
& K& X2 ?' @2 F$ ~7 D$ F从上面的输出来看,内核推迟了3秒加载根文件系统,先加载了SD卡,然后挂载了ext3文件系统。
/ U7 h9 f) q" G2 ^+ y
) W: ?* E4 b6 t; B! ?. ?) `5 H* \2 F8 X
& t8 J8 F% B; `# [8 P8 e+ S
) |9 s$ c: [4 O |
|