三个真实BIOS笔试真题,看看你在哪个段位
- 2026-11-10 22:13:32
三个真实BIOS笔试真题,看看你在哪个段位
从指针到启动流程,三道题测出你的水平
上一篇讲了简历怎么写。这一篇接着聊笔试——因为简历过了,接下来就是笔试,而 BIOS 这行的笔试,其实比很多人想象的要"硬核"得多。
先声明一句:下面这三道题,是我基于公开的 EDK2 源码、公开的 UEFI/PI 规范和行业公开知识点自己出的模拟题,不是任何公司真题,也请不要对号入座。但它们背后考察的东西,是我这些年面试里反复确认过、真正能区分水平的点。
三道题,从青铜到王者。做完你大概就知道自己在哪个段位了。
🥉 第一题:青铜段位——C 指针与位运算
题目: 下面这段代码在 32 位 x86 平台上运行,请写出输出结果,并解释每一步。
参考答案与考察点:
这道题看着简单,其实埋了三个 BIOS 天天要踩的坑:
- 大小端
: 0x12345678在小端(x86 是 little-endian)下,低字节0x78存在低地址,所以p[0]输出0x78。BIOS 里读寄存器、写 MMIO,如果你分不清大小端,dump 出来的数据你自己都看不懂。
- 结构体内存对齐
: REG_T按 4 字节对齐,布局是a(1字节) + 填充(1字节) +b(2字节) +c(4字节),共 8 字节。*q读的是前 4 字节,即0x22 33 11 00按小端拼起来 =0x00112233,输出0x00112233。这一条考的是你对"内存里到底怎么排的"有没有感觉——BIOS 里定义 PCH 寄存器结构体、做 ACPI 表填充时,对齐错一个字节就是灾难。
- 位运算与隐式类型提升
: x是unsigned char,x << 1会先被提升为int,0x80 << 1 = 0x100,x >> 7 = 1,所以y = 0x100 | 1 = 0x101,强转回unsigned char后是0x01。考的是你对整型提升的理解——GPIO 配置里左移/右移/取反是最日常的操作,很多人栽在"以为 char 就是 char"上。
这题如果第一问就答错,说明你根本没真写过贴近硬件的 C,得补。如果三问全对,至少说明你不是那种"只在 IDE 里跑过 Hello World"的人。
🥈 第二题:白银段位——UEFI 阶段划分与职责
题目: UEFI/PI 规范把固件启动流程分成若干阶段(Phase)。请回答:
1. 按顺序列出这些阶段,并简述每个阶段的核心职责和内存环境(执行在哪种内存里)。
2. 如果一个平台在 PEI 阶段想做某件事,但发现可用的服务/机制不够用,PI 规范提供了什么机制让它"临时调用"更强大的功能?这个机制的入口、返回点分别是什么?
参考答案与考察点:
这道题是分水岭——它把"背过 UEFI 名词的人"和"真正理解启动流程的人"区分开。
第一问,标准答案(基于公开 PI 规范):
这里的关键考察点是内存环境。很多候选人能把阶段名字背下来,但一问"SEC 阶段跑在哪"就懵了。Cache-As-RAM 这个概念,是 BIOS 和普通应用开发最本质的区别之一——你写的代码,是在连内存都没有的裸环境里跑的。答不出这一点,说明你对"固件"的理解还停留在"写个程序"层面。
第二问,答案是 PEI 阶段的"临时调用"机制:
PEI 阶段只有有限的 PEI Services(主要是 PPI 和基本内存服务)。当一个 PEIM 需要"更强能力"时,PI 规范提供了 Temporary RAM / 直接通过 IDT 调用 DXE 的机制——更准确说,是 PEI 可以通过 SwitchStack 和临时 IDT,从 PEI 的栈切换到"临时内存"栈,然后调用到 SEC 或更早预留的、具备更完整 C 运行环境的代码。
不过这道题我真正想听的核心答案是 "PEI 用 PPI 按需发现、EFI_PEI_SERVICES 里没有的东西,靠向 DXE 迁移来获得" 这条逻辑,以及最经典的一个词:EFI_PEI_TEMPORARY_RAM_DONE_PPI 和 MigrateMemory/SwitchStack。PEI 结束时通过 TemporaryRamDone PPI 通知平台,把临时 RAM 迁到主内存,这个过程用 SwitchStack 换栈。能把"临时栈切到永久栈"这个动作说出来,说明你是真读过 PI 规范、真写过 PEIM 的人。
这题答到"能列全阶段 + 知道 SEC 跑在 Cache-As-RAM + 能说出 PPI 和栈迁移",基本就是能独立做 bring-up 的苗子。
🥇 第三题:王者段位——一个 GPIO 配置 bug 的分析
题目(实战模拟): 某笔记本项目,量产阶段出现客诉:约 5% 的机器在低温环境(0℃ 以下)冷启动时,开机后触控板(Touchpad)偶发无法识别。而同一批机器在常温下 100% 正常。已知:
- 触控板挂在 I2C 总线上,其复位信号 TP_RST_N 和中断信号 TP_INT_N 分别由 PCH 的两个 GPIO 控制。
- 固件在 DXE 阶段通过某个 PCH GPIO 控制器驱动完成 GPIO 初始化。
- 现象是:TP_INT_N 上观察不到中断脉冲,读触控板芯片的 Device ID 返回全 0xFF。
请给出你的分析思路、可能的根因,以及验证方法。
参考答案与考察点:
这是一道开放题,没有唯一答案,我考的是你的排查方法论。一个好的 BIOS 工程师看到这道题,脑子里应该瞬间弹出一个排错树:
第一步:定位问题在"复位时序"还是"供电"还是"总线"。
读 Device ID 返回 0xFF,这是经典信号——I2C 从设备没被正确拉起来(NACK / 总线拉死),或者芯片根本没上电/没出复位。而"低温偶发 + 常温正常",这种温度相关性,第一反应就是时序裕量问题:低温下器件电气特性漂移,原本"勉强能过"的时序,在低温下就不够了。
第二步:重点怀疑 TP_RST_N 的复位脉冲宽度不够。
触控板这类 I2C 外设,上电后通常需要一个最小复位脉宽(几十毫秒量级,具体看 datasheet)。如果固件在 GPIO 初始化里把 TP_RST_N 拉低再拉高,但拉低持续时间太短,常温下芯片内部上电爬坡快,勉强能完成复位;低温下上电慢,复位还没做完就被提前释放了,芯片就卡在未复位状态,Device ID 自然读出来全 0xFF。
可能的根因(几个都合理):
- 复位脉宽不足
——GPIO 拉低到拉高之间没有足够的 delay。
- GPIO 配置错误
——比如 TP_RST_N 被配成了 push-pull 而非 open-drain,或者驱动能力(drive strength)设太低,导致复位边沿不陡。
- 复位释放早于供电稳定
——BIOS 没等 VCC 稳定就释放了复位,低温下 VCC 爬坡更慢,问题暴露。
- 中断 GPIO 被配成了输入且没有上拉
,低温下引脚漏电流变化导致电平不稳。
验证方法(这是这道题最值钱的部分):
- 用示波器抓 TP_RST_N 和 VCC 的时序
,看复位脉冲宽度、复位释放时刻相对 VCC 稳定时刻的裕量。这是最快、最直接的证据。
- 低温复现 + 加长复位延时做对比实验
:在 DXE 里把拉低延时加大,看低温故障是否消失。如果消失,根因基本锁定为复位时序。
- 读 GPIO 的输入状态寄存器
,确认 TP_INT_N 的实际电平,判断是"没产生中断"还是"中断被配错极性"。
- dump 出该 GPIO 的 pad 配置寄存器
,核对方向、上拉、驱动能力、中断触发沿这些位是不是和硬件手册一致。
考察点总结: 这道题考的不是"背答案",而是你有没有一套"读现象 → 建假设 → 抓波形 → 做对照"的 debug 闭环。能第一反应想到"读 0xFF = 复位/供电没到位",还能想到"温度相关性 = 时序裕量",这就是有量产经验的老兵和一个只写过 demo 的人之间的差距。
🎯 写在最后
三道题,一道考基本功,一道考体系认知,一道考实战方法论。对应到段位大概是:
第一题勉强答对 → 可以聊聊,但离"独立扛平台"还远。
第二题能答出 Cache-As-RAM 和 PPI → 有戏,能干活。
第三题能完整走一遍"复位时序"的分析和验证 → 欢迎,这种人来一个要一个。
笔试这东西,本质上不是为难你,是招聘方想快速知道:你过去是真的在 debug,还是只是"参与"了 debug。 这个差别,三道题就露馅了。
固件笔记 · 笔记本BIOS老兵实战记录