【嵌入式面试】嵌入式 Linux 面试通关指南

💌 所属专栏:【嵌入式面试】
😀 作  者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘


🐧 嵌入式 Linux 面试通关指南:从驱动开发到系统移植,一文掌握高频考点!

随着智能设备、工业控制、车载系统和物联网的快速发展,嵌入式 Linux 已成为主流的嵌入式操作系统之一。相比裸机或 RTOS,它具备多任务、文件系统、网络协议栈、设备驱动等完整功能,广泛应用于路由器、摄像头、工控机、智能终端等设备中。

本文专为准备嵌入式 Linux 开发岗位面试的工程师打造,系统梳理 高频面试题 + 核心知识点 + 项目经验技巧,助你轻松应对技术面,斩获 Offer!


🧩 一、嵌入式 Linux 面试考察方向

考察方向主要内容
Linux 基础命令文件操作、进程管理、权限设置等
C语言与指针内存管理、结构体、函数指针、位操作
Makefile 与编译编译流程、交叉编译、Makefile 编写
Shell 脚本自动化脚本编写
内核机制进程/线程、调度、同步、内存管理
设备驱动开发字符设备、platform、I2C、SPI、中断处理
系统移植Bootloader(U-Boot)、内核裁剪、根文件系统构建
网络编程Socket 编程、TCP/UDP、多线程服务器
调试工具GDB、strace、gdbserver、printk、logcat

🔍 二、Linux 基础命令高频问题

1. 常见命令有哪些?

ls / ps / top / cat / grep / find / chmod / chown / df / free / ifconfig / ping

2. grep "error" log.txt 是什么意思?

log.txt 文件中查找包含 “error” 的行。

3. 如何查看当前运行的进程?

ps aux        # 查看所有进程
top           # 实时监控进程状态

4. 如何修改文件权限?

chmod 755 start.sh    # rwxr-xr-x

⚙️ 三、Makefile 与交叉编译

1. 什么是 Makefile?写一个简单的例子

CC = arm-linux-gnueabi-gcc
CFLAGS = -Wall -O2
TARGET = app
SRC = main.c driver.c

$(TARGET): $(SRC)
	$(CC) $(CFLAGS) -o $(TARGET) $(SRC)

clean:
	rm -f $(TARGET)

2. 什么是交叉编译?为什么要用?

  • 交叉编译:在 PC(x86)上编译出能在目标平台(如 ARM)上运行的程序。
  • 因为目标设备资源有限,无法本地编译。

3. 常见的交叉编译工具链有哪些?

  • arm-linux-gnueabi-gcc(通用 ARM)
  • arm-none-linux-gnueabihf-gcc(带硬浮点)

🧠 四、Shell 脚本编程

写一个脚本:检测某个进程是否运行,如果没有则启动它

#!/bin/sh
PROCESS_NAME="myapp"

if pgrep -x "$PROCESS_NAME" > /dev/null; then
    echo "$PROCESS_NAME is running."
else
    echo "$PROCESS_NAME is not running. Starting..."
    /home/app/myapp &
fi

🔌 五、设备驱动开发(重中之重!)

1. 字符设备驱动的基本结构

一个典型的字符设备驱动包含:

  • file_operations 结构体
  • open, read, write, ioctl, release 等接口
  • register_chrdev() / cdev_add() 注册设备
  • 设备节点 /dev/xxx

2. 主设备号和次设备号的作用?

  • 主设备号:标识设备类型(如硬盘、串口)
  • 次设备号:区分同一类型的不同设备(如 /dev/sda1, /dev/sda2

3. platform 总线的作用是什么?

  • 实现驱动与设备的分离,便于代码复用。
  • 匹配 platform_deviceplatform_driver

4. 中断处理中的上半部和下半部

类型特点使用方式
上半部(Top Half)快速响应,不能休眠request_irq() 中执行
下半部(Bottom Half)延迟处理,可休眠使用 tasklet、工作队列(workqueue)

示例:使用工作队列处理耗时操作

static struct work_struct my_work;

void work_handler(struct work_struct *work) {
    printk("Work queue is running\n");
}

irq_handler_t my_irq_handler(int irq, void *dev_id) {
    schedule_work(&my_work);
    return IRQ_HANDLED;
}

🖥️ 六、系统移植三大件

1. U-Boot(Bootloader)

  • 功能:初始化硬件、加载内核、传递参数
  • 常见命令:
    printenv     # 查看环境变量
    setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2'
    saveenv      # 保存环境变量
    bootm        # 启动内核
    

2. Linux 内核

  • 配置:make menuconfig
  • 编译:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage
  • 裁剪:去掉不需要的驱动和模块,减小体积

3. 根文件系统(rootfs)

  • 常见构建方式:
    • BusyBox(最小化系统)
    • Buildroot / Yocto(自动化构建)
  • 包含:/bin, /sbin, /etc, /lib, /dev, /proc, /sys

🌐 七、网络编程与 Socket

写一个简单的 TCP 服务器(多线程版本)

#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

void *client_handler(void *arg) {
    int client_fd = *(int*)arg;
    char buf[1024];
    read(client_fd, buf, sizeof(buf));
    write(client_fd, "Hello from server", 17);
    close(client_fd);
    return NULL;
}

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr.s_addr = INADDR_ANY };
    bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
    listen(server_fd, 5);

    while (1) {
        int client_fd = accept(server_fd, NULL, NULL);
        pthread_t tid;
        pthread_create(&tid, NULL, client_handler, &client_fd);
        pthread_detach(tid);
    }
}

🛠️ 八、调试技巧与工具

工具用途
printk()内核日志输出,配合 dmesg 查看
strace跟踪系统调用
gdb / gdbserver用户态程序调试
insmod / rmmod / lsmod驱动模块加载与卸载
cat /proc/interrupts查看中断使用情况
mount / umount挂载文件系统

💼 九、项目经验怎么讲?(嵌入式 Linux 专用)

使用 STAR 法则 + 技术细节

“我参与了一个基于 IMX6ULL 的工业网关开发项目(S)。负责 Linux 内核移植和串口驱动开发(T)。使用 U-Boot 移植引导程序,裁剪内核以适配硬件资源,并编写了支持 485 通信的字符设备驱动,通过 workqueue 处理接收数据(A)。最终设备稳定运行在高温工业环境中,连续工作超过 1 年无故障(R)。”


✅ 十、面试准备建议

  1. 动手实践:自己搭建开发环境,烧写系统、写驱动、跑应用
  2. 掌握全流程:从 U-Boot → Kernel → Rootfs → 应用开发
  3. 熟悉简历项目:每一个技术点都要能深入讲解
  4. 了解行业趋势:如 Yocto、Docker in Embedded、RT Linux
  5. 模拟面试:找人模拟“请你写一个字符设备驱动”这类问题

📚 结语

嵌入式 Linux 面试不仅考察你的编码能力,更看重你是否具备系统级思维、底层理解能力和工程落地经验。掌握以上内容,再结合 1~2 个完整项目,你已经具备了冲击岗位的实力!

🔔 福利:关注我,回复“嵌入式Linux面试PDF”,可领取本文整理的高清PDF版 + 高频题库打包下载!


版权声明:

本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰舟比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值