首页
关于 About
网站安全性 Security
Search
1
Chrome/Chromium 在 Linux 平台的视频硬解方案
1,433 阅读
2
将 USB 设备连接到 WSL2
296 阅读
3
关闭 Intel VMD 解决 INACCESSIBLE_BOOT_DEVICE 蓝屏
219 阅读
4
为河北邯郸被害少年发声
193 阅读
5
Android 14 平台程序开发中文件共享权限问题
188 阅读
数字安全
教程
公告
默认
高通设备开发
登录
Search
标签搜索
Windows
Linux
Qualcomm
QCS8250
SM8250
高通
Chromium
Chrome
AppArmor
PKI
Android
OpenWrt
NVIDIA
CertificateTransparency
X509
Python
pip
Docker
Electron
WSL
日暮清林
累计撰写
21
篇文章
累计收到
11
条评论
首页
栏目
数字安全
教程
公告
默认
高通设备开发
页面
关于 About
网站安全性 Security
搜索到
4
篇与
的结果
2025-02-07
高通设备编译生成分区表
环境准备高通分区表使用 ptool.py 工具解析分区表文件生成,工具需要使用 Python 2。准备包含所有分区的 partition.xml 分区表文件。生成分区表要生成可刷入 GPT 分区表 Binary 和 QFIL 线刷包使用的 rawprogram、patch 文件,使用命令:python ptool.py -x partition.xml随后会在当前目录下生成所有分区表文件:gpt_backup0.bin gpt_both4.bin gpt_main2.bin rawprogram0_BLANK_GPT.xml rawprogram3_WIPE_PARTITIONS.xml wipe_rawprogram_PHY2.xml gpt_backup1.bin gpt_both5.bin gpt_main3.bin rawprogram0_WIPE_PARTITIONS.xml rawprogram3.xml wipe_rawprogram_PHY4.xml gpt_backup2.bin gpt_empty0.bin gpt_main4.bin rawprogram0.xml rawprogram4_BLANK_GPT.xml wipe_rawprogram_PHY5.xml gpt_backup3.bin gpt_empty1.bin gpt_main5.bin rawprogram1_BLANK_GPT.xml rawprogram4_WIPE_PARTITIONS.xml wipe_rawprogram_PHY6.xml gpt_backup4.bin gpt_empty2.bin patch0.xml rawprogram1_WIPE_PARTITIONS.xml rawprogram4.xml wipe_rawprogram_PHY7.xml gpt_backup5.bin gpt_empty3.bin patch1.xml rawprogram1.xml rawprogram5_BLANK_GPT.xml zeros_1sector.bin gpt_both0.bin gpt_empty4.bin patch2.xml rawprogram2_BLANK_GPT.xml rawprogram5_WIPE_PARTITIONS.xml zeros_5sectors.bin gpt_both1.bin gpt_empty5.bin patch3.xml rawprogram2_WIPE_PARTITIONS.xml rawprogram5.xml gpt_both2.bin gpt_main0.bin patch4.xml rawprogram2.xml wipe_rawprogram_PHY0.xml gpt_both3.bin gpt_main1.bin patch5.xml rawprogram3_BLANK_GPT.xml wipe_rawprogram_PHY1.xml
2025年02月07日
6 阅读
0 评论
0 点赞
2025-02-05
高通设备开发问题汇总(含Bootloader开发、HLOS开发)
前言本文汇总所有本人在基于 SM8250 处理器的高通参考设计移动平台开发时遇到的所有问题及其解决方案。不定期更新。Questions & Solutions新版本 UEFI ABL (uefi.lnx.5.0) 内存访问越界导致 UEFI panic 的相关问题前言:设备一直使用的是 LE.UM. 开头的 ABL 仓库代码,高通表示这是给 Ubuntu 用的(也能解释安全启动相关代码中的 VB_LE 的优先级最高了),不能用于 Android 启动(事实上成功启动了,但是 VerifiedBoot 是废的),于是研究决定采用高通官方提供的 LA. 开头的 ABL。(高通这个代码命名好抽象,LE.UM 是 Debian 等发行版、LA 是 Android、UBUN 是 Ubuntu...)。刚开始用的是 SoC BSP 里内核推荐的版本 uefi.lnx.4.0,但是开机运行到某个函数有玄学问题,随后代码比对发现 uefi.lnx.5.0 中的该函数签名和 LE.UM. 开头的 ABL 的仓库代码中一致,觉得用 5.0 更有戏,然后就开始折腾了...关键词: data fault/panic/mmu/avb设备在 Bootloader 阶段默认允许访问地址从 0x80000000 开始,XBL 中有对设备所有 Bootloader 阶段的内存定义。分析新版本 ABL 中的 AVB 启动流程,vbmeta、boot、dtbo、vendor_boot 分区都是由 avb_slot_verify() 负责加载到内存,并且存在代码的 loaded_partitions,随后核心函数 BootLinux() 调用 GetImage() 函数,而 GetImage() 函数则将启动参数结构体中的 ImageBuffer 指向 loaded_partitions[0].image_buffer(代码均是写死的,除非内核在 recovery 分区(某些 Android 版本是这样设计的),否则 boot 分区永远第一)。然后开机发现,出现 data fault panic 了,查看寄存器中的地址,后续调试发现与 DtSingleHdr 指针地址一致,该指针计算方法为 ImageBuffer + DtbOffset(新版本 UEFI 根据启动头版本判断是否小于 1 再加 PageSize),与旧版 ABL 启动日志比对发现,DtbOffset 和 PageSize 均未变化,唯一有变化且为巨大变化的是 ImageBuffer 的地址。随后发现 AllocateZeroPool() 函数不知道为什么分配了一个 0x2XXXXXXX 的地址。该地址在 UEFI 中肯定是不允许访问的,而且 MMU 检测到 CPU 越界访问直接 Panic...至此问题明了(一句话带过一天一夜的心酸努力),调整为 UEFI DXE 分配的内存地址和大小后,刷入顺利开机。Android 启动失败,init 进程找不到默认 fstab根据结果,逆向查找问题原因:发现 Ramdisk 已正确挂载,init 找不到这几个 prop:fstab_suffix, hardware, hardware.platform,无法获取到正确的默认 fstab 文件名。查看 init 代码发现,这几个 props 是从内核 cmdline 或 bootconfig 获取,高通在 HDR v4 通过 bootconfig 提供这几个参数。观察启动日志,注意到 Failed to parse bootconfig: Value is redefined at 错误,发现内核未能正确处理 bootconfig,有重复定义的值,经过检查,发现 bootconfig 中确实存在重复值 androidboot.boot_devices。但是高通的设备树中又定义了这个值,删去后问题解决。查询重复原因,发现 ABL 会向 bootconfig 中添加 androidboot.boot_devices,因此无需在设备树中再次添加。Android 启动失败,init 进程找不到默认 super 分区检查 Bootloader 向后传递的启动参数中的soc/是否更正为soc@0/
2025年02月05日
9 阅读
0 评论
0 点赞
2025-02-03
高通设备固件签名
环境准备高通 Sectools 需要使用 Python 2.固件签名 (secimage)查询 Chipsetsectools.py secimage -h --chipset=LIST查询 Sign IDsectools.py secimage -h --chipset=sm8250 --sign_id=LIST签名固件需要注意 config_path 和 chipset 参数二者只用提供一个即可。以签名 QCS8250 的 ABL 独立固件为例,使用高通测试签名进行签名:sectools.py secimage --config_path=QCS8250.LA.2.0/common/sectools/config/sm8250/sm8250_secimage.xml --sign_id=abl -i abl.elf -s随后可在 Sectools 目录的子目录 secimage_output 中,找到已签名的固件。本例中为QCS8250.LA.2.0/common/sectools/secimage_output/sm8250/abl/abl.elf已知问题与解决方案编译好的 ABL 刷入不开机,开机日志显示:pil-abl failed to validate firmware metadata return Device Error查询 BSP 中的 XBL 源码可知:在 PilValidateMetadata() 函数中,将 ABL 映像信息通过 PilScmStdCall() 发送给安全环境中的 TA 校验,校验通过后,TA 才会将 ABL 加载到安全内存中。结合高通设备启动流程:<Power On> -> PBL -> XBL Sec (Start QSEE) -> XBL Core [XBL] -> ABL (Fastboot/LinuxLoader) -> Linux Kernel -> HLOS (Android/Debian/Ubuntu)。对比高通提供的 Bootloader 包中的 abl.elf 文件发现,自己编译的 ABL 固件缺少签名。由于设备暂未开启安全启动,因此使用高通测试签名进行签名并刷入测试。经过测试,固件可以开机并加载。
2025年02月03日
25 阅读
0 评论
0 点赞
2025-01-16
高通板支持包 BSP 编译指南
大环境准备操作系统高通官方推荐比较老的 Ubuntu 14.04, 18.04 LTS等,但我不信邪,偏用 Debain 12.软件包系统软件包Python2 & pip2安装 Python 2.7 并设置 /usr/bin/python 为 python2首先引入 Debian 11 的主软件源,并执行 sudo apt update。随后安装 python2 和 python2-minimal 包。sudo rm -f /usr/bin/python sudo ln -s /usr/bin/python2 /usr/bin/python安装 pip2 并安装 python2 相关库。(如果有 pip3,则修改 pip 链接到 pip2)pip install pycryptodome future sixOpenSSL 1.1.1Debian 12 自带 OpenSSL 3,而且版本会越来越新,因此我们需要手动编译安装 OpenSSL 1.1.1,并且将其设置为默认 openssl 命令的执行程序。2.1. 编译 OpenSSL 1.1.1wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar zxf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl make -j$(nproc) make install2.2. 链接并设置为默认程序sudo mv /usr/bin/openssl /usr/bin/openssl3 sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl1 sudo ln -s /usr/bin/openssl1 /usr/bin/opensslGCC 9 & g++ 9由于高通的 Bootloader (XBL) 源码中包含 EDK II 项目代码,又由于 EDK II 旧版的部分代码没有修复在新版 GCC 编译器上出现的问题,因此除非手动修改部分程序(如 GetFds)的代码,否则我们还需要安装 GCC 9 和 g++ 9。sudo apt update && sudo apt install gcc-9 g++-9编译 EDK II 所需要的依赖sudo apt update sudo apt install build-essential uuid-dev iasl nasm高通软件包编译高通的系统组件还需要高通自己修改的 LLVM 和 Linaro GCC 等工具,通常情况我们只需要保证下载的工具的主要版本(X.Y)匹配即可,对于小的 Rev 则可以选用最新的。下载 Linaro GCC 4.9-2014.07此工具可以直接在 Linaro 网站上下载。下载 Qualcomm Snapdragon LLVM Compiler for Linux我们需要下载 v4.0.17 和 v8.0.3 两个版本,高通要求其私有 Linux 软件包只能通过 QPM3 下载,由于 QPM3 无法在 Debian 12 上正常运行(截至2025年1月17日),所以我们可以直接在高通 QCS8250 的产品页面上,登录高通账号下载。也可以在 Ubuntu 18.04 中安装 QPM3,登录高通账号下载安装后手动导出。下载后解压到特定目录,并记住每个版本文件夹的路径。(如/home/levi/toolchains/qualcomm-sd-llvm-4.0.17等)编译板支持包 BSP登录高通 ChipCode 门户,在 Product 中选择产品 QCS8250,选择 qcs8250-la-2-0_ap_standard_oem,进入页面后复制仓库地址。提前设置 http.followRedirects 为 true,随后使用 git clone 下载。需要注意,1.x本和 2.0 的包目录结构不一样,会在外面套一个用于分类软件包的文件夹。例如在 1.x 版本的 BSP 中,直接就是 boot_images/ 文件夹,但在 2.0 中会变成 BOOT.XF.3.2/boot_images/。p.s. 高通就把 Board Support Package 翻译成“板支持包”。环境准备Bootloader (XBL) 编译环境准备高通在 QCS8250 的 2.0 版本的 BSP 中引入了 UEFI (EDK II),所以编译 XBL 的过程中也编译了 EDK II 的部分源码,因此需要确保 EDK II 的 BaseTools 被正确编译。(否则编译过程会报错 7000,提示无法调用 minigzip)执行命令:cd <workspace>/qcs8250-la-2-0_ap_standard_oem/BOOT.XF.3.2/boot_images/BaseTools make需要注意,编译时脚本会自动设置 Sectools 签名策略为 MULTIPLE_DEFAULT_SIGN,不需要再手动设置 Sectools 签名策略。Sectools 的签名策略有下面几个选项:DEFAULT_SIGN, DEFAULT_INTEGRITY_SIGN_ATTR, DEFAULT_SIGN_UPDATE_UNSIGN, DEFAULT_UNSIGN, DEFAULT_SUBFOLDER_SIGN, DEFAULT_SUBFOLDER_INTEGRITY_SIGN_ATTR, SUBFOLDER_MULTIPLE_SIGN_AND_ENCRYPT, MULTIPLE_DEFAULT_SIGN, MULTIPLE_DEFAULT_SIGN_ENCRYPT如果需要设置的话,直接使用 export 命令设置任意一个策略为 1 就好了,需要注意的是,每次只有一个签名策略被启用,不能同时有两个以上。还需要注意,如果没有安装和使用 OpenSSL 1.1.1 版本,编译过程会因为 Sectools 失败而中止。在 QcomPkg/toolchainconfig.json 中修改 CLANG40、CLANG80 中 LINUX 项的值为你安装的 Qualcomm Snapdragon LLVM for Linux 对应的 4.0.X 和 8.0.3 的目录。编译使用高通提供的用户手册内的编译命令进行编译即可。为防止泄密,不贴出编译命令,毕竟高通给的所有文件里都有水印,还写着“Confidential - May Contain Trade Secrets”(笑)。困惑和问题观察 Bootloader (XBL) 的编译过程发现,在固件签名时,似乎使用的是默认的 secimagev3.xml 配置文件,为什么不用 QCS8250 (SM8250) 的专用配置文件 sm8250_secimage.xml 呢?
2025年01月16日
18 阅读
0 评论
0 点赞