面灵AI→

嵌入式面了三十场才发现:一面能答,二面总挂在同一层

轮次
一面、二面
时间
2026-10
来源
牛客网

《面试题目》

  1. Linux 下 volatile 的作用是什么?什么场景必须加?
  2. static 修饰全局变量、局部变量、函数分别有什么效果?
  3. 字节对齐的规则是什么?为什么要对齐?不对齐会怎样?
  4. 进程和线程有什么区别?各自的通信方式有哪些?
  5. 堆和栈有什么区别?程序运行时内存怎么分配?
  6. const 和指针结合的几种写法分别是什么意思?
  7. I2C 的通信过程是什么?几根线?怎么寻址?上拉电阻为什么要有?
  8. DMA 是做什么的?用它有什么好处?
  9. GDB 常用哪些命令?段错误怎么定位?
  10. FreeRTOS 的任务调度是怎么调的?抢占式怎么理解?
  11. 互斥量和信号量有什么区别?分别用在什么场景?
  12. Linux 的进程调度是怎么工作的?schedule 函数什么时候被调用?
  13. 页表是几级的?分页有什么缺点?
  14. 时间片轮转和多级反馈队列是什么?nice 值怎么影响优先级?
  15. 共享内存到底依不依赖内核?读写为什么快?
  16. 实时操作系统的调度器怎么设计?上下文怎么保存?
  17. 信号量释放之后,内核怎么决定下一个唤醒哪个线程?
  18. 怎么评估一个系统的实时性?中断响应时间怎么测?
  19. 上下文切换的时候,系统具体做了哪些事?
  20. MMU 怎么把虚拟地址翻译成物理地址?
  21. U-Boot 启动为什么要分两个阶段?第一阶段为什么要尽量小?

《参考解析》

挂点不在题量,在深度:一面考「知不知道」,二面考「往下能不能接住」。比如互斥量和信号量,一面答区别就够了,二面会追问内核怎么实现、释放后唤醒谁、优先级继承怎么做的。刷面经时看到「这个我会」就翻页,实际只是记住结论,没有形成机制链条。改进方法是每道高频题都往下追三层:它是什么、怎么实现、为什么这么设计、出问题怎么排查。

Linux 调度与内存:schedule() 在进程主动让出、时间片用完、阻塞唤醒、抢占时被调用,核心是从运行队列选下一个任务并做上下文切换。CFS 用虚拟运行时间维护红黑树,nice 值影响权重;多级反馈队列按优先级和时间片分级。页表把虚拟地址翻译成物理地址,多级页表节省空间但增加访存次数,靠 TLB 缓存。MMU 走页表基址寄存器 → 各级页表 → 物理页框 → 页内偏移,缺页时触发异常由内核处理。

RTOS 与实时性:RTOS 调度器按优先级抢占,同优先级时间片轮转;上下文切换保存寄存器、栈指针、程序状态字,切换页表和刷新 TLB(如果有 MMU)。信号量释放后,内核把等待队列里最高优先级的任务置为就绪,必要时触发调度。实时性看中断延迟、调度延迟和最坏执行时间,测量可以用 GPIO 翻转 + 示波器、周期任务打时间戳、cyclictest 等工具。

U-Boot 两阶段:第一阶段用汇编做最少的硬件初始化(关中断、设时钟、初始化 RAM、准备 C 运行环境),体积小、依赖少,能在 RAM 还没完全可用时运行;第二阶段用 C 做板级初始化、加载内核、传递设备树和启动参数。分两阶段是为了可移植和节省 SRAM。