1. s3c6410 SD启动原理
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卡根文件系统>>
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