零售安卓硬件上的底层开发 - 对引导加载程序的侦察和原型制作

主要观点:两年前 Tim 想将主线 Linux 移植到旧 Android 手机(Samsung Galaxy Core Plus)进行实验,该设备使用 2012 年的 Broadcom BCM21664 SoC,虽上游 Linux 内核有基本支持,但实际运行仍需努力,且测试时缺乏设备反馈和长的刷写测试周期。
关键信息:

  • 通过 UART 与设备通信,利用内置 USB 多路复用器和特定电阻连接实现,默认 UART 连接设置为 115200n8。
  • 确定运行现有日志消息的二进制文件为 sboot.bin,通过 Ghidra 分析找到其加载地址等信息。
  • 发现 S-BOOT 有自动启动功能、命令系统等,通过一些操作可使 S-BOOT 开始打印日志。
  • 研究 S-BOOT 的加载流程,了解其加载内核的方式。
  • 编写第一个可执行程序,通过 lifted 函数指针在 UART 上打印内容并成功运行。
  • 尝试加载和启动内核,遇到数据传输速度等问题,通过实现简单的流控制解决。
  • 尝试加载 Linux 内核但出现问题,后续可进行如迁移到合理构建过程等改进。
    重要细节:
  • XDA 论坛成员早在 2010 年就解决了设备通过 UART 通信的问题。
  • 在 Ghidra 中分析 sboot.bin 时遇到数据加载地址不匹配问题,通过开关表确定映射偏移。
  • 编写的加载和启动内核的 stub 程序及发送程序的具体实现细节。
  • 实现流控制时通过读取 UART 控制器的 FIFO 队列状态来控制数据传输。
阅读 7
0 条评论