s3c6410 支持Nand Flash本地启动Linux,包括内核,根文件系统,bootloader均写入在Nand Flash.这样可以独立运行.
很多情况下,Nand Flash的某种原因无法写入内核和Rootfs.而使用tftp下载内核,用NFS启动根文件系统比较慢.s3c6410 支持 SD卡启动,经过改造u-boot可以从SD卡引导内核,这样而Linux 又可以从SD卡的装载ext3根文件系统.这样可以制作一个完整的SD卡启动卡.
这样bootloader(u-boot)可以写入SD卡,引导扇区.
bootloader的第一阶段把自己装入在内存高端地址看后,可以用两种方法从SD卡装入内核到内存.
一种是用fatload命令从fat分区装入内核文件到内存。
fatload mmc 1 address filename
(上述命令表示从第一个mmc设备装入文件filename到内存的address当中),这个需要完整的实现fat的驱动,因此很多u-boot没有带.
另外一种常见的做法是使用u-boot的movi 命令.
用movi 命令直接读写SD卡sector.但是这样有可以与文件系统有冲突,因此要小心分区.
后面就是用这个方法来实现启动的.可以把movi读入命令写入bootcmd 实现自动启动
3.内核装入后,可以支持用ext3的格式作根文件系统,这样可以把SD卡一个分区格式化成ext3即
可以启动 ,这样要修改bootargs
这个可以参考<<
ARM-Linux使用SD卡根文件系统>>
http://www.linuxidc.com/Linux/2011-11/47797.htm
2.Linux SD分区操作.
支持这种需要2G以下,非SDHC卡,假设是一个2G SD卡,分300M给FAT,剩下全部给 EXT3格式,作根文件系统。
bootloader写在SD卡的引导区,不占用分区空间
Linux 对SD卡的的操作,如果第一个插入的SD卡是 /dev/sda,第二个SD卡是/dev/sdb ...依次类推.
如果第一个SD卡的第一个分区是 /dev/sda1 ,第二个分区 /dev/sda2 .如果上一个卡(sda)未安全拨下,而第二次插入也会变成sdb.
所以插入卡时要小心检测SD卡对应的设备结点.
2.1 Linux 分区工具 fdisk.
fdisk 与dos下的工具同名,在操作SD分区,最好把分区文件目录umount掉,否则会修改分区失败,也注意要把SD卡的写保护锁打开. 命令格式
fdisk <设备结点>
这是指设备结点/dev/sda之类,不要对/dev/sda1 之类操作.
- # fdisk /dev/sda
- The number of cylinders for this disk is set to 35560.
- There is nothing wrong with that, but this is larger than 1024,
- and could in certain setups cause problems with:
- 1) software that runs at boot time (e.g., old versions of LILO)
- 2) booting and partitioning software from other OSs
- (e.g., DOS FDISK, OS/2 FDISK)
- Command (m for help): m #<------------显示fdisk菜单
- Command action
- a toggle a bootable flag
- b edit bsd disklabel
- c toggle the dos compatibility flag
- d delete a partition
- l list known partition types
- m print this menu
- n add a new partition
- o create a new empty DOS partition table
- p print the partition table
- q quit without saving changes
- s create a new empty Sun disklabel
- t change a partition's system id
- u change display/entry units
- v verify the partition table
- w write table to disk and exit
- x extra functionality (experts only)
- Command (m for help): p #<--------------------打印分区表
- Disk /dev/sda: 2002 MB, 2002780160 bytes
- 11 heads, 10 sectors/track, 35560 cylinders
- Units = cylinders of 110 * 512 = 56320 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 2 35561 1955775+ b W95 FAT32 #原有的FAT32分区
接下操作,是删除原有分区,并且新建两个分区,一个用FAT,一个是EXT32根文件系统
- Command (m for help): d #<-------------删除一个分区
- Selected partition 1
- Command (m for help): n #<-------------新建一个分区
- Command action
- e extended
- p primary partition (1-4)
- p #<--------------选择创建 primary 首要分区
- Partition number (1-4): 1 #<---------第一个首要分区
- First cylinder (1-35560, default 1): #<---------起始位置,直接回车用缺省值
- Using default value 1
- Last cylinder or +size or +sizeM or +sizeK (1-35560, default 35560): 300M
- #<---- 第一个分区使用 300M空间
- Command (m for help): p
- Disk /dev/sda: 2002 MB, 2002780160 bytes
- 11 heads, 10 sectors/track, 35560 cylinders
- Units = cylinders of 110 * 512 = 56320 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 1 300 16495 83 Linux
- Command (m for help): n #<----建第二个分区
- Command action
- e extended
- p primary partition (1-4)
- p #<--------------选择创建 primary 首要分区
- Partition number (1-4): 2 #<---------第二个首要分区
- First cylinder (301-35560, default 301):
- Using default value 301
- Last cylinder or +size or +sizeM or +sizeK (301-35560, default 35560):
- Using default value 35560 #直接回车表示缺省值,即把剩下所有空间都归入这个分区
- Command (m for help): p
- Disk /dev/sda: 2002 MB, 2002780160 bytes
- 11 heads, 10 sectors/track, 35560 cylinders
- Units = cylinders of 110 * 512 = 56320 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 1 300 16495 83 Linux
- /dev/sda2 301 35560 1939300 83 Linux
- Command (m for help): w #<-------将分区表写入SD卡,至此才真正生效
- The partition table has been altered!
- Calling ioctl() to re-read partition table.
- Syncing disks.
2.2 格式化两个分区
第一个格式化成 FAT
mkfs.vfat /dev/sda1
第二个格式化 格式ext3 格式
mkfs.ext3 /dev/sda2
- # mkfs.vfat /dev/sda1 #<----------格式化命令
- mkfs.vfat 2.11 (12 Mar 2005)
- [root@tch u-boot-1.1.6_hxy6410]# mkfs.ext3 /dev/sda2 #<------格式化命令
- mke2fs 1.39 (29-May-2006)
- Filesystem label=
- OS type: Linux
- Block size=4096 (log=2)
- Fragment size=4096 (log=2)
- 242880 inodes, 484825 blocks
- 24241 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=499122176
- 15 block groups
- 32768 blocks per group, 32768 fragments per group
- 16192 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912
- Writing inode tables: done
- Creating journal (8192 blocks): done
- Writing superblocks and filesystem accounting information:
- done
- This filesystem will be automatically checked every 33 mounts or
- 180 days, whichever comes first. Use tune2fs -c or -i to override.
2.3 测试文件系统是否可以用
mount -t ext3 /dev/sda2 /mnt
2.4 把根文件系统拷入SD卡,r表示递归,a表示把权限,符号链接等信息也拷贝
cp -ra /home/hxy/rootfs/* /mnt
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分区作为根文件系统