在准备嵌入式开发岗位的面试时,你是否被那些经典而深入的技术问题所困扰?比如网络模型、TCP连接细节,或是C语言编译的奥秘。今天,我们就来梳理一份高质量的嵌入式技术面试真题,并结合核心知识点进行解析,帮助你在技术面中更好地展现自己的实力。
1. OSI七层模型与TCP/IP四层模型协议对比
理解网络分层模型是嵌入式网络编程的基础。面试官常常会考察你对标准模型及其对应协议的掌握程度。

-
OSI七层模型
- 物理层:以太网、RS-232等
- 数据链路层:PPP、HDLC等
- 网络层:IP、ICMP等
- 传输层:TCP、UDP等
- 会话层:NetBIOS、RPC等
- 表示层:ASCII、JPEG等
- 应用层:HTTP、FTP等
-
TCP/IP四层模型
- 网络接口层:以太网等
- 网络层:IP等
- 传输层:TCP、UDP等
- 应用层:HTTP、FTP等
简单来说,TCP/IP模型可以看作是OSI模型在实际应用中的简化与融合。对于嵌入式开发者,深入理解TCP/IP四层模型及其协议栈的运作机制尤为重要。
2. TCP连接的三次握手与四次挥手
TCP协议的可靠连接建立与断开过程,是网络/系统面试中的必考题。你需要清晰地描述每个步骤的状态变化与报文交换。

三次握手建立连接:
- 第一次握手:客户端向服务器发送一个SYN报文(序列号为x),请求建立连接。此时客户端进入SYN_SENT状态。
- 第二次握手:服务器收到SYN报文后,如果同意连接,则回复一个SYN+ACK报文(确认号为x+1,同时携带自己的初始序列号y)。此时服务器进入SYN_RCVD状态。
- 第三次握手:客户端收到服务器的SYN+ACK报文后,发送一个ACK报文(确认号为y+1)进行确认。此报文发送完毕后,客户端和服务器都进入ESTABLISHED状态,连接建立成功。
四次挥手断开连接:
- 第一次挥手:主动关闭方(假设为客户端)发送一个FIN报文,请求断开连接,并停止发送数据。此时客户端进入FIN_WAIT_1状态。
- 第二次挥手:被动关闭方(服务器)收到FIN报文后,回复一个ACK报文进行确认。此时服务器进入CLOSE_WAIT状态,客户端收到ACK后进入FIN_WAIT_2状态。此时连接处于半关闭状态,服务器可能还有数据需要发送。
- 第三次挥手:当服务器数据发送完毕后,发送一个FIN报文,请求断开自己到客户端的连接。服务器进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN报文后,回复一个ACK报文。服务器收到ACK后关闭连接。客户端等待2MSL(最大报文段生存时间)后,也关闭连接。
3. 进程与线程的核心区别
这是操作系统概念的经典问题,考察你对系统资源管理和任务调度的理解。

- 进程:是资源分配的基本单位。每个进程都有自己独立的地址空间、数据栈和代码段。进程间的通信(IPC)需要特定的机制,如管道、共享内存等,开销较大。
- 线程:是CPU调度和执行的基本单位。线程属于某个进程,并共享该进程的地址空间和大部分资源。线程间的通信可以直接读写进程数据段(需要同步机制),因此上下文切换开销比进程小得多。
简单比喻:进程像一个工厂,拥有独立的场地和资源;线程像是工厂里的工人,共享工厂的资源,协同完成工作。
4. GCC编译过程的四个阶段
对于C/C++开发者,了解源代码到可执行文件的转化过程至关重要。GCC的编译过程主要分为四步:
-
预处理 (Preprocessing)
- 处理源代码中的预处理指令,如
#include(头文件包含)、#define(宏替换)、条件编译等。
- 生成扩展名为
.i(C语言)或 .ii(C++)的预处理后文件。
- 命令示例:
gcc -E hello.c -o hello.i
-
编译 (Compilation)
- 将预处理后的高级语言代码(
.i文件)翻译成特定平台的汇编代码。
- 生成扩展名为
.s 的汇编文件。
- 命令示例:
gcc -S hello.i -o hello.s
-
汇编 (Assembly)
- 使用汇编器将汇编代码(
.s文件)翻译成机器码(目标代码)。
- 生成扩展名为
.o 或 .obj 的可重定位目标文件。
- 命令示例:
gcc -c hello.s -o hello.o
-
链接 (Linking)
- 将多个目标文件(
.o文件)以及所需的库文件(静态库.a或动态库.so)合并,解析符号引用(如函数调用),生成最终的可执行文件。
- 命令示例:
gcc hello.o -o hello
理解gcc编译过程有助于你定位编译和链接阶段的错误,是嵌入式C/C++开发的基本功。
5. C语言中static关键字的三种用法
static关键字在C语言中用途灵活,是面试高频考点。
- 修饰局部变量:将局部变量的生命周期从函数内延长到整个程序运行期。变量只在第一次进入函数时初始化一次,之后每次调用函数都使用上次调用结束时的值。存储位置在静态存储区。
- 修饰全局变量:限制该全局变量的作用域仅在其定义的源文件内,其他文件无法通过
extern引用。这避免了命名冲突和意外的外部访问。
- 修饰函数:与修饰全局变量类似,将函数的作用域限制在定义它的源文件内,使其成为该文件的“私有”函数,防止其他文件调用。
6. WiFi的工作原理与协议
在物联网和智能设备嵌入式开发中,WiFi是常见的无线连接方式。

- 原理:WiFi基于IEEE 802.11系列标准,利用无线电波(通常是2.4GHz或5GHz频段)在无线局域网(WLAN)内传输数据。主要设备包括无线接入点(AP,如路由器)和带有无线网卡的终端设备(STA)。数据通过载波监听多路访问/冲突避免(CSMA/CA)机制进行发送,以减少冲突。
- 协议:常见的协议是IEEE 802.11 a/b/g/n/ac/ax系列。例如,802.11n支持MIMO技术,提高了速率和覆盖范围;802.11ac是主流的高速标准;802.11ax(Wi-Fi 6)则进一步提升了效率和多设备并发能力。
7. 程序内存存储区的分类
程序运行时,其数据和代码被加载到内存的不同区域。常见的分类方式有5区或7区模型。
- 栈 (Stack):由编译器自动分配释放,存放函数参数、局部变量等。操作方式类似数据结构中的栈。
- 堆 (Heap):由程序员动态申请和释放(如
malloc/free, new/delete)。若未正确释放会导致内存泄漏。
- 全局/静态存储区:存放全局变量和静态变量(包括
static修饰的局部和全局变量)。程序开始时分配,结束时释放。通常细分为:
- BSS段:存放未初始化的全局变量和静态变量,程序执行前会被系统初始化为0。
- 数据段:存放已初始化的全局变量和静态变量。
- 常量存储区:存放字符串常量和其他被
const修饰的常量。内容只读,不可修改。
- 代码区/文本段:存放程序的机器指令,通常是只读的,防止程序被意外修改。
8. 进程间通信(IPC)的主要方式
当多个进程需要协作时,就需要进程间通信机制。嵌入式Linux系统中常见的IPC方式包括:
- 管道 (Pipe)
- 匿名管道:用于具有亲缘关系(如父子进程)的进程间通信,是单向的。
- 命名管道 (FIFO):提供了一个路径名与之关联,允许无亲缘关系的进程进行通信。
- 消息队列 (Message Queue):消息的链表,存放在内核中。进程可以独立地读写队列中的消息,克服了管道只能承载无格式字节流的缺点。
- 共享内存 (Shared Memory):多个进程可以访问同一块内存空间,是速度最快的IPC方式。但需要配合信号量等机制来解决同步问题。
- 信号量 (Semaphore):主要用于进程间同步,控制多个进程对共享资源的访问,避免竞态条件。
- 套接字 (Socket):功能最强大的IPC机制,可用于不同主机间的进程通信,也支持同一主机上的进程通信(如Unix Domain Socket)。
掌握这些核心的嵌入式面试真题,不仅能帮助你在技术面中游刃有余,更是对你基础知识体系的一次巩固。技术学习离不开交流与分享,如果你有更多的见解或疑问,欢迎在云栈社区的对应板块与广大开发者一起探讨。
|