EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经* ]2 O' N% l$ e, y" b |
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。
: ^/ O& n- m$ P1.PC机上格式化SD卡
2 D: A* _, F/ l 在桌面的PC机上用SD读卡器操作SD卡:
) d2 Z! J9 X5 x* b, D' _& i 一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
. m. }. Q1 `, o" Q$ u自动mount到/media/disk和 /media/disk_1 目录。! d' F+ D0 ]/ e, O
U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测7 n; l+ F7 q9 q; K" \3 X
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,
8 i% N% a2 m; v. G9 }& Z做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。
- V4 R5 a& X1 H7 g# u+ j1.1 用fdisk分区
3 Y. s Q# @( K) w0 {' z 执行fdisk /dev/sdb
/ l3 s6 M6 ^# i9 V$ W fdisk有如下常用选项4 O7 s ^5 `' `- l" @1 K
1. 输入 m 显示所有命令列示。 ( [* ^3 A2 V% M4 R3 k S9 X
2. 输入 p 显示硬盘分割情形。
8 ]" G8 D) ? u3 s& E3. 输入 a 设定硬盘启动区。 . ^$ j5 k+ _: L% g8 s' k6 Q
4. 输入 n 设定新的硬盘分割区。
`2 x9 b1 q+ x; q2 |3 f 4.1. 输入 e 硬盘为[扩展]分割区(extend)。
) Z% o8 @$ \/ a: u f 4.2. 输入 p 硬盘为[首要]分割区(primary)。 , n9 ^- O) n' |) t
5. 输入 t 改变硬盘分割区属性。 & ~9 T ?& j/ u- ` p! s+ Y* O, K
6. 输入 d 删除硬盘分割区属性。
" y6 L, k1 P, d# n$ ^7. 输入 q 结束不存入硬盘分割区属性。
: `) E8 t" H9 x8. 输入 w 结束并写入硬盘分割区属性5 E0 x$ x( {$ {8 i' ], M$ S/ P& h' l* x
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分% A2 B/ [1 v2 ?4 e7 n" i- i1 F
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。8 a k( I a! p' V& |
Command (m for help): n
1 s/ f- Y9 H5 [( J( j9 b2 jCommand action& f1 P' C8 E, u8 {! V/ h) }
e extended% o+ W m& o' ?" ?
p primary partition (1-4)
' w u+ _9 x( ?3 G3 ?1 Y' c" }p
2 G7 |# {: q" [Partition number (1-4): 1
9 x! O& r: I4 xFirst cylinder (1-1020, default 1):
, U0 W9 }- D0 O4 w' w/ S% [Using default value 1: `$ R" q% U) ^ i2 h
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M' r2 k( h: |- S" o5 C; i" q: {
Command (m for help): n, P6 A, o) [9 g6 S
Command action
2 R G' v% X; G2 }$ J/ P# Y e extended
. E( e' C$ U9 d* n p primary partition (1-4)
: V# N3 b6 c. A4 K! Zp
: ]. W1 B' P0 }+ ^* HPartition number (1-4): 2" k4 Q) y8 U' i& B! r6 d2 m$ H
First cylinder (202-1020, default 202): - @" m: N4 S) t6 S1 ^& T7 {( [
Using default value 202* Z4 V$ n8 N8 R% S. g
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): : X3 d3 K c- n5 u9 H+ D! B
Using default value 1020
% @7 e& I: C( s8 f6 h0 f/ KCommand (m for help): p+ D" u4 _' V$ u) x1 n
Disk /dev/sdb: 2041 MB, 2041577472 bytes ' n' G) G9 L) \- M9 y
63 heads, 62 sectors/track, 1020 cylinders4 T* @3 g# ?) F& b$ ?* B+ S( J
Units = cylinders of 3906 * 512 = 1999872 bytes
6 G W! D5 P) B- u Device Boot Start End Blocks Id System
9 ]3 ~8 F$ C, W! y: a/dev/sdb1 1 201 392522 b W95 FAT32$ F- h# |( V- S ]! c; }
/dev/sdb2 202 1020 1599507 83 Linux$ T$ H, m2 y5 Z8 a# | x J7 |
Command (m for help): w' ?7 M4 d2 A) W) k
The partition table has been altered!2 Z+ H* ~- Q) E
Calling ioctl() to re-read partition table.
: \% d0 _% @- \: u! Y) g8 g( rWARNING: Re-reading the partition table failed with error 16: 设备或资源& K$ ^% S% W3 Y( U
忙.5 F+ ?" m# C) C2 N( c) b
The kernel still uses the old table.. ]' I* f! w/ y( x9 G+ Q6 d
The new table will be used at the next reboot.
5 \: y) g7 N% c; jWARNING: If you have created or modified any DOS 6.x7 H9 C( \ c$ [6 {6 \9 F
partitions, please see the fdisk manual page for additional
+ ~2 e2 j8 @4 D. n/ W0 iinformation.# ]. T" j! I3 d! B
Syncing disks.
1 S% O! F! e3 A. O1.2 格式化分区
' e, L# g% f5 S* L/ [- q mkfs.vfat /dev/sda1 #第一个分区格式化成fat32$ S6 y! ?1 s7 ]+ a8 j
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32
0 w" A" z6 c6 H! p8 s; z4 i: p 可以用 ' H7 L( I h9 T7 t
tune2fs -l /dev/sda2 来检验分区类型
& e% D9 [+ Z0 t, G9 s4 l6 c1.3 拷贝根文件系统
m6 \8 H( @7 a) f& [- ?( E! d mount /dev/sda2 /mnt/sdcard #挂载SD卡
- k7 ]/ ]$ v! q [6 N9 @) J cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
* |7 P; H4 e! l& O3 `2. 编译 ARM Linux 内核
' ^5 O% E* E1 W5 b. G 2.1 修改内核配置
' X( W' H) h* Y* ]9 c 确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.! d4 Z: ^3 g6 j/ u
在内核源码目录执行 make menuconfig
8 f+ h$ K& {1 o( r: s 其中ext3在File system下.成功的配置如下。) W* Z/ s' _- b7 w' W
<*> Ext3 journalling file system support ( U* t' C* n. g9 E4 y4 K
Ext3 extended attributes
" w/ ?- G, | M Ext3 POSIX Access Control Lists Ext3 Security Labels : H: @" B$ {) J2 ^ ?8 w) B
SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下
) m9 L' X$ U+ R& e6 f* s+ }; P: E) ? --- MMC/SD/SDIO card support
- e8 O' X* q* H6 _, b MMC debugging 2 C+ y: G, W0 S7 @ L$ a* z
[ ] Allow unsafe resume (DANGEROUS) 5 l$ k) Y1 {! y! k* @' R
*** MMC/SD/SDIO Card Drivers ***
2 F3 f% b' V& T" u ]: g3 c1 v <*> MMC block device driver
$ ^6 p5 q: `1 J1 e Use bounce buffer for simple hosts
. `8 Y1 v# J8 }! P+ O& ` <*> SDIO UART/GPS class support + v o- X, n" f
<*> MMC host test driver
$ {7 R6 k6 _4 q: r }" e *** MMC/SD/SDIO Host Controller Drivers *** , N( B" L2 ~# Z* f* c" f
<*> Secure Digital Host Controller InteRFace support
/ E- d9 O# S: J$ M2 ^4 ~6 B$ }1 q <*> Samsung S3C SD/MMC Card Interface $ W b4 ?8 S1 ^2 z5 |. f) d
support
8 F- a: Q2 u: K) G7 |# a 编译内核 make zImage' S. T6 v" O, p, T) c6 w' e
2.2 在ARM-linux下的测试.+ h3 u6 Z Y8 n/ [, ]
在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
$ P4 t( z7 f6 g9 r" I0 z[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz). # j J/ R g1 E5 l0 S4 m ]3 ~
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). / }. s$ f; D$ l, Y: p5 L: J
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
; i1 j3 H0 v" x- r* s6 s- I7 W- zs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
* F4 a2 B; r9 x6 r* ~3 g/ is3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
. @ h& e' p' j/ Gs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
7 N, B0 N1 ~7 H. Os3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
* D; v* U3 |" s: }3 h9 C( js3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
& b7 w$ ]9 Z( M2 @6 [6 s- ^s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
$ r2 i0 Y9 `3 H0 T% ]s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
) j. P p, Q! w8 @& Dmmc0: new SD card at address 0002 - _/ t K6 q. T
mmcblk0: mmc0:0002 00000 1.90 GiB
5 j* K# z8 R3 N, J9 ? mmcblk0: p1 p2
* z; |9 r ^5 U% r, A! d3 wFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case, `& s1 S1 N0 n' }2 T! s
sensitive! 1 `! X& ?( }: R6 E' M6 k3 f
但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如 o! g& j1 R. e1 D6 N6 D
下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)# r5 h( Q+ y! Q4 l5 k
[root: /]# ls -l /dev/mmc*
' ~ ]8 j" O& z$ sbrw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0
5 y# ^9 x/ S; a( Z% ^3 cbrw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2
$ L) D P* @ C; I# ?7 ~1 E$ t. f, X测试ext3分区. H% Q0 d; w3 U: C& p
mount -t ext3 /dev/mmcblk0p2 /mnt
- v+ l) C- }2 U/ l) ^7 o: `在/mnt上可以读写文件.表示ext3分区正常.
. q- f9 S" u6 q3 f手动建立第一个分区的结点.( Z2 Q0 v: W7 u3 U* j' @0 P) ^& s
mknod /dev/mmcblk0p1 b 179 1 - [% g2 T: I: s; H; z, M- G, p
测试vfat 分区2 ~# b: V' x+ [9 k! O# J) Y
mount -t vfat /dev/mmcblk0p1 /mnt
! B$ Q6 }& h% f+ ~1 Q5 Q在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用9 t( e9 e$ B0 g' \8 a7 W, P
这个分区
9 [4 h0 _3 I, B. S2 L+ T- a8 d3. 使用 SD 卡分区作为根文件
1 G7 h0 J) i1 {% V4 u 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动
9 o% v* f+ J* O) b参数。. a4 I. j9 G: y( s0 L$ p+ K
成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0 % t9 g; u) m4 ]7 f1 R/ P: g" b. ~
其中179和2是sd卡上ext3分区的主设备和从设备号。
2 z3 I# O# t, p |. K用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
0 i' d: |/ q- }/ ?. D为根文件系统。 7 y; Y+ ^8 @8 \9 ?2 a
PS:如果根文件系统不能正常加载,并且报错信息和下面类似: 4 @. ~; |0 }% I( w" K. g7 c
.......
5 J1 U3 e" [/ E2 z( B; H VFS: Cannot open root device "179:2" or unknown-block(179,2)1 I. ~* [) v y. \7 m
Please append a correct "root=" boot option
% _8 j D/ Y( S$ X2 m. [Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2) 3 Y Z T( s3 h6 e
|