您的位置:首页 > 运维架构 > Linux

s3c6410 完全由SD卡启动Linux流程

2011-11-22 01:18 302 查看
Andrew Huang <bluedrum@163.com> 转载请注明作者及联络方式

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卡根文件系统>>
http://blog.chinaunix.net/space.php?uid=20587912&do=blog&id=405093

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

3.Bootloader(u-boot)操作

3.1 写bootloader
写入bootloader 需要我们的的LINUX下工具write_sd 命令,把支持SD卡启动版本 u-boot-movi.bin写入引导区

./write_sd /dev/sda u-boot-movi.bin
此时这张SD卡变成一个S3C6410启动盘

3.2 写入内核
将开发板置SD卡启动模式,并将SD卡启动盘插入.开机长按回车进入u-boot控制台
输入如下命令
tftp 0x50008000 uImage #用tftp下载内核到内存0x50008000
movi write kernel 0x50008000 #从0x50008000读取内核并写入sd卡的8092扇区

以下是命令系列

hxy # tftp 0x50008000 uImage
dm9000 i/o: 0x18000300, id: 0x90000a46
MAC: 11:22:33:44:55:66
operating at 100M full duplex mode
TFTP from server 192.168.1.254; our IP address is 192.168.1.5
Filename 'uImage'.
Load address: 0x50008000
Loading: #############################################################
#############################################################
#############################################################
#############################################################
#############################################################
#############################################################
###########################
done
Bytes transferred = 2130724 (208324 hex)
hxy # movi write kernel 0x50008000
Writing kernel to sector 3902926 (8192 sectors).. completed
hxy #

3.3 配置bootloader
# 修改内核启动配置
set bootcmd "movi read kernel 0x50008000 ; bootm 0x50008000"
#修改文件系统启动,使用ext3的根文件系统
set bootargs "noinitrd root=179:2 rw console=ttySAC0"
#保存配置
save
#重启开发板
reset

如果配置正常,应该能从SD卡启动内核看到小企鹅,并能从SD卡启动根文件系统上的qtopia

3.4 启动根文件后, 使用nfs
在开发板mount NFS服务器必须用如下选项
mount -t nfs -o intr,nolock,rsize=1024,wsisze=1024 192.168.1.254:/home/hxy /mnt/nfs
必须要用 -o intr,nolock,rsize=1024,wsisze=1024 ,这是与桌面机的
mount -t nfs 192.168.1.254:/home/hxy /mnt/nfs #最大差别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: