身边的Defy服役快5年了,3.7寸,1G+512内存小身板撑了这么久煞是不容易(还能再战十年!)
自己修改过内核的不少部分,稳定性现在不错,但如果偶遇内核Panic导致关机的话然后死的太突然并不能看到日志。而KPanic是Android上(曾经)常用的日志转储,在Kernel Panic的瞬间将日志转储到指定的分区上。我用的自定义分区表+内核似乎失去了这个功能。
通过刷上官方的固件之后用adb shell连过去,cat /proc/partitions看到:
179 32 1912832 mmcblk1 179 33 128 mmcblk1p1 179 34 512 mmcblk1p2 179 35 512 mmcblk1p3 179 36 1 mmcblk1p4 179 37 512 mmcblk1p5 179 38 512 mmcblk1p6 179 39 4096 mmcblk1p7 pds 179 40 512 mmcblk1p8 179 41 512 mmcblk1p9 179 42 1024 mmcblk1p10 179 43 2048 mmcblk1p11 179 44 512 mmcblk1p12 179 45 512 mmcblk1p13 179 46 4096 mmcblk1p14 179 47 8192 mmcblk1p15 boot 179 48 8192 mmcblk1p16 recovery 179 49 14336 mmcblk1p17 cdrom 179 50 512 mmcblk1p18 misc 179 51 512 mmcblk1p19 cid 179 52 4096 mmcblk1p20 kpanic 179 53 334848 mmcblk1p21 system 179 54 512 mmcblk1p22 prek 179 55 512 mmcblk1p23 pkbackup 179 56 204800 mmcblk1p24 cache 179 57 1319936 mmcblk1p25 userdata 179 0 61407232 mmcblk0 179 1 61406208 mmcblk0p1
查看原生分区的信息:
for i in /sys/block/mmcblk1/mmcblk1p*/; do echo $i; for j in `ls $i`; do if [ -f $i$j ] ;then echo "$j" : `cat $i$j`; fi done done
得到了25个分区的start,end,size:
使用dd把整个/dev/mmcblk1 dump下来,使用16进制编辑器简单的看一下,可以在系统不可见分区里找到类似于分区表的东西,整理一下可看到整个Defy的分区结构,其中蓝色的是Android系统使用/可见的分区:
CONTENT | DEV NODE | START(BLOCK) | SIZE(BLOCK) | END(BLOCK) |
mbmloader | mmcblk1 | 256 | 256 | 512 |
mbm | mmcblk2 | 1024 | 1024 | 2048 |
mbmbackup | mmcblk3 | 2048 | 1024 | 3072 |
ebr | mmcblk4 | 3072 | 2 | 3074 |
bploader | mmcblk5 | 4096 | 1024 | 5120 |
cdt.bin | mmcblk6 | 5120 | 1024 | 6144 |
pds | mmcblk7 | 6144 | 8192 | 14336 |
lbl | mmcblk8 | 14336 | 1024 | 15360 |
lbl_backup | mmcblk9 | 15360 | 1024 | 16384 |
logo.bin | mmcblk10 | 16384 | 2048 | 18432 |
sp | mmcblk11 | 18432 | 4096 | 22528 |
devtree | mmcblk12 | 22528 | 1024 | 23552 |
devtree_bak | mmcblk13 | 23552 | 1024 | 24576 |
bpsw | mmcblk14 | 24576 | 8192 | 32768 |
boot | mmcblk15 | 32768 | 16384 | 49152 |
recovery | mmcblk16 | 49152 | 16384 | 65536 |
cdrom | mmcblk17 | 65536 | 28672 | 94208 |
misc | mmcblk18 | 94208 | 1024 | 95232 |
cid | mmcblk19 | 95232 | 1024 | 96256 |
kpanic | mmcblk20 | 96256 | 8192 | 104448 |
system | mmcblk21 | 104448 | 669696 | 774144 |
prek | mmcblk22 | 774144 | 1024 | 775168 |
pkbackup | mmcblk23 | 775168 | 1024 | 776192 |
cache | mmcblk24 | 776192 | 409600 | 1185792 |
userdata | mmcblk25 | 1185792 | 2639872 | 3825664 |
我之前一直在用的,XDA上大牛Quarx移植ROM所用的分区表,省去目前不考虑的分区:
PART | DEV | START(Byte) | SIZE(Byte) | END(Byte) |
pds | mmcblk1p9 | 3145728 | 4193792 | 7339520 |
root_system | mmcblk1p1 | 53477376 | 51593216 | 105070592 |
system | mmcblk1p5 | 105070593 | 657930240 | 763000833 |
system_sign | mmcblk1p2 | 396221216 | 393216 | 396614432 |
prek1 | mmcblk1p3 | 396361728 | 524288 | 396886016 |
prek2 | mmcblk1p4 | 396886016 | 524288 | 397410304 |
cache | mmcblk1p6 | 763000834 | 51200000 | 814200834 |
data | mmcblk1p7 | 814200833 | 1143996416 | 1958197249 |
吐槽下这歪七扭八没对齐的分区数字,不过由于自定义分区是利用的Linux 内核一段时间前加的自定义MMC分区功能,并不会写到硬盘分区表,而内核在处理启动参数时候会自动对其,所以并没有性能的影响。
对其(为了方便计算)+重做一下分区,加入kpanic,新的分区表:
LABEL | DEV | START(Byte) | SIZE(Byte) | END(Byte) |
pds | mmcblk1p8 | 3145728 | 4194304 | 7340032 |
kpanic | mmcblk1p9 | 49414144 | 4063232 | 53477376 |
bootstrap | mmcblk1p1 | 53477376 | 33554432 | 87031808 |
system | mmcblk1p5 | 87031808 | 671088640 | 758120448 |
system_sign | mmcblk1p2 | 395968512 | 393216 | 396361728 |
prek | mmcblk1p3 | 396361728 | 524288 | 396886016 |
pkbackup | mmcblk1p4 | 396886016 | 524288 | 397410304 |
cache | mmcblk1p6 | 758120448 | 50331648 | 808452096 |
userdata | mmcblk1p7 | 808452096 | 1150287872 | 1958739968 |
Rom的BoardConfig中的BOARD_KERNEL_CMDLINE改成如下:
PARTITION_TABLE := blkdevparts=mmcblk1:33554432@53477376(root_system),393216@395968512(system_sign),524288@396361728(prek),524288@396886016(pkbackup),671088640@87031808(system),50331648@758120448(cache),1150287872@808452096(data),4194304@3145728(pds),4063232@49414144(kpanic) mmcparts=mmcblk1:p1(root_system),p2(system_sign),p3(prek),p4(pkbackup),p5(system),p6(cache),p7(data),p8(pds),p9(kpanic) BOARD_RECOVERY_KERNEL_CMDLINE := console=/dev/null mem=499M init=/init omapfb.vram=0:4M usbcore.old_scheme_first=y cpcap_charger_enabled=y $(PARTITION_TABLE) BOARD_KERNEL_CMDLINE := console=/dev/null panic=30 mem=499M init=/init ip=off brdrev=P3A omap3_die_id init=/init omapfb.vram=0:4M usbcore.old_scheme_first=y cpcap_charger_enabled=n $(PARTITION_TABLE)
由于要绕开Bootloader的检查使用自定义ROM,system覆盖了system_sign,system_sign是bootloader会去读取的数据,自定义ROM 通过设置badblock防止system分区的写操作破坏system_sign分区的内容。改动分区表之后badblock位置也变了,这次要将75424到75775设置为badblock。
之后修改Quarx的升级bootstrap和格式化用的刷机文件,主要修改Kernel cmdline和badblock,重新刷入,完成。
链接:
XDA上Quarx的ROM发布页:http://forum.xda-developers.com/showthread.php?t=2515036
我修改过的ROM:http://tieba.baidu.com/p/4061404066