全志方案卡启动固件制作原理
2016-07-27 11:56
260 查看
全志SOC的方案,他们的启动卡分区表采用的是MBR分区表。我们通过如下的制作过程可以看出一二。
从sunxi论坛上( http://linux-sunxi.org/Bootable_SD_card )来看全志方案的卡启动固件制作过程。首先看一下卡的存储分布图:
start size usage
0 8KB Unused, available for partition table etc.
8 24KB Initial SPL loader
32 512KB U-Boot
544 128KB environment
672 352KB reserved
1024 - Free for partitions
从这个分布图看,可以看到前8K空间保留用来放分区表。作为MBR分区方式,那么其实它的分区表只存在第一个扇区,也就是前512Byte中,所以这8K大部分空间是没有用到的。
真正的分区空间是从1M的位置开始,所以我们在使用sfdisk分区时,第一个分区起始地址应该为1M。保留了1M的空间给予上面这些特殊的需要。
对于在分区中的空间,是可以被我们的pc识别的,我们可以通过mount挂载相应的设备文件来直接拷贝进去,但是对于保留的这1M空间,我们只能使用dd命令配合seek选项来写入数据了。
首先我们清楚sd上的数据:
1.如果想清除前1M特殊用途的空间,如下所示:
2.如果只想清楚分区表,我们看到其实只保留了前1K的空间:
烧写spl bootloader,烧入到8K的地方:
烧写uboot,烧入到32K的地方:
SD卡分区:
由此可见,分区空间是从1M开始算起的,1M到16M的空间作为boot分区。采用sfdisk为MBR分区,分区表如下所示:
/dev/sdb1 1 18 18 17019 c W95 FAT32 (LBA)
/dev/sdb2 19 1019 1001 946445+ 83 Linux
/dev/sdb3 0 - 0 0 0 Empty
/dev/sdb4 0 - 0 0 0 Empty
拷贝内核和内核配置到boot分区1,最新的内核配置应该已经改成dtb了。
其中的boot.scr和uEnv.txt这两个是用来给uboot读取启动参数用的,script.bin是kernel中的配置项,类似dts的功能。
配置uboot的启动参数:
根据boot.cmd生成u-boot能够读取的boot.src文件
uEnv.txt的内容,用来读取boot.scr
制作rootfs,解压到分区2:
从sunxi论坛上( http://linux-sunxi.org/Bootable_SD_card )来看全志方案的卡启动固件制作过程。首先看一下卡的存储分布图:
start size usage
0 8KB Unused, available for partition table etc.
8 24KB Initial SPL loader
32 512KB U-Boot
544 128KB environment
672 352KB reserved
1024 - Free for partitions
从这个分布图看,可以看到前8K空间保留用来放分区表。作为MBR分区方式,那么其实它的分区表只存在第一个扇区,也就是前512Byte中,所以这8K大部分空间是没有用到的。
真正的分区空间是从1M的位置开始,所以我们在使用sfdisk分区时,第一个分区起始地址应该为1M。保留了1M的空间给予上面这些特殊的需要。
对于在分区中的空间,是可以被我们的pc识别的,我们可以通过mount挂载相应的设备文件来直接拷贝进去,但是对于保留的这1M空间,我们只能使用dd命令配合seek选项来写入数据了。
首先我们清楚sd上的数据:
1.如果想清除前1M特殊用途的空间,如下所示:
dd if=/dev/zero of=${card} bs=1M count=1
2.如果只想清楚分区表,我们看到其实只保留了前1K的空间:
dd if=/dev/zero of=${card} bs=1k count=1023 seek=1
烧写spl bootloader,烧入到8K的地方:
dd if=spl/sunxi-spl.bin of=${card} bs=1024 seek=8
烧写uboot,烧入到32K的地方:
dd if=u-boot.bin of=${card} bs=1024 seek=32
SD卡分区:
sfdisk -R ${card} cat <<EOT | sfdisk --in-order -L -uM ${card} 1,16,c ,,L EOT
由此可见,分区空间是从1M开始算起的,1M到16M的空间作为boot分区。采用sfdisk为MBR分区,分区表如下所示:
/dev/sdb1 1 18 18 17019 c W95 FAT32 (LBA)
/dev/sdb2 19 1019 1001 946445+ 83 Linux
/dev/sdb3 0 - 0 0 0 Empty
/dev/sdb4 0 - 0 0 0 Empty
拷贝内核和内核配置到boot分区1,最新的内核配置应该已经改成dtb了。
mount ${card}${p}1 /mnt/ cp linux-sunxi/arch/arm/boot/uImage /mnt/ cp sunxi-boards/sys_config/a10/script.bin /mnt/ cp boot.scr /mnt/ cp uEnv.txt /mnt/ umount /mnt/
其中的boot.scr和uEnv.txt这两个是用来给uboot读取启动参数用的,script.bin是kernel中的配置项,类似dts的功能。
配置uboot的启动参数:
setenv bootargs console=ttyS0,115200 noinitrd root=/dev/mmcblk0p2 init=/sbin/init rootwait panic=10 ${extra} fatload mmc 0 0x43000000 boot/script.bin fatload mmc 0 0x48000000 boot/uImage bootm 0x48000000
根据boot.cmd生成u-boot能够读取的boot.src文件
mkimage -C none -A arm -T script -d boot.cmd boot.scr
uEnv.txt的内容,用来读取boot.scr
bootenv=boot.scr loaduimage=fatload mmc ${mmcdev} ${loadaddr} ${bootenv} mmcboot=echo Running boot.scr script from mmc ...; source ${loadaddr}
制作rootfs,解压到分区2:
Using rootfs tarball mount ${card}${p}2 /mnt/ tar -C /mnt/ -xjpf my-chosen-rootfs.tar.bz2 umount /mnt
相关文章推荐
- VC中隐藏、显示、移动、改变大小控件收藏
- JDK 1.8 帮助文档 英文版 使用前续解锁
- 启动流程服务管理
- java 多态
- hdu 2126 Buy the souvenirs 二维01背包方案总数
- CodeForces 448D Multiplication Table (二分 )
- iOS label 左上对齐
- Java反射中的getFields()和getDeclaredFields()的区别。
- 运行node.js 后台代码准备工作
- wifi漫游
- 前端面试
- 从零开始的Android新项目2 - Gradle篇
- 语培市场热度不减,“手韩”背后的垂直领域空间在哪?
- Hadoop2.7.x中所有的DataNode都启动不了解决办法
- [iOS 报错]AFNetWorking Get请求中含有中文则报错
- 跳出面向对象思想(三) 封装
- 当Android遇见HTTP缓存代理服务器
- 删除TFS云端上的项目
- 多校 GCD
- js实现textarea高度根据内容自适应