本帖最后由 牛头 于 2016-9-23 09:45 编辑
很多朋友希望在拿到Firelfy发布的Ubuntu镜像后,会想自己加驱动或自己编译的内核等等,但做的过程中难免出现各种各样的问题。网上各种教程都不那么切题,讲解都不是那么细致,让人感到迷茫,又或许是无助。Firefly团队努力地在帮助开发者打破此困局,整理策划了系列教程,让开发者可以通过Firefly开源平台可以快速上手开发,并快速打造出成熟产品。 “创新 开源 分享 定制”是我们的口号,我们一直在努力。
上一篇已经完成了内核编译及运行,有些朋友可能还是有点蒙,为什么这样做不会出现不进系统等问题。这次我们换一个角度去窥探下其中的奥秘:从Firefly官方固件分析系统分区组成,这是我们也替换boot镜像的理论基础。
在Firefly官方网站下载Firefly官方固件Firefly-rk3288_Ubuntu_1604_2016_09031544_Beta.img下载链接。固件有点大,请耐心等待,网速不给力的朋友待会可能哭晕在厕所。
下载好固件后,用AndroidTool去解包固件。如图,选择要解包的固件,点击Unpack静待解包完成:
解包成功后,会在AndroidTool目录生成Output目录:
进入Output目录,里面有boot.bin及firmware.img两文件和Android目录: 这里我们暂且做个假想:整个可以烧录固件img由rk bootloader及firmware打包而来,其中boot.bin为rk bootloader,firmware.img为固件。
再看看Android目录里有什么东西,点击进入,文件如下 : 从目录的文件来看,就像是Android SDK打包的firmware,但和普通的Android firmware的文件名和文件个数都不一样。感觉挺新鲜,我们继续往下看看是什么鬼!
首先打开package-file,因为看名字我就关注上它了,用文本编辑工具看看它的内容: 哈,果然有种豁然开朗的感觉,里面的各个文件名和目录里的文件名一一对应。可以猜想到,这个Android目录就应该是firmware.img文件解包而来,是一个按Android固件格式打包的Ubuntu固件。这是个关键信息。
此目录也有个RKLoader.bin,回到前边提到猜想,现在来验证一下猜想是否正确。事不宜迟,用工具对比下boot.bin及RKloader.bin,且看且珍惜: 工具分析到两个文件内容完全相同,前边的猜想是正确的。
再来看看parameter文件,这个文件让不少人载了坑,真是”众里寻他千百度蓦然回首那人却在灯火阑珊“的赶脚! 还用文本文具打开它: 此文件里面有固件对应的不少关键信息,其中最值得关注的信息为系统的分区和根文件系统挂载点信息,如下: root=/dev/mmcblk0p3 mtdparts=rk29xxnand: 0x00010000@0x00002000(boot), 0x00002000@0x00012000(backup), -@0x00014000(linuxroot) 这样看好像还是很苍白无力,但也让我们知道了系统里总共有3个分区:boot、backup、linuxroot。其中boot分区起始地址为0x2000,大小为0x10000。backup分区起始地址为0x12000,大小为0x2000。linuxroot分区起始地址为0x14000,大小不限,剩下的都是它的。root分区的挂载点为/dev/mmcblk0p3。从这个命名规则看,这个分区应该就是linuxroot这个分区了。当然也肯定是了,哈。
再回头看看package-file文件内容: package-file里面的分区名可以parameter参数里的分区名对应上,且每个分区对应的镜像文件也是一目了然。基本RESERVED的分区就是占位,实际不烧录任何数据。
现在我们再把此固件烧录到Firefly RK3288板子上,看看运行后的分区情况: 实际运行的情况看,boot、backup、linuxroot分别对应为mmcblk0p1、mmcblk0p2、mmcblk0p3。
在Hack Firefly RK3288平台时,可以通过上述方式分析系统,得到正确的parameter,同时确认下载分区时用到的分区起始地址。 但这也仅仅是hack一个linux板子的开始,后面还有很长的路要走。
|