s3c6410 完全由SD卡启动Linux流程

时间:2023-01-10 12:23:35

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 之类操作.
  1. # fdisk /dev/sda
  2. The number of cylinders for this disk is set to 35560.
  3. There is nothing wrong with that, but this is larger than 1024,
  4. and could in certain setups cause problems with:
  5. 1) software that runs at boot time (e.g., old versions of LILO)
  6. 2) booting and partitioning software from other OSs
  7. (e.g., DOS FDISK, OS/2 FDISK)
  8. Command (m for help): m   #<------------显示fdisk菜单
  9. Command action
  10. a toggle a bootable flag
  11. b edit bsd disklabel
  12. c toggle the dos compatibility flag
  13. d delete a partition
  14. l list known partition types
  15. m print this menu
  16. n add a new partition
  17. o create a new empty DOS partition table
  18. p print the partition table
  19. q quit without saving changes
  20. s create a new empty Sun disklabel
  21. t change a partition's system id
  22. u change display/entry units
  23. v verify the partition table
  24. w write table to disk and exit
  25. x extra functionality (experts only)
  26. Command (m for help): p #<--------------------打印分区表
  27. Disk /dev/sda: 2002 MB, 2002780160 bytes
  28. 11 heads, 10 sectors/track, 35560 cylinders
  29. Units = cylinders of 110 * 512 = 56320 bytes
  30. Device Boot Start End Blocks Id System
  31. /dev/sda1 2 35561 1955775+ b W95 FAT32  #原有的FAT32分区
接下操作,是删除原有分区,并且新建两个分区,一个用FAT,一个是EXT32根文件系统
  1. Command (m for help): d #<-------------删除一个分区
  2. Selected partition 1
  3. Command (m for help): n #<-------------新建一个分区
  4. Command action
  5. e extended
  6. p primary partition (1-4)
  7. p #<--------------选择创建 primary 首要分区
  8. Partition number (1-4): 1 #<---------第一个首要分区
  9. First cylinder (1-35560, default 1): #<---------起始位置,直接回车用缺省值
  10. Using default value 1
  11. Last cylinder or +size or +sizeM or +sizeK (1-35560, default 35560): 300M
  12. #<---- 第一个分区使用 300M空间
  13. Command (m for help): p
  14. Disk /dev/sda: 2002 MB, 2002780160 bytes
  15. 11 heads, 10 sectors/track, 35560 cylinders
  16. Units = cylinders of 110 * 512 = 56320 bytes
  17. Device Boot Start End Blocks Id System
  18. /dev/sda1 1 300 16495 83 Linux
  19. Command (m for help): n #<----建第二个分区
  20. Command action
  21. e extended
  22. p primary partition (1-4)
  23. p #<--------------选择创建 primary 首要分区
  24. Partition number (1-4): 2 #<---------第二个首要分区
  25. First cylinder (301-35560, default 301):
  26. Using default value 301
  27. Last cylinder or +size or +sizeM or +sizeK (301-35560, default 35560):
  28. Using default value 35560 #直接回车表示缺省值,即把剩下所有空间都归入这个分区
  29. Command (m for help): p
  30. Disk /dev/sda: 2002 MB, 2002780160 bytes
  31. 11 heads, 10 sectors/track, 35560 cylinders
  32. Units = cylinders of 110 * 512 = 56320 bytes
  33. Device Boot Start End Blocks Id System
  34. /dev/sda1 1 300 16495 83 Linux
  35. /dev/sda2 301 35560 1939300 83 Linux
  36. Command (m for help): w #<-------将分区表写入SD卡,至此才真正生效
  37. The partition table has been altered!
  38. Calling ioctl() to re-read partition table.
  39. Syncing disks.

  2.2 格式化两个分区   第一个格式化成 FAT         mkfs.vfat /dev/sda1   第二个格式化 格式ext3 格式 mkfs.ext3 /dev/sda2  
  1. # mkfs.vfat /dev/sda1 #<----------格式化命令
  2. mkfs.vfat 2.11 (12 Mar 2005)
  3. [root@tch u-boot-1.1.6_hxy6410]# mkfs.ext3 /dev/sda2 #<------格式化命令
  4. mke2fs 1.39 (29-May-2006)
  5. Filesystem label=
  6. OS type: Linux
  7. Block size=4096 (log=2)
  8. Fragment size=4096 (log=2)
  9. 242880 inodes, 484825 blocks
  10. 24241 blocks (5.00%) reserved for the super user
  11. First data block=0
  12. Maximum filesystem blocks=499122176
  13. 15 block groups
  14. 32768 blocks per group, 32768 fragments per group
  15. 16192 inodes per group
  16. Superblock backups stored on blocks:
  17. 32768, 98304, 163840, 229376, 294912
  18. Writing inode tables: done
  19. Creating journal (8192 blocks): done
  20. Writing superblocks and filesystem accounting information:
  21. done
  22. This filesystem will be automatically checked every 33 mounts or
  23. 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扇区     以下是命令系列  
  1. hxy # tftp 0x50008000 uImage
  2. dm9000 i/o: 0x18000300, id: 0x90000a46
  3. MAC: 11:22:33:44:55:66
  4. operating at 100M full duplex mode
  5. TFTP from server 192.168.1.254; our IP address is 192.168.1.5
  6. Filename 'uImage'.
  7. Load address: 0x50008000
  8. Loading: #############################################################
  9. #############################################################
  10. #############################################################
  11. #############################################################
  12. #############################################################
  13. #############################################################
  14. ###########################
  15. done
  16. Bytes transferred = 2130724 (208324 hex)
  17. hxy # movi write kernel 0x50008000
  18. Writing kernel to sector 3902926 (8192 sectors).. completed
  19. 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 #最大差别