这份整理涵盖了 Linux 系统架构、编译构建、内核原理 以及 嵌入式启动流程。
原列表内容非常丰富,但也比较杂乱(例如"启动过程"出现了两次)。我将其重新梳理为五大知识模块,并对冗长的答案进行了提炼,使其更适合面试口述。
搭配下面的播客使用效果更佳
📂 第一板块:系统架构与内核原理 (内功深厚)
这部分考察你对操作系统底层设计的理解,是区分初级和中级工程师的分水岭。
| 问题 | 级别 | 核心考点与精简回答 |
|---|---|---|
| Linux系统的组成 | 了解 | 四大支柱:内核 (核心硬件管理)、Shell (交互接口)、文件系统 (数据存储)、应用程序。 |
| 用户空间 vs 内核空间 | 必问 | 目的:为了安全和稳定,隔离用户程序与核心资源。 用户空间 (User Space):受限模式,不能直接访问硬件。 内核空间 (Kernel Space):特权模式,可以访问所有资源 (内存/IO/外设)。 |
| 用户态切换到内核态的三种方式 | 重点 | 1. 系统调用 (Syscall):用户程序主动发起(如 open, fork)。 2. 异常 (Exception):程序运行出错(如缺页异常、除零错误)。 3. 外设中断 (Interrupt):硬件信号触发(如键盘输入、网卡数据到达)。 |
| 进程与线程的区别 | 必问 | 1. 进程:资源分配的最小单位(独立的内存空间)。 2. 线程:CPU调度的最小单位(共享进程的内存,开销小)。 |
| 虚拟地址的好处 | 重点 | 1. 安全:进程间内存隔离,互不干扰。 2. 节省:共享库代码在物理内存只需存一份,多进程映射使用。 3. 连续性:逻辑上连续的虚拟地址,物理上可以是碎片的。 |
| Linux中断机制 (上半部/下半部) | 难点 | 为什么要分? 为了兼顾响应速度和处理能力。 上半部 (Top Half):关中断执行,只处理最紧急的硬件交互,速度要极快。 下半部 (Bottom Half):开中断执行,处理耗时任务。 下半部实现: 1. Tasklet:运行在软中断上下文,不可睡眠。 2. Workqueue:运行在进程上下文,可以睡眠。 |
| WSL 是什么? | 了解 | WSL是“Windows Subsystem for Linux”的缩写,顾名思义,WSL就是Windows系统的Linux子系统,其作为Windows组件搭载在Windows10周年更新(1607)后的Windows系统中。 |
| 常见的linux系统有哪些 | 了解 | ubuntu,centOS,Red Hat 等 |
📂 第二板块:编译与构建体系 (工程能力)
这部分是 C/C++ 开发者的必修课,考察对代码如何变成可执行程序的理解。
| 问题 | 级别 | 核心考点与精简回答 |
|---|---|---|
| 动态库(.so)与静态库(.a)的区别 | 必问 | 0.静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。 1. 链接时机:静态库在编译时打入程序;动态库在运行时加载。 2. 文件大小:静态编译程序大;动态编译程序小。 3. 依赖性:静态程序可独立运行;动态程序依赖环境中的 .so 文件。 4. 升级:动态库修bug只需替换库文件,无需重新编译程序。 |
| Make与Makefile的区别 | 重点 | Makefile:是一个文件(剧本),写明了编译规则和依赖关系。 Make:是一个命令/工具(导演),它读取 Makefile 并执行编译指令。 核心优势:自动化编译,且利用依赖树只编译修改过的文件(增量编译),效率高。 |
| 什么是CMake | 必问 | 定义:高级编译配置工具。 作用:Make 的生成器。它可以根据 CMakeLists.txt 自动生成不同平台所需的 Makefile (Linux) 或 Project文件 (Windows VS)。解决跨平台构建难题。 |
| 静态链接 vs 动态链接 | 重点 | (同第一题,强调链接过程)。 链接优化:合理拆分源文件、使用增量链接、去除未用符号 (strip)。 |
| 在Linux C中,ls命令怎么被执行的 | 经典 | 三步走: 1. fork():父进程创建子进程。 2. exec():子进程调用 exec 系列函数加载 /bin/ls 程序替换当前进程镜像。3. wait():父进程等待子进程结束。 |
📂 第三板块:常用命令与文件管理 (实操基础)
| 问题 | 级别 | 核心考点与精简回答 |
|---|---|---|
| Linux文件类型与标志 | 重点 | 1. -:普通文件。 2. d:目录。 3. l:符号链接 (软链)。 4. b:块设备 (硬盘)。 5. c:字符设备 (串口/LED)。 6. p:管道。 7. s:套接字 (Socket)。 场景快记: 我桌面的普通文件(-)太多,就建了个目录(d),又怕找不到,就创建了个链接(l)。 电脑连着块(b)设备硬盘和字符©设备键盘。上网靠套接字(s),数据传输用管道(p) |
| 修改权限用哪个命令 | 基础 | chmod (Change Mode)。例如 chmod 777 file。 |
| 32位机器的指针是多少位 | 了解 | 32位 = 4字节。指针的位数取决于 CPU 的寻址宽度(地址总线)。 |
| Shell脚本如何定义数组 | 了解 | arr=(1 2 3) 或 arr[0]=1。 |
📂 第四板块:嵌入式Linux特有 (驱动与启动)
这是嵌入式/驱动岗位的核心考区。
| 问题 | 级别 | 核心考点与精简回答 |
|---|---|---|
| 嵌入式Linux启动流程 | 必问 | 四个阶段: 1. ROM Code:CPU上电,执行固化代码。 2. Bootloader (U-Boot):初始化基础硬件(时钟/内存),加载内核。 3. Kernel:挂载根文件系统,初始化驱动。 4. RootFS (init/systemd):启动用户空间服务和应用。 嵌入式芯片启动过程全解析,彻底理解bootloader |
| U-Boot的作用 | 了解 | 核心任务:从 Flash 读出内核 放入内存 启动内核。 它是一个裸机程序,负责硬件的早期初始化。 |
| 字符设备 vs 块设备 | 重点 | 字符设备 (Char Device): 1. 按字节流读写 (顺序访问)。 2. 无缓存。 3. 例子:键盘、串口、LED。 块设备 (Block Device): 1. 按块(512B/4K)读写 (随机访问)。 2. 有缓存 (Buffer Cache)。 3. 例子:硬盘、SD卡。 |
| 主设备号与次设备号 | 了解 | 主设备号:标识驱动程序(我是谁?是硬盘驱动还是网卡驱动)。 次设备号:标识具体设备(是第几个硬盘?sda1还是sda2)。 |
| 上电后串口无输出,如何排查 | 实战 | 一、硬件层面检查(由表及里) 这是系统运行的生理基础,硬件不行软件必挂。 1. 电源 (Power): 检查核心板和底板的供电电压是否稳定(如 5V/3.3V/1.8V/1.2V 核心电压)。电流是否正常?(电流过大可能有短路,电流过小可能CPU未工作)。 2. 时钟 (Clock): 这是 CPU 的心跳。必须用示波器测量晶振引脚,确认是否起振,频率是否准确。 3. 复位 (Reset): 检查复位电路。测量复位引脚电平,确认 CPU 是否一直处于被复位状态(Reset脚被拉低/拉高)。 4. 串口连接 (Connection): ● 线序:TX 接 RX,RX 接 TX,不能直连。 ● 共地:板子 GND 和 串口模块 GND 必须连在一起。 ● 电平:确认是 TTL 电平(3.3V)还是 RS232 电平,是否匹配。 5. 启动模式 (Boot Straps): 检查 CPU 的启动引脚(Boot引脚)电平配置。确保 CPU 被配置为从你烧录的介质(如 SD卡、EMMC、NAND Flash)启动,而不是进入了 USB 下载模式或 JTAG 模式。 6. JTAG/SWD 接口: 如果以上都无法定位,尝试连接仿真器。如果 JTAG 能读到 CPU ID,说明 CPU 核心电路基本活着;如果连不上,大概率是硬件虚焊或损坏。 二、软件层面检查(由外及内) 硬件没问题后,检查代码逻辑和配置。 1. 镜像匹配 : Bootloader 是否专为当前这块板子编译的?CPU 型号、DDR 容量/型号、Flash 型号哪怕有一点差异,都可能导致启动失败。 2. 烧录地址 : 检查烧录工具的配置。Bootloader 必须烧录到存储介质的特定起始地址(不同 CPU 要求不同,有的在 0x0,有的在特定偏移量)。 3. 交叉编译器: 使用的编译器架构(ARMv7/ARMv8/MIPS等)和版本是否正确? 4. 源码配置 : 这是最容易出错的地方: ● 串口配置:代码中初始化的串口(UART0/1/2)引脚,是否与原理图上的调试串口一致?波特率是否对上了? ● 时钟配置 (PLL):PLL 初始化代码是否正确?如果倍频系数错了,CPU 或总线频率异常,串口无法工作。 ● DDR 初始化:Bootloader 第一阶段(SPL)通常需要初始化 DDR。如果 DDR 时序或参数配置错误,程序在尝试读写内存时会直接死机,导致没有任何输出。 |
📂 第五板块:软件开发概念
这是软件开发中两个容易混淆的概念,面试中常用来考察基础认知。
| 问题 | 级别 | 详细解释 |
|---|---|---|
| API 与 SDK 的区别 | 基础 | 1. 定义不同: ● API (Application Programming Interface):应用程序接口。它是一组定义好的函数、协议或工具,告诉开发者“你可以调用什么功能”。 ● SDK (Software Development Kit):软件开发工具包。它是一个大礼包,通常包含 API、库文件、文档、示例代码、开发工具(编译器/调试器)等。 2. 包含关系: SDK 通常包含了 API。API 是 SDK 的一部分。 3. 形象比喻: ● API 就像菜单:告诉你有什么菜(功能)可以点,你只需要照着菜单点,不需要知道厨房怎么做。 ● SDK 就像“预制菜料理包”+“锅碗瓢盆”:不仅给了你菜单(API),还给了你半成品食材(库)、烹饪说明书(文档)和厨具(工具),让你能做出一顿完整的饭(开发出完整的应用)。 |
💡 备考建议
- 流程图记忆法:对于 “ls怎么执行的” 和 “Linux启动流程”,脑子里要有一张流程图,不要死记硬背文字。
- 对比记忆法:
- Make vs CMake
- 静态库 vs 动态库
- 上半部 vs 下半部
- 进程 vs 线程
- 实战准备:如果面试嵌入式,“串口无输出怎么调试” 这道题非常加分,它能体现你是否有真实的板卡调试经验。