2. 高频技术面试问题(Linux内核与驱动基础)
内核与驱动基础是BSP测试工程师面试的核心阵地。本章围绕模块加载、字符设备驱动、中断机制三大高频考点,拆解每道题背后的考察逻辑,提供可复用的回答框架与实战话术,帮助你在面试中做到“答得准、讲得透、有深度”。
📌 卡片 1 · 内核模块加载与卸载
🎯 面试问题
请描述 Linux 内核模块的加载与卸载流程,并说明在 BSP 测试中如何验证这一过程?
🔍 面试官考察点
- 是否理解模块生命周期(init → exit)
- 是否熟悉
insmod/modprobe差异及依赖处理 - 能否从测试角度设计验证方案(日志、状态、资源)
📐 回答框架
- 入口/出口函数:
module_init()/module_exit() - 加载流程:
insmod→ 分配资源 → 初始化 → 注册设备 - 依赖管理:
modprobe自动处理依赖,insmod需手动 - 卸载流程:
rmmod→ 释放资源 → 注销设备 - BSP 测试验证:
lsmod查状态,dmesg看日志,设备节点检查
✏️ 简短示例回答
“Linux 模块通过 module_init/module_exit 定义加载与卸载函数。insmod 直接加载到内核并初始化;modprobe 自动处理依赖。BSP 测试需验证:加载后设备节点创建、/proc/modules 状态正确、卸载后资源完整释放,配合 dmesg 跟踪日志,并使用 stress 测试反复加载卸载的稳定性。”
🔗 可能追问
- 模块参数如何传递?编译时 vs 加载时?
- 模块间依赖如何管理和查看?(
depmod/modinfo) - 加载失败(如 symbol 未定义)的排查步骤?
⚠️ 避坑提醒
- 不要忽略内核版本兼容性 —— 使用
vermagic检查 - 卸载时必须完整释放申请的资源(内存、中断、设备号),否则导致泄漏
- 测试要覆盖异常场景:加载失败、依赖缺失、重复加载
📌 卡片 2 · 字符设备驱动架构与测试
🎯 面试问题
请介绍字符设备驱动的核心架构,作为 BSP 测试工程师,你会如何设计测试用例?
🔍 面试官考察点
- 是否理解
file_operations与设备号管理 - 是否掌握
cdev注册流程及udev设备节点创建 - 能否设计覆盖功能、并发、边界、异常的测试用例
📐 回答框架
- 设备号:主设备号 + 次设备号,
alloc_chrdev_region()动态分配 - 核心结构:
file_operations实现open/read/write/release - 注册流程:
cdev_init()→cdev_add()→ 创建设备节点 - 测试设计:基础 IO、并发读写、边界条件、错误注入
✏️ 简短示例回答
“字符设备驱动以 file_operations 为核心,通过 cdev_add 注册到系统。BSP 测试需覆盖:设备节点权限与主次号正确性;open/read/write 基本功能;多进程并发读写压力测试;对齐与非对齐缓冲区边界测试;以及 ENOMEM、EIO 等错误注入场景。使用 iozone 和自研脚本验证吞吐与稳定性。”
🔗 可能追问
- 主、次设备号的作用是什么?如何查看已分配的设备号?
- 如何实现多个设备节点共享同一个驱动?(次设备号区分)
- 非阻塞 IO(O_NONBLOCK)如何测试?
⚠️ 避坑提醒
- 不要遗漏
file_operations.owner设置,否则模块卸载时可能崩溃 - 并发测试必须使用
pthread或stress模拟多进程同时访问 - 测试非对齐读写(如从奇数偏移读 3 字节)能暴露驱动内存访问 bug
📌 卡片 3 · 中断处理机制与下半部
🎯 面试问题
请解释 Linux 中断处理的上半部和下半部机制,在 BSP 测试中如何验证中断处理的正确性与稳定性?
🔍 面试官考察点
- 是否理解中断上下文限制(不可休眠、不可调度)
- 是否掌握
tasklet、workqueue、threaded IRQ的选型差异 - 能否设计中断延迟、丢失、嵌套等测试场景
📐 回答框架
- 上半部:紧急硬件操作(清除标志、读取状态),要求快速返回
- 下半部:耗时数据处理,延迟执行
- 三种机制:
tasklet(软中断上下文)、workqueue(进程上下文)、threaded IRQ(内核线程) - 测试验证:响应时间、不丢失、共享兼容性
✏️ 简短示例回答
“上半部执行清除中断标志等紧急操作,下半部处理数据逻辑。Linux 提供 tasklet(不可休眠)、workqueue(可休眠)和 threaded IRQ。BSP 测试使用 ftrace 测量中断响应延迟,用高频中断触发验证不丢中断,通过共享中断测试确认兼容性,并监控 /proc/interrupts 统计计数。”
🔗 可能追问
- 为什么中断上下文不能休眠?(没有进程调度上下文)
tasklet与workqueue的核心区别?(睡眠能力、执行上下文)- 如何测量中断响应时间?(
ftrace/tracepoints)
⚠️ 避坑提醒
- 上半部不要调用
msleep()、mutex_lock()等可能休眠的函数 - 高频中断场景(如 1ms 周期)要测试下半部是否积压导致 OOM
- 共享中断必须检查
irqreturn_t返回值是否正确传递