vivo 暑期实习面经|嵌入式方向
最近我整理了 vivo 暑期实习(嵌入式 / Linux 方向)的面经,发出来给后面要面的同学做个参考。技术面难度还是有的,节奏偏快,会顺着你的回答往下挖;整体氛围还行,但有几道题一旦答浅了就会立刻追问细节。
面试题目
- 进程和线程在内核里分别对应什么数据结构?创建线程和创建进程在内核路径上有什么异同?
- CFS 调度器里
vruntime是什么?为什么用红黑树?新进程加入时如何防止老进程被饿死? nice值、SCHED_FIFO/SCHED_RR和 CFS 的关系是什么?实时调度会不会饿死普通进程?- 虚拟地址到物理地址的完整路径(MMU、页表、TLB)讲一遍;TLB miss 时会发生什么?
- 伙伴系统和 slab 分配器分别解决什么问题?为什么内核小对象多用 slab?
mmap映射文件时,页缓存和进程地址空间是什么关系?MAP_SHARED和MAP_PRIVATE写时行为有何不同?- 自旋锁和互斥锁的使用场景有什么区别?在进程上下文和软中断里分别该怎么选?
- 读写锁适合什么场景?写者优先可能导致什么问题?
- RCU 的基本思想是什么?为什么在读多写少场景下性能好?写侧如何等待读者结束?
- 硬中断和软中断的区别?为什么中断处理里不能做耗时操作?
- tasklet、workqueue、threaded IRQ 分别适合什么场景?threaded IRQ 相比传统上下半部有什么优势?
- 中断里能否睡眠?为什么?在中断上下文调用可能睡眠的函数会怎样?
- 字符设备驱动里
open/read/write/ioctl和用户态系统调用的对应关系?file_operations何时挂到struct file上? - 平台设备和设备树如何匹配?
compatible字符串起什么作用? - 内核模块加载的大致流程:
init里通常做哪些事?符号未解析为什么会失败? - 两个进程通过共享内存通信,内核里需要建立哪些对象?销毁时如何防止悬空引用?
- 驱动在
probe里申请中断失败,但remove仍会被调用,资源申请/释放顺序应如何设计? - soft lockup 和 hard lockup 分别可能是什么原因?如何用
ftrace/sysrq做初步定位?
更多嵌入式大厂面试经验和题目以及基础八股文资料都放在专栏了:
https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
(oppo,vivo,海康威视,小米等大厂面经)
来源:牛客网准备方法(嵌入式面试要准备什么)
- C 语言基础:指针、内存布局、位操作、结构体对齐、
volatile/const含义;能手写常见链表、环形缓冲区。 - MCU / 裸机:时钟树、GPIO、中断优先级、DMA、定时器;能讲清楚一次外设通信(SPI / I2C / UART)从配置到收发的完整流程。
- RTOS(若简历有):任务、队列、信号量、互斥量区别;优先级反转、死锁四个条件;中断里能做什么、不能做什么。
- Linux 用户态:系统调用、
errno、多进程 / 多线程、select/poll/epoll、管道 / 套接字 / 共享内存;会用strace、gdb做简单排查。 - Linux 内核与驱动:进程调度、虚拟内存、锁与中断下半部、字符 / 平台驱动框架、设备树匹配、
insmod与资源释放(devm_*);简历上的驱动项目要能画调用链。 - 计算机基础:大小端、Cache、MMU 概念、中断 vs 异常、编译链接(
.o、符号表、静态 / 动态库)。 - 项目与调试:每个项目准备 3 分钟:你负责什么、难点、怎么定位的 bug(示波器 / 逻辑分析仪 / log / 内核打印);常见场景如死机、丢中断、内存泄漏要能自圆其说。
- 手写与笔试:数组、字符串、简单链表 / 栈、位运算题;部分岗位会考基础算法,保持手感即可。
这场面下来,感受是 不是背名词,而是要把机制串成一条线——调度、内存、锁、中断是连着的;mmap 会牵到 page cache,驱动 probe/remove 会牵到资源管理和中断上下文规则。我在 RCU 和 threaded IRQ 的细节上被追问了两轮,答得不够利落,但能把项目里「下半部用 workqueue、中断里不睡眠」和题目对上,面试官会愿意往下聊。