嵌入式Linux驱动必考八股文清单

第一部分:高频面试题

  1. Linux 设备模型(Device Model)由哪几部分组成?各自作用是什么?
  2. platform 设备与 platform 驱动的匹配机制是什么?
  3. device、driver、bus 三者之间的关系如何理解?
  4. 字符设备驱动的注册流程(alloc_chrdev_region / cdev_add)是怎样的?
  5. file_operations 结构体中常用接口有哪些?各自作用是什么?
  6. open/read/write/ioctl/poll 在内核中的调用路径是怎样的?
  7. 阻塞与非阻塞 IO 在驱动中如何实现?
  8. poll/select/epoll 在驱动层的支持机制是什么?
  9. Linux 中断处理流程(上半部/下半部)如何划分?
  10. request_irq 的关键参数及 flags 含义是什么?
  11. tasklet、workqueue、softirq 的区别与使用场景是什么?
  12. 自旋锁与互斥锁的区别?各自适用场景是什么?
  13. 原子操作与锁的区别?为什么需要原子操作?
  14. 内核内存分配(kmalloc/vmalloc/dma_alloc_coherent)区别是什么?
  15. DMA 的基本原理及一致性问题如何解决?
  16. 用户空间与内核空间数据交互(copy_to_user / copy_from_user)原理是什么?
  17. mmap 在驱动中的实现流程及应用场景是什么?
  18. wait queue(等待队列)的实现原理与使用方法是什么?
  19. 内核定时器(timer)与延时机制(msleep、udelay)区别是什么?
  20. 设备树(Device Tree)的作用及驱动中如何解析?
  21. probe/remove 的调用时机分别是什么?
  22. 电源管理(suspend/resume)在驱动中的实现方式?
  23. 内核日志(printk)与调试机制(debugfs、trace)如何使用?
  24. Linux 驱动中常见的竞态条件如何避免?
  25. I2C/SPI 驱动框架的基本结构与通信流程是什么?

第二部分:八股文总结

一、必须建立的整体框架

嵌入式 Linux 驱动本质可以归结为三条主线:

  1. 设备模型主线bus / device / driver匹配机制(match)probe/remove 生命周期
  2. 字符设备主线设备节点(/dev)file_operations用户态访问路径
  3. 并发与资源管理主线中断锁机制内存与 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. 用户态交互(工程高频)

三种方式:

  1. read/write
  2. ioctl
  3. mmap

其中 mmap 是加分项。

7. 设备树(嵌入式必考)

关键点:

  • compatible 匹配驱动
  • of_property_read_* 解析属性

本质:设备树是“硬件描述”,驱动是“行为实现”。

第三部分:高效学习方法

一、学习顺序(非常关键)

错误顺序:API → demo → 忘光

正确顺序:

  1. 驱动模型(bus/device/driver)
  2. 字符设备框架
  3. 中断 + 并发
  4. 内存 + DMA
  5. 设备树
  6. 子系统(I2C/SPI/USB)

二、学习原则

原则 1:只记“机制”,不背 API

面试考的是:

  • 为什么这样设计
  • 数据如何流动

不是:

  • 函数参数顺序

原则 2:所有知识必须“画图”

必须能画出:

  • 用户态 → 内核态路径
  • 中断处理流程
  • 驱动加载流程

画不出来 = 没掌握

原则 3:每个模块必须写最小驱动

必须自己写过:

  • 字符设备驱动
  • 中断驱动
  • platform 驱动

否则都是“伪掌握”。

三、面试准备策略

1. 八股文背诵方法

每个知识点只准备三句话:

  1. 定义是什么
  2. 为什么需要
  3. 怎么实现

2. 高频追问准备

面试官常追问:

  • 为什么不用另一种方案?
  • 有没有更优解?
  • 在什么场景会出问题?

必须准备“对比答案”。

3. 项目包装

必须准备:

  • 一个完整驱动项目
  • 能讲清:架构难点优化点

四、常见误区

  1. 只会写 demo,不懂驱动模型
  2. 只记 API,不理解机制
  3. 不会分析调用路径
  4. 不懂并发问题
  5. 没有实际调试经验

第四部分:冲刺建议

如果时间有限,优先级如下:

  1. 驱动模型(必须拿下)
  2. 字符设备(必须熟)
  3. 中断 + 锁(高频)
  4. 设备树(嵌入式必考)
  5. DMA(加分项)

结语

嵌入式 Linux 驱动的本质不是“写代码”,而是:

  • 理解内核如何管理设备
  • 理解数据如何在系统中流动
  • 理解并发与资源如何被控制

真正拉开差距的不是会不会写驱动,而是:

能不能把驱动“讲明白”。

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务