Qualcomm的MSM8k以及SDM平台的启动过程其实比较复杂,但是如果想改动其实并不能改很多,有一部分高通甚至只给了BIN并没有SRC。所以今天就选继PBL后最重要也是能改动的最底层部分,即SBL来做一些分析以及介绍。其中仅挑选公开部分代码片段。可能有疏漏,请尽情指正!

启动过程

由于我并不涉及到BP部分,那全程就只从AP的角度做分析以及介绍。
MSM8k_Way2Boot.png

SBL的功能

初始化DDR/硬件/加载RPM/加载TrustZone/加载ABL以继续引导

SBL入口

此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1.s

IMPORT |Image$$SBL1_SVC_STACK$$ZI$$Limit|
IMPORT |Image$$SBL1_UND_STACK$$ZI$$Limit|
IMPORT |Image$$SBL1_ABT_STACK$$ZI$$Limit|
IMPORT boot_undefined_instruction_c_handler ;引入C的一些Function
IMPORT boot_swi_c_handler
IMPORT boot_prefetch_abort_c_handler
IMPORT boot_data_abort_c_handler
IMPORT boot_reserved_c_handler
IMPORT boot_irq_c_handler
IMPORT boot_fiq_c_handler
IMPORT boot_nested_exception_c_handler
IMPORT sbl1_main_ctl ;SBL主要控制函数
IMPORT boot_crash_dump_regs_ptr

SBL1_MAIN_CTL

此部分主要做初始化DDR的工作
此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1_mc.c

/* 初始化DDR部分 */
static boot_ram_init_data_type sbl1_ram_init_data_ddr =
{
  NULL,   //load_rw_base;
  NULL,  //image_rw_base;
  0,        //image_rw_len;
  (uint8*)&Image$$SBL1_DDR_ZI$$Base,  //image_zi_base;
  &Image$$SBL1_DDR_ZI$$ZI$$Length     //image_zi_len;
};
/* 初始化Logger部分,即Serial */
static uint32 sbl_start_time = 0;
static boot_log_init_data boot_log_data =
{
  (void *)SBL1_LOG_BUF_START,
  SBL1_LOG_BUF_SIZE,
  (void *)SBL1_LOG_META_INFO_START,
  SBL1_LOG_META_INFO_SIZE,
  NULL
};
/* 加载SBL1_Config_Table */
#define CPSR_EA_BIT     (1<<8)

extern boot_configuration_table_entry sbl1_config_table[];

SBL1_CONFIG_TABLE

此部分存储了ABLTrustZoneRPM等Image的相关参数
此部分源码位于boot_images/core/boot/secboot3/hw/<MSM_Platform_ID>/sbl1/sbl1_config.c

extern uint8 qsee_partition_id[];
extern uint8 rpm_partition_id[];
extern uint8 appsbl_partition_id[];
extern uint8 apdp_partition_id[];
extern uint8 devcfg_partition_id[];

boot_configuration_table_entry sbl1_config_table[];

设备信息

项目参数
CPU2 x Kryo 2.2Ghz + 2 x Kryo-LP 1.6Ghz
芯片组Qualcomm Snapdragon 820 (MSM8996)
GPUAdreno 530
ROM32GB
RAM3GB
Android版本6.0.1->7.0->8.0.0
内核版本3.18.20->3.18.31->3.18.71
电池3000mAh
显示1920x1080 5.3寸 IGZO
主相机22.60MP
副相机5MP
运营商日本-au/SoftBank 中国-开放

感谢
Qualcomm CodeAurora:Code Aurora
Team Win Recovery Project:GitHub - TeamWin/Team-Win-Recovery-Project
SHARP OSS:SHV34|オープンソースソフトウェア|開発者向け情報|AQUOS:シャープ

开源
saga0324/android_device_sharp_xx3

更新日志
首次发布

截图
SHV34_TWRP_Screenshot.png

下载
(暂时不公表)

Bug
电池状态仅在USB-5v500mA充电下更新
MTP/ADB不稳定

迭代版本
出于节省存储服务器空间考虑,自SH-04F起,迭代版本不再上传

半夜睡不着,来列列我了解以及使用过的一些日系手机下载OS的办法

日本

日系机均有各种写保护方法,故传统QDLoader方法无法使用

夏普

user版本无fastboot,recovery仅有安装加密SHFOTA包和wipe的能力,SBL内有CARRIER_LOADER,可引导ELF,下载系统必须通过拉低USB阻值,进入到一个COM Port通过floader(类似于MTK的DownloadAgent),由floader解除写保护后发送文件,并且由FLAG来控制系统功能

京瓷

user版本无fastboot,recovery有签名验证,一般通过aboot的CARRIER模式引导到kcsddownload模式下安装,线刷模式依据分析,是kcjrop这个pstore分区控制kcdload进入修改过的firehose做写入工作

富士通

富士通经过对其官方代码之分析,应该是在BOOT时候操作
来自富士通官方发布的F-02G于V08R23A,基于LL的OSS

#ifndef __LINUX_FJ_MODE_H
#define __LINUX_FJ_MODE_H

#define FJ_MODE_INVALID         0 //无效
#define FJ_MODE_FASTBOOT        1 //FASTBOOT 用户态无效
#define FJ_MODE_SD_DOWNLOADER   2 //SD卡下载,仅可安装.enc或.dat的加密RedBend-Diff包 用户态有效
#define FJ_MODE_KERNEL_MODE     3 //USB KERNEL MODE,可用于编辑Flag控制区 用户态有效
#define FJ_MODE_SP_MODE         4 //未知
#define FJ_MODE_MAKER_MODE      5 //未知
#define FJ_MODE_USB_DOWNLOADER  6 //未知
#define FJ_MODE_OFF_CHARGE      7 //关机充电 用户态有效

#define FJ_MODE_NORMAL          0xFF //默认正常启动

extern int fj_boot_mode;

#endif /* __LINUX_FJ_MODE_H */

待更新

最近闲着没事,花20元入了部日本老人机,型号是富士通F-12D,2013年的产品,是富士通触摸屏老人机らくらくスマートフォン系的一代目机,先列一下详细配置

详细配置
CPU:Qualcomm MSM7630_Surf 单核心1.4Ghz
RAM:1GB
ROM:4GB(用户分区:2.2GB)
屏幕:4.0寸 480x800
主摄像头:810万像素 AF
副摄像头:32万像素 FF
电池容量:1800mAh
安卓版本:4.0.4
Linux版本:3.0.8

Toolkit下载

请注意软件版本号
about_phone.png

提权到SYSTEM权限
1.打开USB调试,安装Toolkit里的system.apk(PS.记得在adb install后面加个-r,否则无法安装!)
2.桌面会出现以下图标
system_term_blocked.png
3.打开这个程序,你会发现我们成功的在终端模拟器里把权限提到了SYSTEM
term.png

植入临时root
1.发送Tookit内的mkdevsh和onload.sh到/data/local/tmp
2.chmod 777 mkdevsh和onload.sh
3.接着,在System权限的终端模拟器里执行onload.sh
onload.png
4.如果上一步没有任何报错,在adb shell内执行/dev/sh
su_ready.png
成功的把权限提升到了root

永久root
现在已经临时root了,于是可以往system里写入su来永久root(PS.此机没有FJSEC
1.发送su到/data/local/tmp
2.挂载/system至R/W

mount -o rw,remount /system

3.使用dd来复制su到系统分区

dd if=/data/local/tmp/su of=/system/xbin/su

3.设定组

chown root.root /system/xbin/su

4.设定权限

chmod 6755 /system/xbin/su

5.挂载/system至R/O

mount -o ro,remount /system

6.刷新分区

sync;sync;sync

7.重启

reboot

收尾
1.安装SuperSU,选择一般方式更新su,稍等即可获取完整root权限
2.卸载提权程序
adb uninstall com.android.vpndialogs

完成

感谢
DoCoMo Arrows Me F-11Dで永久 rootを取る方法
HOWTO-ROOTING-AndroidのAPK署名の脆弱性を使ったroot化