嵌入式面了三十场才发现:一面能答,二面总挂在同一层
- 轮次
- 一面、二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- Linux 下
volatile的作用是什么?什么场景必须加? static修饰全局变量、局部变量、函数分别有什么效果?- 字节对齐的规则是什么?为什么要对齐?不对齐会怎样?
- 进程和线程有什么区别?各自的通信方式有哪些?
- 堆和栈有什么区别?程序运行时内存怎么分配?
const和指针结合的几种写法分别是什么意思?- I2C 的通信过程是什么?几根线?怎么寻址?上拉电阻为什么要有?
- DMA 是做什么的?用它有什么好处?
- GDB 常用哪些命令?段错误怎么定位?
- FreeRTOS 的任务调度是怎么调的?抢占式怎么理解?
- 互斥量和信号量有什么区别?分别用在什么场景?
- Linux 的进程调度是怎么工作的?
schedule函数什么时候被调用? - 页表是几级的?分页有什么缺点?
- 时间片轮转和多级反馈队列是什么?nice 值怎么影响优先级?
- 共享内存到底依不依赖内核?读写为什么快?
- 实时操作系统的调度器怎么设计?上下文怎么保存?
- 信号量释放之后,内核怎么决定下一个唤醒哪个线程?
- 怎么评估一个系统的实时性?中断响应时间怎么测?
- 上下文切换的时候,系统具体做了哪些事?
- MMU 怎么把虚拟地址翻译成物理地址?
- U-Boot 启动为什么要分两个阶段?第一阶段为什么要尽量小?
《参考解析》
挂点不在题量,在深度:一面考「知不知道」,二面考「往下能不能接住」。比如互斥量和信号量,一面答区别就够了,二面会追问内核怎么实现、释放后唤醒谁、优先级继承怎么做的。刷面经时看到「这个我会」就翻页,实际只是记住结论,没有形成机制链条。改进方法是每道高频题都往下追三层:它是什么、怎么实现、为什么这么设计、出问题怎么排查。
Linux 调度与内存:schedule() 在进程主动让出、时间片用完、阻塞唤醒、抢占时被调用,核心是从运行队列选下一个任务并做上下文切换。CFS 用虚拟运行时间维护红黑树,nice 值影响权重;多级反馈队列按优先级和时间片分级。页表把虚拟地址翻译成物理地址,多级页表节省空间但增加访存次数,靠 TLB 缓存。MMU 走页表基址寄存器 → 各级页表 → 物理页框 → 页内偏移,缺页时触发异常由内核处理。
RTOS 与实时性:RTOS 调度器按优先级抢占,同优先级时间片轮转;上下文切换保存寄存器、栈指针、程序状态字,切换页表和刷新 TLB(如果有 MMU)。信号量释放后,内核把等待队列里最高优先级的任务置为就绪,必要时触发调度。实时性看中断延迟、调度延迟和最坏执行时间,测量可以用 GPIO 翻转 + 示波器、周期任务打时间戳、cyclictest 等工具。
U-Boot 两阶段:第一阶段用汇编做最少的硬件初始化(关中断、设时钟、初始化 RAM、准备 C 运行环境),体积小、依赖少,能在 RAM 还没完全可用时运行;第二阶段用 C 做板级初始化、加载内核、传递设备树和启动参数。分两阶段是为了可移植和节省 SRAM。