EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经1 N o1 Z5 p; |3 U# `
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。 8 P1 k/ g! r, l+ r& \
1.PC机上格式化SD卡 . Q( ^7 T9 ?3 Q% ~3 e
在桌面的PC机上用SD读卡器操作SD卡:. @9 b. G7 K0 A/ e1 K7 n
一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
/ t+ m; A! n) s自动mount到/media/disk和 /media/disk_1 目录。
* L4 z) i' G5 G U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测
. o8 V' I3 W. @) b4 i+ U% P8 `) u! L时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,0 b7 P4 o* F: E3 H+ C
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。 ( M% K( l& t; w3 u" r# Z
1.1 用fdisk分区
/ k% A" L8 h2 l% h' c: w 执行fdisk /dev/sdb' W# I( L* T& E' c8 y. H6 g
fdisk有如下常用选项
- e6 @: V, `, _1. 输入 m 显示所有命令列示。
0 z6 M6 l3 c5 r& C% n, w9 r2. 输入 p 显示硬盘分割情形。 + r: }% E |2 C3 d- r% u; f
3. 输入 a 设定硬盘启动区。
- Q! L* x9 Y! M S, \! z$ l ]7 f4 s4. 输入 n 设定新的硬盘分割区。
) U8 M( U1 I2 [9 N; ~ 4.1. 输入 e 硬盘为[扩展]分割区(extend)。 9 w, W! b, S% p/ o, v, H0 p+ p* t O
4.2. 输入 p 硬盘为[首要]分割区(primary)。 1 D& S4 `) N4 `9 l; `, X
5. 输入 t 改变硬盘分割区属性。 3 [4 Y3 {( n6 z
6. 输入 d 删除硬盘分割区属性。
1 v6 g( v. P2 X9 \3 q! P0 y" d5 J7. 输入 q 结束不存入硬盘分割区属性。 ( e0 `& Y ^* g' L
8. 输入 w 结束并写入硬盘分割区属性
- S# `# n5 u& p* |如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分" |+ J- K! b3 `7 h
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。5 S5 n6 ?2 H9 X- S# o( c& {) o8 v
Command (m for help): n& M7 U+ k/ g, K {7 [" Z( G
Command action
, M4 B# }5 Z' i* ^8 @# D( r2 g e extended
% L) v$ ^) K4 f/ _' r. P p primary partition (1-4)! N8 J, R7 ?2 a
p
8 K; }, _' d+ Z1 Q6 bPartition number (1-4): 1
8 a( Q. G3 G3 h; t, XFirst cylinder (1-1020, default 1): ) ^0 D' c4 K, L5 X7 z1 O- U q
Using default value 15 n/ Z# u# Y1 \; K
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
0 ?2 ^0 C8 s$ X7 I# i# gCommand (m for help): n
; y5 N: v' u. R0 yCommand action# s8 n. \" q" M3 q* U# u
e extended
{& G1 } H/ a2 E( n p primary partition (1-4); e$ w& y: C9 P) z, _4 ^0 m3 W
p2 }+ |, ~* b! R
Partition number (1-4): 2! R7 g6 n" ]4 E1 J( B+ C- V
First cylinder (202-1020, default 202):
7 Z8 y' ~& R$ ] K* N5 yUsing default value 202
5 Q4 |: p+ m% `8 k! v" m" sLast cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): - w" ?( ^- ^5 Y8 I1 t& c$ B
Using default value 1020 i( F( ^, g: ?, E0 R- ~& F
Command (m for help): p
6 O! a9 L6 B' p* _Disk /dev/sdb: 2041 MB, 2041577472 bytes
5 N ^: E, p$ ~! L- x" F" F6 A7 i63 heads, 62 sectors/track, 1020 cylinders4 Q, q" q _6 Y' C0 i# K) B
Units = cylinders of 3906 * 512 = 1999872 bytes
: b5 n( |0 O0 h+ g Device Boot Start End Blocks Id System
4 a" C& _% l8 a+ N/dev/sdb1 1 201 392522 b W95 FAT32
; I+ }" j$ \: n2 |* V9 C+ X& A/dev/sdb2 202 1020 1599507 83 Linux
- D; [( B; C3 w- @4 P" f( K5 aCommand (m for help): w8 c# }- d, i& m
The partition table has been altered!
' {: Z6 x# s, U2 NCalling ioctl() to re-read partition table.+ q. j3 ]/ [6 _
WARNING: Re-reading the partition table failed with error 16: 设备或资源: i9 {/ e; P0 P' w7 o
忙.6 c+ n0 k0 x7 V0 z( |
The kernel still uses the old table. i2 R' Q3 H, m; |% B7 A0 Y& P/ x
The new table will be used at the next reboot.+ t2 b v0 O9 \4 N! ], B: h
WARNING: If you have created or modified any DOS 6.x5 ?7 Y3 [6 i% A2 Q$ m; h
partitions, please see the fdisk manual page for additional3 x0 R4 n8 e8 D% D. e% H8 n
information.
a; j1 a9 k s: G4 X) USyncing disks. / c3 j; F5 o! U; g8 a; C& u; H/ L
1.2 格式化分区
- s1 H. d# ]) m7 w+ @; H mkfs.vfat /dev/sda1 #第一个分区格式化成fat321 y/ I' G# U, H5 b3 n* d; L2 c
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat327 k6 o$ r; w/ f1 `
可以用 , i7 Y1 h9 ~7 `4 T3 X& Y
tune2fs -l /dev/sda2 来检验分区类型 $ o8 F8 h+ X% u# w P+ r5 R
1.3 拷贝根文件系统
' a7 m% }4 T8 i, @" n* F; n, r mount /dev/sda2 /mnt/sdcard #挂载SD卡
% K* I O& c6 ^( p& b5 C cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡 $ z; }+ v& v; u$ [4 w4 Y7 a7 A
2. 编译 ARM Linux 内核 ' ~3 c6 [; G4 k
2.1 修改内核配置
2 N* z9 P4 D/ e1 ~ 确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.3 |# p3 S# y1 `
在内核源码目录执行 make menuconfig
: a0 T7 t1 T/ J9 Y' l8 l 其中ext3在File system下.成功的配置如下。
5 E' p! A6 I7 ?& q <*> Ext3 journalling file system support
* g: @5 l/ V7 \% _ Ext3 extended attributes
0 N- o6 p! {$ e/ K. g7 D$ ? Ext3 POSIX Access Control Lists Ext3 Security Labels 3 @: v- l$ V3 x1 U) v2 d5 _
SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下2 A, @( `$ X3 s. t3 g; V
--- MMC/SD/SDIO card support
! W. W, i0 ]! Q1 [1 ] MMC debugging
5 G4 O, `- N4 K* R9 ]: k! f [ ] Allow unsafe resume (DANGEROUS)
* E9 v( ?- Z6 O2 d) M' i *** MMC/SD/SDIO Card Drivers *** ' w6 @% X# k3 O' C- J
<*> MMC block device driver 0 M( \- m% K) \
Use bounce buffer for simple hosts
2 G% E, t$ V3 x* A0 n! ~# C, S <*> SDIO UART/GPS class support
) P& {8 a3 E4 Z( s% @4 u; S <*> MMC host test driver / ]9 {% m: E8 R5 N
*** MMC/SD/SDIO Host Controller Drivers ***
" [1 O& Z2 O( l9 O7 `% C <*> Secure Digital Host Controller InteRFace support
: {8 F& K- W% ~- A& b0 ?6 F7 S, d <*> Samsung S3C SD/MMC Card Interface - L4 `( C: G" Z* Z$ [
support
% R$ z6 W B& a2 _8 z 编译内核 make zImage) {5 w" m& r8 v# S$ q
2.2 在ARM-linux下的测试., d7 S& }0 R7 K+ U6 ^: J4 t$ b- J
在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上0 V9 p- C7 O0 ?# y2 q/ n
[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz). ! x0 G" g! K) h2 Y
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
8 z8 ~% R; d9 H, l: X3 _% As3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). # u; |" w5 s' }
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 3 e1 v4 A: w J- j' z/ b% I: b
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
! J0 c. [: v+ Ls3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 8 Z, Q5 \" v G+ W* [- f
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
, g- t1 Z" G, ^+ Z' r% \s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
/ K4 T: Q, w/ E; M* H* hs3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz). . }* F3 }2 V# d# A' n
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
, z0 w' q) U3 N7 s) t" dmmc0: new SD card at address 0002
3 o0 E( d& e6 O, i5 ^& ymmcblk0: mmc0:0002 00000 1.90 GiB 6 f& Q' y6 Z0 ~7 T
mmcblk0: p1 p2 4 W/ n9 ^; E9 e2 [3 ^" N
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
4 f, D7 J0 Z' R+ ?sensitive!
7 ]8 E6 ?6 D |但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
4 g, B( ^/ ]: E8 w$ [5 }下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)
0 u- Q+ I' Y0 ]8 I[root: /]# ls -l /dev/mmc* 9 V1 D- I, \) j3 I1 I8 [' n
brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0 ! W) O s8 l b; `5 C2 e
brw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2
9 u% Q$ e( o) Y1 L4 r测试ext3分区4 V( @! y8 g5 C1 f) T- y
mount -t ext3 /dev/mmcblk0p2 /mnt( U& g1 D I1 l* E5 N$ r
在/mnt上可以读写文件.表示ext3分区正常.# W) c1 _* E# {" ~' v$ v
手动建立第一个分区的结点.
! z4 }1 c+ u' xmknod /dev/mmcblk0p1 b 179 1 % I% L. c+ M! ]
测试vfat 分区# X! e/ ^) ?( X E. V* D
mount -t vfat /dev/mmcblk0p1 /mnt
8 z4 ?( M* m( [4 ~! a& |+ P在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用' v. y$ f4 N5 g2 [& `4 ^8 e7 s
这个分区
5 p' A7 D9 q: r$ `3. 使用 SD 卡分区作为根文件
) L1 }) E8 c9 _, i! s3 X; ]& i 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动' n- D& p% O+ n$ P" A
参数。0 ^6 j! {# L4 @' u0 N1 A) m7 w) Q
成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0 ( ^1 b$ W- w+ U a, [) f! q
其中179和2是sd卡上ext3分区的主设备和从设备号。5 y, t2 M3 P3 X2 _1 ]
用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作) ]4 _8 o6 n- `" \2 ]. K( c
为根文件系统。 0 }' S7 L# {+ A z
PS:如果根文件系统不能正常加载,并且报错信息和下面类似:
7 e6 \7 X6 s5 E( i7 i, l.......' k8 b3 x3 e* Y. w
VFS: Cannot open root device "179:2" or unknown-block(179,2)! P5 p4 C. ?/ n% J+ o
Please append a correct "root=" boot option
# u1 N( B1 V& A$ \1 q% R8 rKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
2 a) ?( q+ R6 k6 ?5 I |