介绍一种android的裸刷机方法(fastboot刷机实质)
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刷机实质)的更多相关文章
- 几种Android混淆和逆向工具介绍
针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ...
- view--4种Android获取View宽高的方式
有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View ...
- Android手机fastboot 刷机命令【转】
本文转载自:http://luke-feng.iteye.com/blog/2171090 简介:在安卓手机中fastboot是一种比recovery更底层的模式.fastboot是一种线刷,就是使用 ...
- S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)
一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...
- 使用fastboot刷机流程【转】
本文转载自:http://www.voidcn.com/blog/Qidi_Huang/article/p-6236224.html [准备工作] 首先需要准备好刷机包,可以是自己编译的,也可以是从别 ...
- 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设备直接分 ...
- 下面我会介绍几种轻轻松松访问Google的方法
好人一生平安的大招 Google在大陆已经封了差不多有20天 访问是极其的困难 下面我会介绍几种轻轻松松访问Google的方法 首先 你需要个可靠的hosts 比如 https://git.os ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- u8818 G300的官方rom刷机包及详细的刷机方法
之前看到有些机友在找华为u8818的官方rom固件包,在这里我给大家分享一下这个手机的官方原版的固件rom包吧,有2.3的,也有4.0的,大家可以根据自己的需求来下载. 华为U8818官方2.3固件: ...
随机推荐
- apache -- 端口被占用
需求不断变更,总会安装不同的软件,这些软件理想情况下会使用不同的端口,但还是有软件之间端口被占的情况. 最近在电脑上装了一个VMware虚拟机软件,结果导致开启本机的Apache服务无法启动,报 “T ...
- 转载:QT QTableView用法小结
出自: http://blog.chinaunix.net/uid-20382483-id-3518513.html QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: ...
- python3.4连接mysql
参考:http://www.blogjava.net/huyi2006/articles/247966.html 开发环境:win7_x64 + python3.4.3 + mysql5.6.23 准 ...
- 【Java NIO深入研究3】文件锁
1.1概述——文件锁 文件锁定初看起来可能让人迷惑.它 似乎 指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁 — 它们是 劝告式的(advisory) 锁.它们不阻止任 ...
- CentOS7下Tomcat启动慢的原因及解决方案
现象 在一次CentOS 7系统中安装Tomcat,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID是通过SHA1算法 ...
- MySQL 若干操作
复制表结构+复制表数据 mysql> create table t3 like t1; mysql> insert into t3 select * from t1; mysql索引 1. ...
- 如果返回结构体类型变量(named return value optimisation,NRVO)
貌似这是一个非常愚蠢的问题,因为对于具有良好素质的程序员而言,在C中函数返回类型为结构体类型是不是有点不合格,干嘛不用指针做传入传出呢? 测试环境:Linux IOS 3.2.0-45-generic ...
- Eclipse的调试功能的10个小窍门
你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...
- 使用CXF为webservice添加拦截器
拦截器分为Service端和Client端 拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理.分为CXF自带的拦截器和自定义的拦截器 1.Servi ...
- swift - UIToolbar 的用法
代码如下: 1.声明及初始化 var toolsBar = UIToolbar() toolsBar.frame = CGRect(x:, y:, width:SCREEN_WIDTH, height ...