今年面试蔚来的嵌入式 Linux 岗位,整体过程大概一个小时左右。面试官主要从基础到项目,再到细节,最后是一些现场思考和追问,节奏挺紧凑的。
1. 自我介绍
先让我简单介绍自己,说了学校背景、做过的项目,主要负责的内容,以及最近学习的方向。面试官点头后就直接开始问技术问题。
2. C 语言
第一部分几乎全是 C 基础:
- 指针和数组的区别,函数参数里
char *p
和char p[]
有什么不同。 sizeof
和strlen
的区别,以及在不同场景下的坑。- 内存对齐的问题,为什么结构体里有时候会有填充字节,让我写一段结构体代码算实际大小。
- 函数指针的写法,还有怎么用函数指针实现回调。
这些问题虽然常见,但问得比较细,比如 sizeof('a')
返回多少,为什么;再比如 const int *p
和 int * const p
区别。
3. C++
接下来转到 C++:
- 面向对象三大特性(封装、继承、多态),结合实际讲多态的虚函数实现原理。
- 问了虚函数表的布局,构造函数和析构函数里能不能调用虚函数。
- 智能指针 shared_ptr 和 unique_ptr 的区别,什么时候会用到 weak_ptr。
- 还让我手写一个简单的类,包含构造、析构、拷贝构造、赋值运算符,考察 C++ 的基本功。
4. 数据结构
数据结构部分主要是链表和树:
- 单链表的反转,要现场写代码。
- 判断链表是否有环,用什么方法,时间复杂度是多少。
- 二叉树遍历(前序、中序、后序),让我用递归和非递归两种方式写思路。
- STL 的 map 和 unordered_map 底层结构区别,什么时候用红黑树,什么时候用哈希表。
5. Linux 系统编程
这一块的问题比较多:
- 进程和线程的区别,
fork
和pthread_create
的差别。 - Linux 下进程间通信方式(管道、消息队列、共享内存、信号),让我挑一种说出具体使用场景。
select
和epoll
的区别,为什么高并发场景下更推荐 epoll。- 文件操作的系统调用流程,
open → read/write → close
,以及缓冲区在用户态和内核态的关系。 - 内存映射
mmap
,什么时候用,优缺点。
还有一个问题是“如果进程 A 崩溃了,进程 B 怎么知道”,我回答可以用信号、管道关闭检测等。
6. 驱动相关
面试官问我对 Linux 驱动的理解:
- Linux 驱动分层(字符设备、块设备、网络设备)。
- 设备树的作用,compatible、reg、interrupts 这些字段是什么意思。
probe
和remove
里一般做哪些事。- 用户态如何访问驱动,
file_operations
常见的接口。
7. 拷打环节
最后一部分明显就是“拷打”:
- 问我项目里遇到的最难问题是什么,我说了一个调试驱动的 bug,他追问我为什么一开始没能想到直接看寄存器,是不是排查顺序有问题。
- 让我解释“内核里内存分配失败怎么办”,我答了用 GFP 标志和重试机制,他继续问如果在中断上下文申请内存,为什么不能用
GFP_KERNEL
。 - 还问我“如果 epoll 监听 1 万个 socket,其中一个突然断开,你怎么定位”。这种问题很偏实战。
总结
整体感觉蔚来一面考察得比较全面,从基础到系统编程、驱动再到项目追问,没有特别偏的算法题,但对 C 语言细节和 Linux 编程熟练度要求很高。面试节奏很快,有时候答完一个问题马上接下一个,压力挺大。
如果要准备,建议重点复习:
- C 语言细节(指针、内存、关键字)。
- C++ 面向对象和 STL。
- 链表、树等基本数据结构。
- Linux IPC、网络编程、epoll、mmap。
- 驱动框架和设备树。
全部评论
(0) 回帖