因此指导学员在arm-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。
1.PC机上格式化SD卡
在桌面的PC机上用SD读卡器操作SD卡:
一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
自动mount到/media/disk和 /media/disk_1 目录。
U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。
根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。
1.1 用fdisk分区
执行fdisk /dev/sdb
fdisk有如下常用选项
1. 输入 m 显示所有命令列示。
2. 输入 p 显示硬盘分割情形。
3. 输入 a 设定硬盘启动区。
4. 输入 n 设定新的硬盘分割区。
4.1. 输入 e 硬盘为[扩展]分割区(extend)。
4.2. 输入 p 硬盘为[首要]分割区(primary)。
5. 输入 t 改变硬盘分割区属性。
6. 输入 d 删除硬盘分割区属性。
7. 输入 q 结束不存入硬盘分割区属性。
8. 输入 w 结束并写入硬盘分割区属性
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1020, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (202-1020, default 202):
Using default value 202
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
Using default value 1020
Command (m for help): p
Disk /dev/sdb: 2041 MB, 2041577472 bytes
63 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 3906 * 512 = 1999872 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 201 392522 b W95 FAT32
/dev/sdb2 202 1020 1599507 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源
忙.
The kernel still uses the old table.
The new table will be used at the next reboot.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
1.2 格式化分区
mkfs.vfat /dev/sda1 #第一个分区格式化成fat32
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32
可以用
tune2fs -l /dev/sda2 来检验分区类型
1.3 拷贝根文件系统
mount /dev/sda2 /mnt/sdcard #挂载SD卡
cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
2. 编译 ARM Linux 内核
2.1 修改内核配置
确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.
在内核源码目录执行 make menuconfig
其中ext3在File system下.成功的配置如下。
<*> Ext3 journalling file system support
[*] Ext3 extended attributes
[*] Ext3 POSIX Access Control Lists
[*] Ext3 Security Labels
SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下
--- MMC/SD/SDIO card support
[*] MMC debugging
[ ] Allow unsafe resume (DANGEROUS)
*** MMC/SD/SDIO Card Drivers ***
<*> MMC block device driver
[*] Use bounce buffer for simple hosts
<*> SDIO UART/GPS class support
<*> MMC host test driver
*** MMC/SD/SDIO Host Controller Drivers ***
<*> Secure Digital Host Controller Interface support
<*> Samsung S3C SD/MMC Card Interface
support
编译内核 make zImage
2.2 在ARM-linux下的测试.
在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
mmc0: new SD card at address 0002
mmcblk0: mmc0:0002 00000 1.90 GiB
mmcblk0: p1 p2
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
sensitive!
但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)
[root: /]# ls -l /dev/mmc*
brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0
brw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2
测试ext3分区
mount -t ext3 /dev/mmcblk0p2 /mnt
在/mnt上可以读写文件.表示ext3分区正常.
手动建立第一个分区的结点.
mknod /dev/mmcblk0p1 b 179 1
测试vfat 分区
mount -t vfat /dev/mmcblk0p1 /mnt
在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用
这个分区
3. 使用 SD 卡分区作为根文件
修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动
参数。
成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
其中179和2是sd卡上ext3分区的主设备和从设备号。
用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
为根文件系统。
PS:如果根文件系统不能正常加载,并且报错信息和下面类似:
.......
VFS: Cannot open root device "179:2" or unknown-block(179,2)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)