嵌入式Linux驱动必考八股文清单
第一部分:高频面试题
- Linux 设备模型(Device Model)由哪几部分组成?各自作用是什么?
- platform 设备与 platform 驱动的匹配机制是什么?
- device、driver、bus 三者之间的关系如何理解?
- 字符设备驱动的注册流程(alloc_chrdev_region / cdev_add)是怎样的?
- file_operations 结构体中常用接口有哪些?各自作用是什么?
- open/read/write/ioctl/poll 在内核中的调用路径是怎样的?
- 阻塞与非阻塞 IO 在驱动中如何实现?
- poll/select/epoll 在驱动层的支持机制是什么?
- Linux 中断处理流程(上半部/下半部)如何划分?
- request_irq 的关键参数及 flags 含义是什么?
- tasklet、workqueue、softirq 的区别与使用场景是什么?
- 自旋锁与互斥锁的区别?各自适用场景是什么?
- 原子操作与锁的区别?为什么需要原子操作?
- 内核内存分配(kmalloc/vmalloc/dma_alloc_coherent)区别是什么?
- DMA 的基本原理及一致性问题如何解决?
- 用户空间与内核空间数据交互(copy_to_user / copy_from_user)原理是什么?
- mmap 在驱动中的实现流程及应用场景是什么?
- wait queue(等待队列)的实现原理与使用方法是什么?
- 内核定时器(timer)与延时机制(msleep、udelay)区别是什么?
- 设备树(Device Tree)的作用及驱动中如何解析?
- probe/remove 的调用时机分别是什么?
- 电源管理(suspend/resume)在驱动中的实现方式?
- 内核日志(printk)与调试机制(debugfs、trace)如何使用?
- Linux 驱动中常见的竞态条件如何避免?
- I2C/SPI 驱动框架的基本结构与通信流程是什么?
第二部分:八股文总结
一、必须建立的整体框架
嵌入式 Linux 驱动本质可以归结为三条主线:
- 设备模型主线bus / device / driver匹配机制(match)probe/remove 生命周期
- 字符设备主线设备节点(/dev)file_operations用户态访问路径
- 并发与资源管理主线中断锁机制内存与 DMA
如果没有这三条主线,所有知识点都会是碎片。
嵌入式八股文专栏(全网最全面的嵌入式八股文专栏,包含大厂面试题):https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
二、八股核心模块拆解
1. 驱动模型(必考核心)
关键点:
- platform 总线是嵌入式最常见模型
- 匹配机制本质:name / of_match_table / id_table
- probe 是驱动入口
面试常考本质问题:
- “为什么 probe 会被调用?”
- “设备是如何被找到的?”
本质答案:内核通过 bus 上的 match 函数进行 device 和 driver 匹配。
2. 字符设备驱动(基础必考)
必须掌握:
- 设备号(主/次设备号)
- cdev 结构
- file_operations
核心理解:用户调用 read → VFS → file_operations → 驱动函数
重点不是 API,而是路径。
3. 中断机制(高频难点)
必须清楚:
- 上半部:快速处理(ISR)
- 下半部:延后执行(tasklet/workqueue)
关键对比:
- tasklet:轻量、原子上下文
- workqueue:进程上下文,可睡眠
面试重点:为什么不能在中断里睡眠?
4. 并发与锁(决定上限)
必须掌握三类:
- 自旋锁(spinlock):不可睡眠
- 互斥锁(mutex):可睡眠
- 原子变量(atomic)
核心判断题:“当前上下文能不能睡眠?”
5. 内存与 DMA(进阶分水岭)
核心区别:
- kmalloc:物理连续
- vmalloc:虚拟连续
- dma_alloc_coherent:DMA 专用
重点理解:
- Cache 一致性
- DMA 映射
6. 用户态交互(工程高频)
三种方式:
- read/write
- ioctl
- mmap
其中 mmap 是加分项。
7. 设备树(嵌入式必考)
关键点:
- compatible 匹配驱动
- of_property_read_* 解析属性
本质:设备树是“硬件描述”,驱动是“行为实现”。
第三部分:高效学习方法
一、学习顺序(非常关键)
错误顺序:API → demo → 忘光
正确顺序:
- 驱动模型(bus/device/driver)
- 字符设备框架
- 中断 + 并发
- 内存 + DMA
- 设备树
- 子系统(I2C/SPI/USB)
二、学习原则
原则 1:只记“机制”,不背 API
面试考的是:
- 为什么这样设计
- 数据如何流动
不是:
- 函数参数顺序
原则 2:所有知识必须“画图”
必须能画出:
- 用户态 → 内核态路径
- 中断处理流程
- 驱动加载流程
画不出来 = 没掌握
原则 3:每个模块必须写最小驱动
必须自己写过:
- 字符设备驱动
- 中断驱动
- platform 驱动
否则都是“伪掌握”。
三、面试准备策略
1. 八股文背诵方法
每个知识点只准备三句话:
- 定义是什么
- 为什么需要
- 怎么实现
2. 高频追问准备
面试官常追问:
- 为什么不用另一种方案?
- 有没有更优解?
- 在什么场景会出问题?
必须准备“对比答案”。
3. 项目包装
必须准备:
- 一个完整驱动项目
- 能讲清:架构难点优化点
四、常见误区
- 只会写 demo,不懂驱动模型
- 只记 API,不理解机制
- 不会分析调用路径
- 不懂并发问题
- 没有实际调试经验
第四部分:冲刺建议
如果时间有限,优先级如下:
- 驱动模型(必须拿下)
- 字符设备(必须熟)
- 中断 + 锁(高频)
- 设备树(嵌入式必考)
- DMA(加分项)
结语
嵌入式 Linux 驱动的本质不是“写代码”,而是:
- 理解内核如何管理设备
- 理解数据如何在系统中流动
- 理解并发与资源如何被控制
真正拉开差距的不是会不会写驱动,而是:
能不能把驱动“讲明白”。
