EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经7 k% L- n. q& g5 F2 }
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。
) p3 x) p! _1 T2 `4 }1.PC机上格式化SD卡
. N- ?2 I8 {* W9 X6 h* x( H9 J 在桌面的PC机上用SD读卡器操作SD卡:( U6 c) D$ Y$ M
一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
6 V5 C9 j' Q8 d自动mount到/media/disk和 /media/disk_1 目录。) V2 b! u2 k- t2 ]4 M
U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测) l0 v3 g, O. e' d( c1 z8 B
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,
5 d& Y1 j6 B. ^. U/ `3 M1 I1 c. n做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。 . V1 k' j( j1 U, c/ b3 O
1.1 用fdisk分区
# l% B9 T& {$ P 执行fdisk /dev/sdb4 b2 X; q. Z/ f8 N- U- @1 U
fdisk有如下常用选项. k: [7 E+ Q4 r( r- L7 l
1. 输入 m 显示所有命令列示。
" y" k2 D% T: P# R/ u Y' t2. 输入 p 显示硬盘分割情形。 2 d. O* I% v. z) K( T* D7 A: W( f
3. 输入 a 设定硬盘启动区。 ' L" F2 w w- y3 T) ?; W" T
4. 输入 n 设定新的硬盘分割区。
# u; Q1 G. x* `6 x( r 4.1. 输入 e 硬盘为[扩展]分割区(extend)。
# c1 c5 j# l9 M# R& ~( m 4.2. 输入 p 硬盘为[首要]分割区(primary)。
. ]* X5 U2 m" P4 c+ w" v5. 输入 t 改变硬盘分割区属性。 ; X. F: b7 f) }
6. 输入 d 删除硬盘分割区属性。 P) [- g! z) U* b8 a
7. 输入 q 结束不存入硬盘分割区属性。
. z4 Z$ S0 x" X8. 输入 w 结束并写入硬盘分割区属性
2 ]+ a0 `" }3 Z$ _! ^' q3 T4 L如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分
' |: x2 B( _: v+ S区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。7 F( ]* B& @8 Q
Command (m for help): n: _. _; {" V9 Z: G R
Command action1 I0 r* n7 N3 W& A; z6 \( c
e extended
) q7 T6 E8 P$ e4 E p primary partition (1-4)
' a! ~9 E' f+ Q. l$ O6 Qp
9 F0 @0 t, }: i2 d; lPartition number (1-4): 1- j' c8 h% |" ^ Y
First cylinder (1-1020, default 1): 8 r) C1 K- G* [* s. U- e. L
Using default value 1" x4 J1 E! _: [- h5 n; M0 c9 B1 U8 Y: ]
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
4 }/ s, k# s# {2 m, m4 d3 L$ cCommand (m for help): n& R, P/ I2 K# t& S }" ]( J' T
Command action! F' F* |2 i. E6 N# H' l
e extended- k; w1 p; H$ d
p primary partition (1-4): y" D0 D! Z* |2 H" p* Y* n6 ]6 i
p
& A1 w6 J+ P9 E' _3 IPartition number (1-4): 2
3 I# O, s1 [) U1 t% K& @First cylinder (202-1020, default 202):
$ Q$ K1 O4 b1 b; O6 X8 DUsing default value 202
% j: N1 O r' SLast cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
% {; ^' v- H8 E/ P; F, sUsing default value 1020
* j9 s! _; y" D) O1 qCommand (m for help): p
" V+ N) M+ L+ m' h; f! KDisk /dev/sdb: 2041 MB, 2041577472 bytes
, A) k2 f/ N5 n) @, [63 heads, 62 sectors/track, 1020 cylinders6 x. o5 e* d0 f" p; L
Units = cylinders of 3906 * 512 = 1999872 bytes/ M4 P6 h3 H3 N3 H9 B
Device Boot Start End Blocks Id System- t) c) R+ w2 x3 \( y
/dev/sdb1 1 201 392522 b W95 FAT327 }. Q L6 d% g( Y' D8 Q1 m
/dev/sdb2 202 1020 1599507 83 Linux/ h! q+ ?8 Z: Y, o* K7 Y" H. S
Command (m for help): w
/ \7 |6 p! \$ d9 T1 _The partition table has been altered!: R- C+ D. R# h
Calling ioctl() to re-read partition table.: m% P I1 O/ R) T+ l9 L6 V
WARNING: Re-reading the partition table failed with error 16: 设备或资源* u" H2 q" e8 e- O8 I8 i
忙.
1 X% N6 p; r" \7 a1 VThe kernel still uses the old table.5 Q- o6 b2 s) V( d
The new table will be used at the next reboot.# Y [1 |/ h: n: n9 d1 r$ I7 m
WARNING: If you have created or modified any DOS 6.x+ T, O$ [* g* L# ~) ~
partitions, please see the fdisk manual page for additional
; h: i i- Z H) h# W" h" einformation.
( O/ B# j) U) E% l5 e% LSyncing disks.
0 o( J5 ? z5 a. Y3 Q0 q x1.2 格式化分区3 I$ D" X. X, J6 ]0 h) N0 o0 S
mkfs.vfat /dev/sda1 #第一个分区格式化成fat32
# ?5 J- A8 L7 ` mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32; z" `$ N. k( S* h/ f* z ]
可以用
* h: n5 e- ]) S1 f tune2fs -l /dev/sda2 来检验分区类型
4 F# B. e3 n7 [! @2 `- C" \, s1.3 拷贝根文件系统
" n2 S! E5 U3 \ _! p mount /dev/sda2 /mnt/sdcard #挂载SD卡
/ {/ ]/ O. g+ F; A: H0 a r; W cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡 ( e: a$ D* I+ R' j+ m R" Y
2. 编译 ARM Linux 内核 ! E2 g- g: D7 B- K
2.1 修改内核配置
! g% r6 s1 {. z/ S h" K 确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.0 y+ q, w5 O: }9 o! W
在内核源码目录执行 make menuconfig
6 u6 F; R( r1 B: h 其中ext3在File system下.成功的配置如下。
3 _ n( ]* L7 I8 T/ I <*> Ext3 journalling file system support - j+ B3 C) ]& ^" Z/ O4 s
Ext3 extended attributes T( s2 b% Z: O7 F
Ext3 POSIX Access Control Lists Ext3 Security Labels
4 l8 Y- x x$ iSD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下6 d1 I" ^5 u$ L" g) F- N% ?# j! r
--- MMC/SD/SDIO card support
* T( B% ~8 [# [7 b6 i6 m/ F/ g MMC debugging / d* I3 P+ U% |- c
[ ] Allow unsafe resume (DANGEROUS)
C$ H _' Q+ p ^ *** MMC/SD/SDIO Card Drivers *** $ w* I% E2 S; |% B" }3 G
<*> MMC block device driver
/ [& n! }0 F- i8 v3 A Use bounce buffer for simple hosts 6 S* A0 g: H' G3 C/ d* {
<*> SDIO UART/GPS class support
. @& M1 h4 F1 c7 T+ B( k8 @ <*> MMC host test driver 3 T- ^: L0 _2 C9 M- J0 x
*** MMC/SD/SDIO Host Controller Drivers *** & W1 O* ]- d! S' L% Z: x l4 ]" t& Y2 n
<*> Secure Digital Host Controller InteRFace support
- v% }% ~+ y- b' z <*> Samsung S3C SD/MMC Card Interface 3 C+ O* x9 z2 t
support
+ h1 p% Y# c& k9 q9 C 编译内核 make zImage
) a# R3 I0 C; M% v5 z% o2.2 在ARM-linux下的测试.
- J3 [2 u* M# U; J" K) e! L3 d 在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
, R. T5 J0 e7 A8 \2 K; z4 K[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
3 s; W+ l: [" I2 ms3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). , G4 w8 \5 @$ @6 ?. r% J. A
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). / B2 C l" |& z1 N7 N
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 7 _% y% q% q8 N8 }
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). . G6 S2 {9 x' m8 c
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
, ? u' r* m, G' ~s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
0 {* O$ L; o) P2 z! C3 k' Ns3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 8 f/ p2 c7 p7 _5 {0 Y6 A
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
`; f {! O8 J; |s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz). : Q2 q2 g: o" I% s6 Z6 I0 U
mmc0: new SD card at address 0002
! @, @/ h' a8 {0 V- W) W6 O' p4 Wmmcblk0: mmc0:0002 00000 1.90 GiB
9 @5 \7 [- A* ?9 m& t) Y: R mmcblk0: p1 p2
6 n. P& D+ q3 a! L7 bFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case M( Y0 n0 r9 @, y( }% O1 h
sensitive! : b% v b6 K3 G
但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如; E$ Z* Q9 ~4 s0 K l* K: c. c1 o1 l
下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)9 v5 T& R d" I
[root: /]# ls -l /dev/mmc* 3 c$ R2 P& M% P ]5 \, s
brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0
, a7 \, `+ K0 B2 x7 I: Dbrw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2 1 w# @$ s8 k2 f1 Q
测试ext3分区! e+ k* P; ^4 C( P/ M' S W
mount -t ext3 /dev/mmcblk0p2 /mnt
: B+ z4 f( A6 c( w' z" |0 Z4 u* n在/mnt上可以读写文件.表示ext3分区正常.7 Q) D u7 _0 `7 M: H e& F
手动建立第一个分区的结点.
, O) F% _ f: e# `) Fmknod /dev/mmcblk0p1 b 179 1 " }3 z) C" ?' P! ~
测试vfat 分区. S% C. F! q& x/ K
mount -t vfat /dev/mmcblk0p1 /mnt
2 [6 K, |1 u$ {9 t在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用
6 d7 w& M- p0 t) i" Q3 L这个分区2 o$ T" X2 A+ W4 M' X
3. 使用 SD 卡分区作为根文件 9 d% F1 `( f1 x/ B: f- ]4 U* Q
修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动* G, A6 a \/ [. K
参数。
7 i- N' j' t5 _3 H+ X4 |. i) W 成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
1 M2 D9 E3 }' L其中179和2是sd卡上ext3分区的主设备和从设备号。
/ }+ u- t7 k6 B* L! c- l" G用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
8 w/ U: n- ?- M. K, |为根文件系统。
5 c, C" @# r, hPS:如果根文件系统不能正常加载,并且报错信息和下面类似: 2 N: ^* y4 K# y7 C4 @
.......: E* v4 y! _! A* z' `4 j
VFS: Cannot open root device "179:2" or unknown-block(179,2)
* m3 D2 \8 D4 i- B+ c: Z4 k1 qPlease append a correct "root=" boot option
; m( C6 X0 b4 Z) PKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
J& I! ?/ `0 y8 L9 ~ |