我们都知道完整的计算机系统是从 CPU Reset 开始的。这里提供了三个架构的 “最小代码” 演示,展示 CPU Reset 后立即执行 “结束” 代码的短小程序,并打印出执行的指令序列和寄存器变化。运行程序,我们可以明确地看到 CPU Reset 后的寄存器状态,以及执行指令的结果:计算机世界没有任何魔法。
CIH (也称为 Chernobyl 病毒) 是台湾大同大学学生陈盈豪于 1998 年创建的,能够影响早期的 Windows 9x (95、98、Me) 操作系统。在 AI 的帮助下,我们把病毒代码翻译成了 “好读” 的 C 语言,可以清晰地看到病毒感染、潜伏和破坏的过程。
课程和互联网上的文档都声称是 Firmware 代码将具有 55 aa Magic Number 磁盘的前 512 字节载入内存。经过一些尝试 (例如修改 Magic Number),我们确认了这一行为;更进一步地,我们能否调试固件的代码,看看到底是什么指令实现了磁盘到内存的搬运?这就用到了《计算机系统基础》实验中的 Watch Point。在这里,我们还用到了 init.gdb,它可以帮我们省去每次运行时的重复输入命令,也可以设置 hook (钩子),每当程序暂停时显示一些我们关心的信息——我们定制和扩展了 gdb,使它在调试专属于我们的任务时更加强大。
一个开源的 RISC-V 引导固件,用于管理 RISC-V 平台的启动过程。它实现了 SBI(Supervisor Binary Interface)规范,为操作系统提供了硬件抽象层,简化了系统启动和硬件管理。OpenSBI 支持多种 RISC-V 处理器和平台,广泛用于嵌入式系统和开发板。
硬件是一个无情执行指令的状态机,从 CPU Reset 开始执行固件 (Firmware) 中的代码。固件负责初始化硬件并加载操作系统。操作系统本质上就是一个普通的二进制程序,它接管了中断、I/O 等资源,并把应用程序 “放” 到 CPU 上运行。从硬件的角度看,硬件根本不知道有没有操作系统的存在。
大家可以在 AI 的帮助下,了解你感兴趣的体系结构的执行模型,例如 CPU Reset 行为、中断处理、特权级等;了解 BIOS/UEFI 的工作原理;尝试编译 OpenSBI 并理解固件的编译链接过程。