摩托罗拉E6系统研究

这是很久以前研究摩托罗拉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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值