TI-84 Plus操作系统完整逆向工程解析
速览
本文详细展示了TI-84 Plus计算器操作系统的完整逆向工程过程。通过深入分析其底层代码和架构,揭示了该经典教育计算设备的软件实现细节。这一工作不仅有助于理解传统嵌入式系统的开发模式,也为相关硬件的安全研究和功能扩展提供了重要参考。
AI 深度解读
TI-84 Plus 操作系统完整逆向工程深度解读
背景
TI-84 Plus 是一款在教育和工程领域广泛使用的图形计算器,其核心架构基于 Zilog Z80 处理器。尽管 Z80 拥有 16 位地址总线,理论上可寻址 64 KiB 的逻辑空间,但 TI-84 Plus 的实际硬件配置远超这一限制:它配备了 1 MiB 的 Flash 存储和 128 KiB 的 RAM。
为了在有限的寻址能力下管理庞大的存储资源,TI 设计了一套复杂的硬件分页机制。此次逆向工程的目标文件为 ti84plus.rom(1 MiB 的 Flash 转储镜像),操作系统自标识版本为 2.55MP。研究团队使用 Ghidra 进行了反编译和分析,项目名为 ti84.gpr,并提供了通过 tools/build.sh 脚本重建项目的工具。
值得注意的是,该逆向工程文档引入了明确的置信度标记体系,以确保技术分析的严谨性:
- [confirmed](已确认):已在反汇编或反编译器中验证。
- [standard](标准):符合 TI-83+/84+ 的文档架构,且与反汇编结果一致。
- [hypothesis](假设):基于推断,尚未得到最终验证。
核心内容
系统架构概览:分页与系统调用
TI-84 Plus 的操作系统是一个单任务监控程序(Single-tasking Monitor)。其核心架构解决了“小寻址空间”与“大存储空间”之间的矛盾,主要依赖两大机制:
-
4 槽分页方案(4-Slot Paging Scheme): 系统通过硬件 Flash/RAM 分页技术,将 1 MiB Flash 和 128 KiB RAM 映射到 64 KiB 的逻辑地址空间中。代码和数据被分割成 16 KiB 的页面,通过切换页面来访问不同区域。
-
系统调用机制(bcalls): 这是 TI 操作系统特有的内部通信协议。位于 Flash 不同页面的代码可以通过
bcalls调用其他页面的例程。这种机制使得分散在 Flash 各处的 OS 例程能够协同工作。
内存布局与核心组件
- Flash Page 0:始终映射在低地址区域,包含引导程序(Boot)和内核核心(Kernel Core)。
- 其他 Flash 页面:包含庞大的 OS 例程库,通过
bcalls被访问。 - 固定 RAM 区域:用于保存系统状态,包括标志位、浮点寄存器、显示缓冲区以及变量表(Variable Table)。
用户交互的四大支柱
用户所看到的所有交互界面——包括主屏幕(Homescreen)、TI-BASIC 程序、绘图功能以及目录(Catalog)——均建立在以下四个核心技术支柱之上:
-
分页 + bcalls: 这是访问超出 64 KiB 限制代码和数据的基础设施。相关细节详见文档
02-paging.md和03-bcall-mechanism.md。 -
浮点引擎(Floating-Point Engine): 所有数学运算都流经此引擎。它使用 9 字节的 BCD(二进制编码十进制)格式存储实数和复数,数据暂存在 OP1 至 OP6 寄存器中。
-
变量系统(VAT - Variable Allocation Table): 这是一个命名对象目录,用于管理实数、列表、矩阵、字符串、程序和应用变量(appvars)等。所有用户数据都通过 VAT 进行编目和管理。
-
词法分析器/解析器(Tokenizer/Parser): TI-BASIC 程序在存储时采用 1 字节或 2 字节的 Token 形式。解析器负责读取这些 Token 并执行相应的指令。
I/O 子系统
围绕上述核心支柱,系统还集成了多个 I/O 子系统,包括:
- IM1 中断:负责驱动计时器、自动断电(APD)、光标显示和 ON 键响应。
- LCD 驱动器:控制屏幕显示。
- 键盘扫描器:处理用户输入。
- 链路端口(Link Port):用于计算器之间的数据通信。
文档结构与索引
逆向工程笔记提供了详细的子系统索引,将文档映射到具体的功能模块:
- *子文档(sub- docs)**:深入探讨面向用户的功能和 I/O 内部细节,涵盖计算、绘图、TI-BASIC、VAT/归档、应用程序、统计、矩阵、求解器、表格、方程显示、链路及 USB 辅助等功能。
- 入门指南:新用户建议先阅读《约定与方法论》(了解地址读取和置信度标记)以及《术语表》。
- bcalls 索引:提供完整的字母顺序系统调用参考。
关键地址与 Boot 细节
- 0x4xxx 地址空间:主要的
bcalls表,包含 TI-OS 类型。 - 0x8xxx 地址空间:零售版启动
bcalls表,数据来源于本地完整的 ROM。 - Flash Page 3F:大多数启动
bcalls的主体代码位于此页。 - Flash Page 2F:包含 USB 启动例程,如
_AttemptUSBOSReceive、_ReceiveOS_USB、_InitUSB和_KillUSB。
关键要点
- 硬件限制与突破:TI-84 Plus 使用 Z80 处理器,受限于 64 KiB 的逻辑寻址空间,但通过 4 槽分页机制成功管理了 1 MiB Flash 和 128 KiB RAM。
- 单任务监控架构:操作系统是单任务的,核心内核固定在 Flash Page 0,其余功能通过分页和
bcalls分散存储。 - 数据运算核心:浮点运算依赖 9 字节 BCD 格式,所有数学计算必须经过 OP1-OP6 寄存器。
- 数据存储机制:变量系统(VAT)是管理所有用户数据(程序、变量、矩阵等)的核心目录结构。
- 语言执行方式:TI-BASIC 不是解释纯文本,而是通过词法分析器执行压缩后的 Token 流。
- 逆向工程严谨性:分析结果分为“已确认”、“标准”和“假设”三个置信度等级,确保技术文档的可靠性。
- USB 支持位置:USB 相关的启动例程(如初始化、接收 OS 数据等)具体位于 Flash Page 2F。
意义与影响
此次对 TI-84 Plus 操作系统的完整逆向工程,不仅揭示了经典教育计算器的底层工作原理,也为嵌入式系统开发、复古计算研究以及硬件安全分析提供了宝贵的参考。
- 教育工具的透明度:TI-84 系列是许多学生接触编程和高级数学的起点。公开其底层架构细节,有助于开发者创建更高效的第三方工具、模拟器或教育软件。
- 嵌入式分页技术的案例研究:该案例展示了如何在资源受限的 8/16 位微控制器上,通过硬件分页和软件调用机制(bcalls)实现超越物理寻址限制的大规模程序运行。
- 固件分析与安全:详细的
bcalls索引和内存布局分析,为固件修改、漏洞挖掘以及理解专有操作系统的设计模式提供了基础。 - 开源社区贡献:通过提供 Ghidra 项目和重建脚本,研究团队降低了其他开发者参与 TI 计算器逆向工程的门槛,促进了开源硬件社区的协作。
这一工作将原本黑盒化的商业固件转化为可理解、可分析的技术文档,体现了开源精神在硬件逆向工程领域的价值。
