这是很久以前研究摩托罗拉E6刷机包时总结的一些经验,不一定准确但留个纪念,希望会制作刷机包的高手交流学习。
-------------------------------------------------------------------------------------------------------------------------------
摩托罗拉E6系统研究
- MOTOROLA E6 FLASH MAPS
 
地址  | 名字  | 大小  | 分区  | 分段  | 
0x00000000-0x00008000  | CADDO_SECOND  | 32K  | Mtd0  | B  | 
0x00008000-0x00010000  | ITUNES  | 32K  | Mtd1  | None  | 
0x00010000-0x00018000  | CADDO_PRIMARY  | 32K  | Mtd2  | None  | 
0x00018000-0x00020000  | FOTA_REV  | 32K  | Mtd3  | None  | 
0x00020000-0x00060000  | MBM  | 256K  | Mtd4  | |
0x00060000-0x00080000  | CONFIG  | 128K  | Mtd5  | CG31.smg  | 
0x00080000-0x000A0000  | BLOB  | 128K  | Mtd6  | CG32.smg  | 
0x000A0000-0x001A0000  | KERNEL  | 1M  | Mtd7  | CG33.smg  | 
0x001A0000-0x00BA0000  | data_resource  | 10M  | Roflash2  | CG34.smg  | 
0x00BA0000-0x011A0000  | USERFS_DB  | 6M  | Mtd8  | CG35.smg  | 
0x011A0000-0x01980000  | USERFS_GENERAL  | 7.875M  | Mtd9  | CG36.smg  | 
0x01980000-0x01988000  | MNT_RECORD  | 32K  | ||
0x01988000-0x019A0000  | PANICLOG  | 96K  | ||
0x019A0000-0x019C0000  | secure_setup  | 128K  | Roflash4  | CG37.smg  | 
0x019C0000-0x019E0000  | TEST_CMD  | 128K  | Mtd10  | |
0x019E0000-0x01A00000  | LOGO  | 128K  | Mtd11  | CG39.smg  | 
0x01A00000-0x01AC0000  | FOTA  | 768K  | Mtd12  | |
0x01AC0000-0x01AE0000  | RESERVE  | 128K  | Mtd13  | |
0x01AE0000-0x025E0000  | language  | 11M  | Roflash1  | CG41.smg  | 
0x025E0000-0x02600000  | setup  | 128K  | Roflash3  | CG42.smg  | 
0x02600000-0x04000000  | rootfs  | 26M  | roflash  | CG43.smg  | 
备注:
MOTOROLA E6闪存型号是英特尔PF38F4476VVUBPD,总大小是64M的NOR闪存。Linux系统Flash地址0x00000000一般安排的是BLOB,但是MOTOROLA E6在128K这个空间0X00000000地址只有一条指令:87 C0 00 EA ,对于PXA270处理器,系统复位后的PC指针总是指向0x0地址,0x0~0x04是复位中断向量的入口点,所以在0x00~0x03装载一条无条件跳转语句。根据CG32.smg文件可以知道,BLOB开始还有800H的偏移,是摩托用来签名的,所以BLOB真实地址是0x00080800H。同样,BLOB加载Linux内核的实际地址是0x000A0800H。在上表中MBM(Motorola Boot Manager)就是按开机键和照相键进入的红屏刷机模式。刷机时绝对不能覆盖这段Flash空间,否则无法进入刷机模式连接电脑。如果0x00060000H之前的这段Flash空间改变,就只能用JTAG刷字库,或者拆芯片用编程器写入MBM。
查看Linux启动日志可以获得很重要的一些数据。
Linux启动日志Flash部分:
MTD:
//找到两块芯片
T[131]Probing Bulverde flash at physical address 0x00000000 (16-bit buswidth)
T[132]Bulverde flash: Found 1 x16 devices at 0x0 in 16-bit bank //32M
T[132]Bulverde flash: Found 1 x16 devices at 0x2000000 in 16-bit bank //32M
//使用英特尔和夏普的命令集
T[132] Intel/Sharp Extended Query Table at 0x0035
T[132] Intel/Sharp Extended Query Table at 0x0035
T[132]Using buffer write method
T[132]cfi_cmdset_0001: Erase suspend on write enabled
T[132]0: offset=0x0,size=0x8000,blocks=4
T[132]1: offset=0x20000,size=0x20000,blocks=255
T[132]2: offset=0x2000000,size=0x20000,blocks=255
T[132]3: offset=0x3fe0000,size=0x8000,blocks=4
T[132]Using static partition definition
//创建14个MTD分区,注意它们并不连续。
T[132]Creating 14 MTD partitions on "Bulverde flash":
T[132]0x00000000-0x00008000 : "CADDO_SECOND" //32k
T[132]0x00008000-0x00010000 : "ITUNES" //32k
T[132]0x00010000-0x00018000 : "CADDO_PRIMARY" //32k
T[132]0x00018000-0x00020000 : "FOTA_REV" //32k
T[132]0x00020000-0x00060000 : "MBM" //256k
T[132]0x00060000-0x00080000 : "CONFIG" //128k 131072B CG31
T[132]0x00080000-0x000a0000 : "BLOB" //128k 131072B CG32
T[132]0x000a0000-0x001a0000 : "KERNEL" //1M 1048576B CG33
T[132]0x00ba0000-0x011a0000 : "USERFS_DB" //CG35 6M
T[132]0x011a0000-0x01980000 : "USERFS_GENERAL" //CG36 7.875M
T[132]0x019c0000-0x019e0000 : "TEST_CMD"
T[132]0x019e0000-0x01a00000 : "LOGO" //CG39 128K
T[132]0x01a00000-0x01ac0000 : "FOTA"
T[132]0x01ac0000-0x01ae0000 : "RESERVE"
ROFLASH:
//挂载跟文件系统CG43.smg,其中3E00是设备号15872
T[0]Kernel command line: root=3e00 rootfstype=cramfs ip=off paniclog=on
T[138]cramfs_read_super: mounts on(3e00),LINEAR(10)
//跟文件系统的实际地址是0x2601000,因为分段前面有1000H的偏移。
T[138]cramfs: checking physical address 0x2601000 for linear cramfs image
//虚拟文件系统挂载
T[138]VFS: Mounted root (linear cramfs filesystem).
//注意下面的几个是在/etc/init.d/mountfs.sh文件中完成挂载
//挂载/dev/roflash1 language 语言包CG41.smg 挂载在CG43根文件系统
T[183]cramfs_read_super: mounts on(3e01),BLOCK
//挂载/dev/roflash2 data_resource 数据资源包CG34.smg 挂载在CG43根文件系统
T[185]do_kern_mount:dev_nr(i_dev)(15872)
T[185]do_kern_mount:dev_nr(i_rdev)(15874)
T[185]cramfs_read_super: mounts on(3e02),BLOCK
//挂载/dev/roflash3 setup 设置包CG42.smg 挂载在CG43根文件系统
T[186]do_kern_mount:dev_nr(i_dev)(15872)
T[186]do_kern_mount:dev_nr(i_rdev)(15875)
T[186]cramfs_read_super: mounts on(3e03),LINEAR(10)
T[186]cramfs: checking physical address 0x25e0000 for linear cramfs image
//挂载/dev/roflash4 secure_setup 安全设置包CG37.smg挂载在CG43根文件系统
T[188]do_kern_mount:dev_nr(i_dev)(15872)
T[188]do_kern_mount:dev_nr(i_rdev)(15876)
T[188]cramfs_read_super: mounts on(3e04),BLOCK
//挂载/dev/mtdblock8 JFFS2 用户数据包CG35.smg
T[190]mnt_record_enter begin
T[191]mnt_record_enter end (check 0)
T[193]SCAN.c: 211: empty_blocks(0), c->nr_erasing_blocks(0), c->nr_free_blocks(45)
//挂载/dev/mtdblock9 JFFS2 用户基础包CG36.smg
T[195]mnt_record_enter begin
T[195]mnt_record_enter end (check 0)
T[198]SCAN.c: 211: empty_blocks(0), c->nr_erasing_blocks(0), c->nr_free_blocks(57)
//挂载SD卡
T[202] mmca: mmca1
T[202]MSDOS FS: IO charset utf8
- MOTOROLA E6 SBF MAPS
 
地址  | 名字  | 大小  | 分区  | 分段  | 
A0DE0000-A13FFFFFF  | RDL3  | 6.4M  | AP  | RDL3.smg  | 
03FC8000-03FE7FF7  | RDL1  | 127K  | BP  | RDL1.smg  | 
10080000-100800C7  | 200B  | BP  | CG0.smg  | |
100800C8-102ECE7F  | 2.42M  | BP  | CG1.smg  | |
10390000-103FFFFF  | 448K  | BP  | CG2.smg  | |
10040000-10066EB7  | 155K  | BP  | CG3.smg  | |
10330000-103307FF  | BP签名  | 2K  | BP  | CG18.smg  | 
00060000-0007FFFF  | CONFIG  | 128K  | Mtd5  | CG31.smg  | 
00080000-0009FFFF  | BLOB  | 128K  | Mtd6  | CG32.smg  | 
000A0000-0019FFFF  | KERNEL  | 1M  | Mtd7  | CG33.smg  | 
001A0000-00B9FFFF  | data_resource  | 10M  | Roflash2  | CG34.smg  | 
00BA0000-0119FFFF  | USERFS_DB  | 6M  | Mtd8  | CG35.smg  | 
011A0000-0199FFFF  | USERFS_GENERAL  | 7.875M  | Mtd9  | CG36.smg  | 
019A0000-019BFFFF  | secure_setup  | 128K  | Roflash4  | CG37.smg  | 
019E0000-019FFFFF  | LOGO  | 128K  | Mtd11  | CG39.smg  | 
01AE0000-025DFFFF  | language  | 11M  | Roflash1  | CG41.smg  | 
025E0000-025EFFFF  | setup  | 128K  | Roflash3  | CG42.smg  | 
02600000-03FFFFFF  | rootfs  | 26M  | roflash  | CG43.smg  | 
备注:
在刷机包SBF文件分段开头有闪存地址和大小,RSD根据该地址和大小把需要刷入的SMG分段文件刷入闪存。在研究清楚了Flash的布局之后,我们就可以调整BLOB和内核的加载地址,修改内核的MTD分区表和ROFLASH分区表,然后通过修改刷机包的写入地址实现分区的改写。
MOTOROLA E6总共有18个分段文件。
BP部分:
CG0.smg、CG1.smg、CG2.smg、CG3.smg、CG18.smg
AP部分:
CG31.smg、CG32.smg、CG33.smg、CG34.smg、CG35.smg、CG36.smg、CG37.smg、CG39.smg、CG41.smg、CG42.smg、CG43.smg
RDL1.smg是刷入BP时使用的刷机系统
RDL3.smg是刷入AP时使用的刷机系统,它里面包含了一个基于内存的操作系统,BLOB+KERNEL+RAMDISK+擦除表
三、导出SBF分段文件方法
刷机包AP部分我们可以通过解包SBF文件得到,也可以在手机中导出,手机中导出脚本如下:
#!/bin/bash
#MOTOROKR E6
#RAM=48M
#ROM=64M
mkdir /mmc/mmca1/AP
MMC=/mmc/mmca1/AP
#CADDO_SECOND 32KB
dd if=/dev/mtd0 of=$MMC/mtd0
#ITUNES 32KB
dd if=/dev/mtd1 of=$MMC/mtd1
#CADDO_PRIMARY 32KB
dd if=/dev/mtd2 of=$MMC/mtd2
#FOTA_REV 32KB
dd if=/dev/mtd3 of=$MMC/mtd3
#MBM FLASH MODE 256KB
dd if=/dev/mtd4 of=$MMC/MBM
#CONFIG 128KB
dd if=/dev/mtd5 of=$MMC/CG31.smg
#BLOB 128KB
dd if=/dev/mtd6 of=$MMC/CG32.smg
#Linux Kernel 1M
dd if=/dev/mtd7 of=$MMC/CG33.smg
#/ezx_user 6M
dd if=/dev/mtd8 of=$MMC/mtd8
#/ezxlocal 7.9M
dd if=/dev/mtd9 of=$MMC/mtd9
#TEST_CMD 128KB
dd if=/dev/mtd10 of=$MMC/mtd10
#LOGO 128KB
dd if=/dev/mtd11 of=$MMC/CG39.smg
#FOTA 768KB
dd if=/dev/mtd12 of=$MMC/mtd12
#RESERVE 128KB
dd if=/dev/mtd13 of=$MMC/mtd13
#/ezx_user 6M
dd if=/dev/mtdblock8 of=$MMC/CG35.smg
#/ezxlocal 7.9M
dd if=/dev/mtdblock9 of=$MMC/CG36.smg
#/ 26M
dd if=/dev/roflash of=$MMC/CG43.smg
#/usr/language 11M
dd if=/dev/roflash1 of=$MMC/CG41.smg
#/usr/data_resource 10M
dd if=/dev/roflash2 of=$MMC/CG34.smg
#/usr/setup 128KB
dd if=/dev/roflash3 of=$MMC/CG42.smg
#/usr/securesetup 124KB
dd if=/dev/roflash4 of=$MMC/CG37.smg
把这段脚本保存为export.sh文件,复制到手机上,在命令行中执行即可导出AP部分到内存卡上,复制到Linux系统进行修改,FAT16不支持软链接,所以不要在手机上修改。
- Motorola E6 Virtual address Maps
 
虚拟地址  | 大小  | 描述  | 
0xFFFF8000-0xFFFFFFFF  | 8K  | 缓存映射  | 
0xFFFF1000-0xFFFF8000  | 28K  | 保留区  | 
0xFFFF0000-0xFFFF1000  | 4K  | 中断向量表  | 
0xFFFE0000-0xFFFF0000  | 64K  | Xscale缓存刷新区  | 
0xFFF00000-0xFFFE0000  | 896K  | 固定映射区  | 
0xFFE00000-0xFFF00000  | PCI I/O映射空间  | |
0xFFDFF000-0xFFE00000  | DMA映射区  | |
0xFF000000-0xFFDFF000  | 4M  | DMA保留区  | 
0xF0000000-0x0xFF000000  | 240M  | vmalloc() / ioremap() 空间  | 
0xEFFFE000-0xF0000000  | 8M  | VMalloc保留区  | 
0xC0000000-0xEFFFE000  | 内核直接映射区  | |
0xBFFFF800-0xC0000000  | 2M  | 内核持久映射区  | 
0xBF000000-0xBFFFF800  | 14M  | 内核模块映射区  | 
0x00001000-0xBF000000  | 用户进程映射区  | |
0x00000000-0x00001000  | 4K  | CPU向量页/空指针陷阱  | 
备注:
Arm-Linux系统的每个进程独自拥有4G的虚拟地址,其中低端0x00000000-0xC0000000的3G分配给用户空间,0xC0000000-0xFFFFFFFF的1G分配给内核空间。
- MOTO E6 BLOB引导调用分析
 
BLOB靠前阶段执行完后内存布局:
地址  | 说明  | 
0xA4000000  | 物理内存结束地址  | 
0xA0001000  | BLOB第二段的开始地址  | 
0xa000000c  | 保存开机原因地址  | 
0xA0000008  | 保存BP信号地址  | 
0xA0000004  | 保存睡眠中恢复地址  | 
0xA0000000  | 物理内存开始地址  | 
最后设完栈指针SP->0xA0100000后跳转到了0xA0001000BLOB第二段的开始地址处。
BLOB第二阶段执行完后的内存布局:
首先清除BSS段为0,设置栈指针,并跳转到了main函数。
地址  | 说明  | 
0xA4000000  | 物理内存结束地址  | 
0xA0400000  | RAM文件系统开始地址(未启用)  | 
0xA0200000  | Kernel内核开始地址  | 
0xA0140000  | 内核参数开始地址(未启用)  | 
0xA0100000  | BLOB开始地址(未启用)  | 
0xA0001000  | BLOB第二段的开始地址  | 
0xA0000100  | 内核启动参数的位置  | 
0xa000000c  | 保存开机原因地址  | 
0xA0000008  | 保存BP信号地址  | 
0xA0000004  | 保存睡眠中恢复地址  | 
0xA0000000  | 物理内存开始地址  | 
最后在boot_linux中调用0xA0200000Linux Kernel内核开始地址启动了linux内核。
---------------------------------------------------------------------------------------------------------------------------------
RDL3.smg研究:
经过研究发现刷机包SBF解开后产生的RDL3实际上是一个基于RAM的Linux操作系统,其中分为四部分:
1.blob-nohwinit
00000000——0000D637 是可以下载的BLOB引导加载器,主要是加载内核和根文件系统。
2.zImage-ramos
00020000——000E1087 是Linux内核代码,可以直接运行在RAM中。
3.rootfs_ramos.img
00220000——0046AFFF 是Rootfs根文件系统,里面包含了一些基本的linux命令,可以在linux系统下解包。
解包命令 #:mkdir rootfs
#:mount -o loop.o rootfs_ramos.img rootfs
4.erase_table
0061FD00——0061FD8F 是需要镲除的分区地址,详细地址如下表:
CG0 : 10080000-100800C7
CG1 : 100800C8-102ECE7F
CG2 : 10390000-103FFFFF
CG3 : 10040000-10066EB7
CG18 : 10330000-103307FF
------------------------
CG31 : 00060000-0007FFFF
CG32 : 00080000-0009FFFF
CG33 : 000A0000-0019FFFF
CG34 : 001A0000-00B9FFFF
CG35 : 00BA0000-0119FFFF
CG36 : 011A0000-0199FFFF
CG37 : 019A0000-019BFFFF
CG39 : 019E0000-019FFFFF
CG41 : 01AE0000-025DFFFF
CG42 : 025E0000-025EFFFF
CG43 : 02600000-03FFFFFF
------------------------
RDL1 : 03FC8000-03FE7FF7
RDL3 : A0DE0000-A13FFFFFF

QQ客服