👁 599

小米电视2 EMMC分区表分析与扩容修改可行性报告
一、设备基本信息
| 项目 | 值 |
|---|---|
| 设备 | 小米电视2 L40M2-aa (小米2) |
| SoC | Mstar 高安芯片 (6A928/6A918) |
| 原装EMMC | 8GB BGA153 1.8V |
| User Area | 7634944 KB ≈ 7456 MB (实际可用 ~7115 MB) |
| 编程器 | Xgpro T76, APP v13.19 |
| 备份文件 | UserData.BIN (含分区表+MBOOT+全部分区) |
二、分区表结构
分区表位于 EMMC LBA 0-1,文件偏移 0x200,magic = 0x5840(Mstar格式),每条目 0x200 字节。
完整分区布局
| # | 分区名 | 起始扇区 | 大小(扇区) | 大小 | 128K单位值 |
|---|---|---|---|---|---|
| 0 | MBOOT | 0x1000 | 0x1800 | 3 MB | 0x0018 |
| 1 | MPOOL | 0x2800 | 0x1000 | 2 MB | 0x0010 |
| 2 | misc | 0x3800 | 0x400 | 0.5 MB | 0x0004 |
| 3 | recovery | 0x3C00 | 0x8000 | 16 MB | 0x0080 |
| 4 | boot | 0xBC00 | 0x4000 | 8 MB | 0x0040 |
| 5 | boot1 | 0xFC00 | 0x4000 | 8 MB | 0x0040 |
| 6 | tee | 0x13C00 | 0x4000 | 8 MB | 0x0040 |
| 7 | tee1 | 0x17C00 | 0x4000 | 8 MB | 0x0040 |
| 8 | RTPM | 0x1BC00 | 0x200 | 0.25 MB | 0x0002 |
| 9 | system | 0x1BE00 | 0x200000 | 1024 MB | 0x2000 |
| 10 | system1 | 0x21BE00 | 0x200000 | 1024 MB | 0x2000 |
| 11 | cache | 0x41BE00 | 0x20000 | 64 MB | 0x0200 |
| 12 | tvservice | 0x43BE00 | 0x1E000 | 60 MB | 0x01E0 |
| 13 | tvservice1 | 0x459E00 | 0x1E000 | 60 MB | 0x01E0 |
| 14 | tvconfig | 0x477E00 | 0x5000 | 10 MB | 0x0050 |
| 15 | tvconfig1 | 0x47CE00 | 0x5000 | 10 MB | 0x0050 |
| 16 | tvdatabase | 0x481E00 | 0x4000 | 8 MB | 0x0040 |
| 17 | tvcustomer | 0x485E00 | 0x8000 | 16 MB | 0x0080 |
| 18 | tvcustomer1 | 0x48DE00 | 0x8000 | 16 MB | 0x0080 |
| 19 | persist | 0x495E00 | 0x4000 | 8 MB | 0x0040 |
| 20 | tvinfo | 0x499E00 | 0x4000 | 8 MB | 0x0040 |
| 21 | userdata | 0x49DE00 | 0x9C4000 | 5000 MB | 0x9C40 |
| 22 | kernelog | 0xE61E00 | 0x1000 | 2 MB | 0x0010 |
固定分区总占用:约 2363 MB (0x49DE00 扇区)
userdata 空间:5000 MB
总占用:7365 MB ≈ 7.2 GB
分区表entry结构 (0x5840格式)
| 偏移 | 大小 | 含义 |
|---|---|---|
| +0x00 | 2B | Magic (0x5840) |
| +0x08 | 4B | 起始扇区号 (32-bit LE) |
| +0x0C | 4B | 分区大小 (32-bit LE, 单位=扇区) |
| +0x10 | 12B | 分区名 (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值 |
| 2 | MBOOT读取后做 sectors >> 8 转换为128K单位 |
| 3 | 转换结果存入 16位内部字段 |
| 4 | 三清时从内部结构读取size → 计算擦除范围和EXT4参数 |
| 5 | 16位最大0xFFFF → 0xFFFF×128K = 8191MB ≈ 8GB |
| 6 | 超过8GB → 16位溢出 → 参数错误 → 三清卡住 |
4.3 数学验证
| 场景 | sectors值 | >>8后(128K) | 16位? | 结果 |
|---|---|---|---|---|
| 原装5GB | 0x9C4000 | 0x9C40 | ✅ | 正常 |
| 扩容8GB | 0xFFFF00 | 0xFFFF | ✅极限 | 正常 |
| 扩容12GB | 0x18CE200 | 0x18CE2 | ❌溢出 | 卡住 |
| 扩容16GB | 0x2000000 | 0x20000 | ❌溢出 | 卡住 |
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
- 用Xgpro读取原8GB EMMC全部数据
- 在UserData.BIN偏移0x2C0C处修改4字节:
00 40 9C 00→00 FF FF 00 - 写入16GB EMMC(剩余空间不使用)
- 开机三清 → userdata = 8GB ✅
🎯 进阶方案(需IDA Pro验证):方案B
- 用IDA Pro加载MBOOT段(基址0x32300000)
- 定位分区size的
sectors >> 8转换指令 - 改为
sectors >> 9(指令bit7: 0→1) - 修改分区表userdata为12GB对应的sectors值
- 写入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扇区 |
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复