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. el表达式取值优先级

    不同容器中存在同名值时,从作用范围小到大的顺序依次尝试取值:pageContext->request->session->application

  2. html5实现刮刮卡效果

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...

  3. (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

    此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...

  4. Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】

    File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...

  5. Python 进阶(一)函数式编程

    来自慕课网: 简介: 函数:function ,在入门课程已学 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式,函数≠函数式,好比:计算≠计算机

  6. Python3 urllib 库

    urllib 简介 urllib 基础模块 使用 urllib 发送请求 使用 urllib 构造请求对象 关于 Handler 与 opener 使用 urllib 进行身份验证 使用 urllib ...

  7. timerWithTimeInterval 方法详用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  8. C++说明符和限定符

    有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11 ...

  9. ExtJS 6.2 基础使用

    一. 安装: 下载两个压缩包:分别是 ext-6.2.0-gpl(这个是ExtJS 的SDK文件,创建新项目的时候需要用). SenchaCmd-6.5.2-windows-64bit (这个下载下来 ...

  10. MVC Route路由

    由于某些原因,需要默认区域,所以需要对路由进行设置 具体实现如下: using System.Web; using System.Web.Mvc; using System.Web.Routing; ...