fastboot刷机的前提是你的开发板uboot良好并能正常启动进入fastboot模式,你的开发版的nand分区已存在。对于Android的uboot而言, 已经实现了fastboot命令,当你进入uboot命令行时键入fastboot即可进入fastboot模式,这个时候会调用usb相关驱动,和外部建立连接,如果你使用的是windows系统,那么你需要下载相应版本的fastboot,然后安装对应你开发板的usb驱动程序,当启动fastboot命令后便能通过usb连接上开发板,通过fastboot提供的命令进行刷机操作,而这些所有的操作其实都是基于fastboot与usb通信约定的,当你将镜像文件通过fastboot命令经过usb传入ram时,这个时候另一端的开发板正在监听usb传递过来的数据,然后通过fastboot约定好的命令对这些数据进行处理,处理的实质就是uboot通过查找对应的分区表,然后对这些数据使用命令mmc,或者是nand命令写入到对应的分区中。

下面介绍一种裸刷机而非fastboot刷机(fastboot的刷机实质),在刷机前你需要满足3个条件:

1.你能够进入你的uboot控制台。

2.你的uboot控制台支持mmc/nand命令(实现mmc命令的格式可能不同)

3.你得知道你分区的情况。例如下面的分区:

efi partition table:

ptbl slot: EMMC:(1).

     256       128K xloader

     512       256K bootloader

    1024     128K misc

    2048     16M efs

   34816     16K crypto

   34848         8M recovery

   51232         8M boot

   67616         512M system

1116192       256M cache

1640480       29630M userdata

Net:   KS8851SNL

表示的意思依次是: 分区起始块(十进制) 分区大小   分区名,排列如下:

0 --------+

             + 分区表

256------+

             + xloader

512------+

              + bootloader

1024----+

          ........

(通常,对于nand分区来说是按照块大小进行划分的,最小单位就是块(512字节),如上面xloader分区,计算一下128*1024/(512-256)= 512(byte))所以上面的块起始也表示该分区的起始地址,如boot的起始地址就是0xc820 (按照块寻址)。

假设当前我的android启动后控制台是普通权限,为了能启动后为管理员权限,我必须修改init.rc中的console服务,修改前后如下:

修改前:

service console /system/bin/sh

     class core

     console

     disabled

     user shell

     group log

修改后:

service console /system/bin/sh

     class core

     console

     disabled

     user root

     group root

     为了能刷机后正常启动,我们先提取上面的boot分区中的boot.img镜像,boot分区保存着boot.img镜像文件数据,而boot.img包含了android使用的ramdisk.img和kernel文件以及bootarmgs参数(可选),所以我们只需要将boot.img提取出来然后分离里面的ramdisk.img,接着对ramdisk.img解压后修改init.rc文件,然后重新打包ramdisk.img,在将这个修改过的ramdisk.img和内核以及bootarmgs重新打包为boot.img,之后写入到boot分区中,总结一下就是如下步骤;

     1.提取boot.img和kernrl

通过上面不难发现boot对应的分区节点是mmcblk0p7,执行如下命令:

$dd if=/dev/block/mmcblk0p7 of=/data/boot.img

得到boot.img后,直接通过C32二进制编辑工具,提取ramdisk.img,这里需要对boot.img文件构成进行了解,boot.img主要是由2kb大小的头+ramdisk.img+kernel构成,前2kb头信息由结构体struct boot_img_hdr表示,具体可以参考$(TOP)/system/core/mkbootimg/bootimg.h源码文件。

将boot.img载入C32如下图:

上面贴出了128字节的数据,其中红色划线部分表示BOOT_MAGIC,蓝色的前面部分表示内核大小,后面为内核的载入物理地址,

紫色划线的前面部分表示ramdisk.img大小,后面表示ramdisk载入的物理地址,由上面我们可以知道:

kernel_size = 0x43e598 (大约4.1M)

ramdisk_size = 0x28b9e  (大约162KB)

载入基址(base)= 0x80000000  //打包boot.img用

由于数据按照页对齐,通过源码不难发现一页大小为2kb,那么根据boot.img的格式分析得出:

kernel数据范围:0x800 --> 0x43F000(本来实际是到0x800-->0x800+0x43e598,由于按照2k页对齐,所以超出部分按照1页计算)

ramdisk数据范围:0x43F000 -------> 0x468000(实际是0x43F000 -->0x43F000 +0x28b9e)

这样我们就确定了实际的kernel和ramdisk数据范围:

kernel实际数据范围:0x800-->0x43ED98

ramdisk实际数据范围:0x43F000 -->0x467B9E

之后通过单击右键选择块复制-》新建文件粘贴另存,就提取了ramdisk和kernel.

2.解压ramdisk.img修改并打包

解压步骤如下:

$mv ramdisk.img ramdisk.img.gz

$gunzip ramdisk.img.gz

$mkdir ramdisk

$cd ramdisk

$cpio -i -F ../ramdisk.img

经过修改后打包,打包如下:

(mkbootfs 和minigzip可以在android源码生成的out/host/linux-x86/bin/下找到)

$mkbootfs ramdisk | minigzip > ./ramdisk.img

3.生成boot.img

mkbootimg  --kernel out/target/product/panda/kernel --ramdisk out/target/product/panda/ramdisk.img --cmdline "console=ttyO2,115200n8 mem=1024M androidboot.console=ttyO2 vram=20M omapfb.vram=0:16M" --base 0x80000000 --output out/target/product/panda/boot.img

     由于本boot.img中未见cmdline参数,所以不需要加--cmdline,正确命令如下:

(mkbootimg 在out/host/linux-x86/bin/可以找到,kernel 为你提取的源内核,ramdisk.img为修改后的,0x80000000为上面计算出来的基址)

$mkbootimg --kernel  kernel --ramdisk ramdisk.img --base 0x80000000 --output ./boot.img

4.烧写boot.img到boot分区

1.确保你的tftp搭建好。

2.进入uboot模式,配置ipaddr和serverip,需要的话可配置ethaddr网卡地址。

3.执行如下命令。mmc命令格式可能不太一样:

$mmcinit 1    ;1表示mmc槽位

$mmc 1 erase 0xc820 0x800000    ;意思是擦除起始地址为0xc820大小为8M的块

$tftp 0x81000000 boot.img            ;意思是通过tftp命令将boot.img文件先载入到内存地址为0x81000000的地方,这里下载完毕后得到boot.img大小记为ramdisk_size.

$mmc 1 write 0x81000000 0xc820 ramdisk_size   ;意思是将内存地址为0x81000000的地方的大小为ramdisk_size的数据拷贝到起始地址为0xc820中

     这样烧写完毕,你可以通过#mmc 1 read 0x80000000 0xc820 0x200 将起始地址0xc820大小为512字节的数据复制到内存起始地址为0x80000000的地方,然后通过$md 0x81000000 0x200命令进行查看对比是否和boot.img开头数据一致。

所有操作完毕,reset重启开发版吧!

介绍一种android的裸刷机方法(fastboot刷机实质)的更多相关文章

  1. 几种Android混淆和逆向工具介绍

    针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ...

  2. view--4种Android获取View宽高的方式

    有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View ...

  3. Android手机fastboot 刷机命令【转】

    本文转载自:http://luke-feng.iteye.com/blog/2171090 简介:在安卓手机中fastboot是一种比recovery更底层的模式.fastboot是一种线刷,就是使用 ...

  4. S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)

    一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...

  5. 使用fastboot刷机流程【转】

    本文转载自:http://www.voidcn.com/blog/Qidi_Huang/article/p-6236224.html [准备工作] 首先需要准备好刷机包,可以是自己编译的,也可以是从别 ...

  6. KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  7. 下面我会介绍几种轻轻松松访问Google的方法

    好人一生平安的大招 Google在大陆已经封了差不多有20天   访问是极其的困难 下面我会介绍几种轻轻松松访问Google的方法 首先 你需要个可靠的hosts  比如 https://git.os ...

  8. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  9. u8818 G300的官方rom刷机包及详细的刷机方法

    之前看到有些机友在找华为u8818的官方rom固件包,在这里我给大家分享一下这个手机的官方原版的固件rom包吧,有2.3的,也有4.0的,大家可以根据自己的需求来下载. 华为U8818官方2.3固件: ...

随机推荐

  1. linux -- ubuntu 何为软件源

    新手学Ubuntu的时候,一般不知道什么是源,但源又是Ubuntu下常用到的东西.因此,本文就详细介绍一下Ubuntu 源. 什么是软件源? 源,在Ubuntu下,它相当于软件库,需要什么软件,只要记 ...

  2. linux gzip 命令详解

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用. 语法:gzip  ...

  3. Uniprot 数据库-最常用的蛋白质数据库

    Uniprot 数据库是收录信息最全面的蛋白质数据库,包含swissport, uniparc, TrEMBL 3个子数据库: 其中swiss-prot 是手工核对过的 ,非冗余, 有详细注释信息的蛋 ...

  4. 基于SSH框架、Oracle数据库、easyui的分页显示

    要求:在easyui-datagrid中完成paginaton的分页功能. 1.easyui-datagrig的配置 <table id="dg" rownumbers=tr ...

  5. 怎么快速了解自己的MySQL服务器?

    From: http://www.cnblogs.com/benshan/archive/2013/01/09/2853097.html 1.查看数据库服务器状态:status Linux 下的MyS ...

  6. SharePoint 2013 网站迁移流程

    在新的Farm(场)里,创建一个新的Web Application(网站应用程序),不需要创建Site Collection(网站集) Copy(复制)自定义开发的WSP包到新的Farm Server ...

  7. 【java】java设计模式(5):原型模式(Prototype)

    原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中 ...

  8. Don‘t talk.Just do it.

    对于算法,自己掌握的还是不多.并且我发现对于一个算法的理解非常重要.也许你会发现你貌似会用某总算法但是,他一旦变形,自己就无从下手. 还有就是对于算法.最好每次都自己敲,这样不仅能添加对于算法的熟度. ...

  9. Linux-Oracle

    1.使用Oracle登录,或者其他用户登录,切换到Oracle账户下: 2.登录后在Oracle主目录后使用vi创建.bashrc文件: 3.在文件中输入如下参数: export ORACLE_SID ...

  10. eclipse、tomca和jvm的相关内存配置

    1,  设置Eclipse内存使用情况        修改eclipse根目录下的eclipse.ini文件        -vmargs  //虚拟机设置        -Xms40m        ...