Defy 上重新分区并加入Kpanic分区

身边的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

Intel Galileo Gen 2 上运行带有 Arduino 兼容的 Debian

最近学校课设,用到了Intel Galileo Gen2,为了使用NodeJS开发安装了Galileo-Debian,之后遇到了两个问题,记录下:

1、安装Debian之后失去了原来的Arduino兼容功能。

2、安装Debian之后不停地pthread lib segfault。

添加Arduino兼容功能:

把Intel给的Yacto镜像解开看看,发现Yacto上开机自起/opt/cln/galileo,”监听”ttyGS0,负责Arduino部分的功能。

直接拿来用即可,不过Yacto用的似乎不是glibc,导致Debian中无法直接使用,为了省事直接把原镜像mount后chroot进去运行sketch即可,注意把 /dev 等涉及硬件操作的挂载点暴露给chroot。

注释掉/etc/inittab中的以下行,ttyGS0要交给shetch:

GS0:23:respawn:/sbin/getty -L ttyGS0 115200 vt100

把Intel提供的SDCard.1.0.4.tar.bz2解压,image-full-galileo-clanton.ext3放到sd卡的/opt/galileo-ketch/,Galileo开机执行以下脚本即可:

#!/bin/bash
dir="/opt/galileo-sketch"
mount $dir/image-full-galileo-clanton.ext3 $dir/mount
mount --rbind /dev $dir/mount/dev
mount --rbind /sys $dir/mount/sys
mount --rbind /proc $dir/mount/proc
mount --rbind /run $dir/mount/run
mount --rbind /tmp $dir/mount/tmp
nohup chroot $dir/mount /usr/bin/env HOME=/home/root PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash -c "source /etc/profile; /opt/cln/galileo/launcher.sh" &>/var/log/galileo-sketch.log &

F00F Bug

Google “debian galileo pthread segfault”后,发现有人遇到这问题了,原因是Intel Quark CPU有Bug,在F00F指令时触发。F0对应锁总线,而Galileo为单核设备,可以忽略这个操作,直接用十六进制编辑器吧F0替换成90(NOP),问题解决。

/lib/i386-linux-gnu/libpthread.so.0中所有的:

f0 0f b1 8b 94 21 00 00

替换为:

90 0f b1 8b 94 21 00 00

有其它f00f导致的segfault可以用类似方法解决。

 

相关链接:

Intel Galileo Support:http://www.intel.com/support/galileo/sb/CS-035101.htm

Galileo-Debian:http://sourceforge.net/projects/galileodebian/

Debian Bug:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738575