👁 599

小米电视2 EMMC分区表分析与扩容修改可行性报告

一、设备基本信息

项目值
设备小米电视2 L40M2-aa (小米2)
SoCMstar 高安芯片 (6A928/6A918)
原装EMMC8GB BGA153 1.8V
User Area7634944 KB ≈ 7456 MB (实际可用 ~7115 MB)
编程器Xgpro T76, APP v13.19
备份文件UserData.BIN (含分区表+MBOOT+全部分区)

二、分区表结构

分区表位于 EMMC LBA 0-1,文件偏移 0x200,magic = 0x5840(Mstar格式),每条目 0x200 字节。

完整分区布局

#分区名起始扇区大小(扇区)大小128K单位值
0MBOOT0x10000x18003 MB0x0018
1MPOOL0x28000x10002 MB0x0010
2misc0x38000x4000.5 MB0x0004
3recovery0x3C000x800016 MB0x0080
4boot0xBC000x40008 MB0x0040
5boot10xFC000x40008 MB0x0040
6tee0x13C000x40008 MB0x0040
7tee10x17C000x40008 MB0x0040
8RTPM0x1BC000x2000.25 MB0x0002
9system0x1BE000x2000001024 MB0x2000
10system10x21BE000x2000001024 MB0x2000
11cache0x41BE000x2000064 MB0x0200
12tvservice0x43BE000x1E00060 MB0x01E0
13tvservice10x459E000x1E00060 MB0x01E0
14tvconfig0x477E000x500010 MB0x0050
15tvconfig10x47CE000x500010 MB0x0050
16tvdatabase0x481E000x40008 MB0x0040
17tvcustomer0x485E000x800016 MB0x0080
18tvcustomer10x48DE000x800016 MB0x0080
19persist0x495E000x40008 MB0x0040
20tvinfo0x499E000x40008 MB0x0040
21userdata0x49DE000x9C40005000 MB0x9C40
22kernelog0xE61E000x10002 MB0x0010

固定分区总占用:约 2363 MB (0x49DE00 扇区)
userdata 空间:5000 MB
总占用:7365 MB ≈ 7.2 GB

分区表entry结构 (0x5840格式)

偏移大小含义
+0x002BMagic (0x5840)
+0x084B起始扇区号 (32-bit LE)
+0x0C4B分区大小 (32-bit LE, 单位=扇区)
+0x1012B分区名 (null-terminated ASCII)

三、size字段位宽验证

3.1 分区表size字段:确认32位

证据说明
system = 0x200000 (1024MB)16位最大0xFFFF=65535,远不够
cache = 0x20000 (64MB)16位解读=0,不合理
userdata = 0x9C4000 (5000MB)16位解读=0,不合理
所有分区size只有32位解读才正确✅ 100%确认32位

3.2

在hex编辑器中,userdata entry的size字段4字节为:

偏移 0x2C0C: 00 40 9C 00

作者看到的是偏移0x2C0D-0x2C0E的两个字节 40 9C,LE 16-bit = 0x9C40

这恰好等于 0x009C4000 >> 8 = 0x9C40(sectors右移8位 = 除以256 = 128K单位)

0x9C40 × 128K = 5000 MB ✅ 完美对应

3.3 EXT4超级块验证

userdata分区的EXT4超级块:

  • Magic: 0xEF53 ✅
  • Block size: 4096
  • Blocks count: 1,280,000
  • Total size: 5000 MB = 分区大小100%

结论:MBOOT创建EXT4时使用了完整的32位分区大小,没有截断。


四、8GB限制的根源分析

4.1 TXT作者的实测结论

“更换16GB EMMC后,修改分区表userdata为0xFFFF(128K单位)=8GB可以正常三清启动,改为更大值(如12GB)则三清卡recovery”

4.2 限制机制推导

步骤说明
1分区表size字段 = 32位sectors值
2MBOOT读取后做 sectors >> 8 转换为128K单位
3转换结果存入 16位内部字段
4三清时从内部结构读取size → 计算擦除范围和EXT4参数
516位最大0xFFFF → 0xFFFF×128K = 8191MB ≈ 8GB
6超过8GB → 16位溢出 → 参数错误 → 三清卡住

4.3 数学验证

场景sectors值>>8后(128K)16位?结果
原装5GB0x9C40000x9C40✅正常
扩容8GB0xFFFF000xFFFF✅极限正常
扩容12GB0x18CE2000x18CE2❌溢出卡住
扩容16GB0x20000000x20000❌溢出卡住

4.4 MBOOT代码证据

  • 分区解析函数(文件偏移0x06C000区域)使用 STR Rn,[Rm,#0x4] (32位) 写入内部结构
  • 但EXT4/文件系统代码区(0x0C5000-0x0D9000)大量使用 LDRH Rn,[Rm,#0x0C] 和 LDRH Rn,[Rm,#0x0E] (16位) 读取分区信息
  • MBOOT中存在 MOV Rd, Rm, LSR#8 指令(sectors→128K转换),但精确定位到分区解析路径的那一条需要运行时调试

五、修改方案可行性评估

方案A:仅修改分区表(8GB上限)

项目说明
修改位置文件偏移0x2C0C,4字节 00 40 9C 00 → 00 FF FF 00
效果userdata = 0x00FFFF00扇区 = 8191MB ≈ 8GB
128K单位0xFFFF(16位最大值)
优点最简单,只改4字节,零风险
缺点16GB EMMC只能用8GB,浪费约6GB
兼容性TXT作者已验证 ✅

方案B:修改MBOOT的LSR#8→LSR#9(支持16GB)

项目说明
原理将128K单位改为256K单位,16位最大值从8GB扩到16GB
修改MBOOT中 sectors >> 8 改为 sectors >> 9(1条指令)
效果0xFFFF × 256K = 16383MB ≈ 16GB
分区表userdata需同步改为256K单位对应的sectors值
优点16GB EMMC可完全利用 (~12GB userdata)
缺点需精确定位MBOOT指令(需IDA Pro或运行时调试);改错MBOOT会变砖
风险中高 — MBOOT损坏=无法启动,必须有编程器备份恢复
状态⚠️ 指令位置已缩小范围但未100%确认

修改指令编码:

原始: MOV Rd, Rm, LSR#8  → 编码中 [11:7]=01000
修改: MOV Rd, Rm, LSR#9  → 编码中 [11:7]=01001
只需将指令的第7位(bit 7)从0改为1

方案C:修改MBOOT的LDRH→LDR(理论无限大)

项目说明
原理将16位内部字段改为32位
修改所有 LDRH→LDR + STRH→STR + 内部结构调整
效果理论上支持任意大小
风险极高 — 内部结构大小变化,所有引用都要改,大概率变砖
建议❌ 不推荐

方案D:刷TWRP Recovery绕过MBOOT三清

项目说明
原理TWRP自己执行format,不经过MBOOT的16位限制
效果不改MBOOT,不限大小
前提需要适配此电视的TWRP镜像
风险中 — 需要TWRP适配Mstar高安平台
TXT作者评价“可能要尝试刷TWRP的recovery再尝试三清才能做到完美扩容”

六、推荐方案

🎯 保守方案(推荐新手):方案A

换16GB EMMC + 仅改分区表userdata=8GB

  1. 用Xgpro读取原8GB EMMC全部数据
  2. 在UserData.BIN偏移0x2C0C处修改4字节:00 40 9C 00 → 00 FF FF 00
  3. 写入16GB EMMC(剩余空间不使用)
  4. 开机三清 → userdata = 8GB ✅

🎯 进阶方案(需IDA Pro验证):方案B

  1. 用IDA Pro加载MBOOT段(基址0x32300000)
  2. 定位分区size的 sectors >> 8 转换指令
  3. 改为 sectors >> 9(指令bit7: 0→1)
  4. 修改分区表userdata为12GB对应的sectors值
  5. 写入16GB EMMC → 三清 → userdata = 12GB ✅

🎯 激进方案:方案D

寻找或编译TWRP for Mstar,刷入recovery分区,直接format userdata为完整大小。


七、16GB EMMC扩容具体参数(方案A)

项目值
16GB EMMC User Area~15064 MB (30851072扇区)
固定分区占用2363 MB (0x49DE00扇区)
userdata(8GB方案)8191 MB (0x00FFFF00扇区)
分区表4字节00 FF FF 00
尾部剩余~4500 MB(不使用)
kernelog起始调整0x49DE00 + 0xFFFF00 = 0x149DD00
kernelog大小不变0x1000扇区