跳转至

03 嵌入式 Linux

考频:★★★(选择题 + 填空题,交叉编译器必考)


一、Linux 内核组成

标准 Linux 内核由以下五大模块组成:

模块 功能
进程管理 创建/调度/终止进程,任务切换
内存管理 虚拟内存、分页、内存分配与回收
文件系统 VFS 虚拟文件系统,支持 ext4/FAT/JFFS2 等
网络协议栈 TCP/IP、UDP 等网络协议实现
设备驱动 字符设备/块设备/网络设备驱动框架

[!TIP] 填空记忆:进(进程管理)内(内存管理)文(文件系统)网(网络协议栈)驱(设备驱动)


二、嵌入式 Linux 特点

特点 说明
裁剪精简 去除不需要的模块,减小内核体积
占用资源少 内存占用小,适合资源有限的嵌入式设备
开源免费 源码公开,可以自由修改定制
支持多种架构 ARM、MIPS、x86、PowerPC 等
软实时 标准 Linux 是软实时,需要打补丁才能达到硬实时

三、常见嵌入式 Linux 发行版

μCLinux(micro-Controller Linux)

考频:★★★★(非常容易出陷阱!)

属性 内容
MMU 支持 无 MMU(无内存管理单元),专为低端 MCU 设计
实时性 软实时,不是硬实时
适用场景 资源极度受限的微控制器(如 ColdFire、ARM7 无 MMU 版本)

[!CAUTION] μCLinux 是软实时! 考题中经常把 μCLinux 混在硬实时系统的选项里。记住:名字里有 "Linux" 的(μCLinux、嵌入式 Linux)都是软实时

无 MMU 意味着没有虚拟内存、内存保护功能较弱。

Android

属性 内容
内核 基于 Linux 内核(修改版)
实时性 软实时
特点 加入了 Binder 通信机制、Wakelocks 电源管理等

[!NOTE] Android 底层是 Linux,但 Android 不等于 Linux。Android 在 Linux 内核之上增加了大量 Google 自己的组件。


四、嵌入式 Linux 实时化技术

标准 Linux 是软实时,要做到硬实时,需要以下技术:

技术 说明
RT-Linux 补丁 将 Linux 内核作为实时内核的一个低优先级任务运行,在 Linux 之下增加一个微型实时内核
PREEMPT-RT 补丁 改造 Linux 内核,使内核完全可抢占,大幅降低调度延迟

[!TIP] 这两种方法本质都是"给 Linux 打补丁",让它具备更好的实时性。 PREEMPT-RT 是目前 Linux 官方主推的实时化方案,已逐渐合并进主线内核。


五、交叉编译器(填空必考!)

考频:★★★★★(填空必考)

什么是交叉编译?

交叉编译:在一种平台(宿主机)上编译出能在另一种平台(目标机)上运行的代码。

例如:在 x86 的 PC 上,编译出能在 ARM 上运行的程序。

arm-linux-gcc

arm-linux-gcc 是用于 ARM 架构 Linux 系统的交叉编译器。

# 格式
arm-linux-gcc [选项] 源文件

# 常用示例
arm-linux-gcc -o hello hello.c          # 编译生成可执行文件 hello
arm-linux-gcc -g -o hello hello.c       # 带调试信息编译(-g 参数)
arm-linux-gcc -c hello.c                # 只编译不链接,生成 hello.o
参数 含义
-o 文件名 指定输出文件名
-g 加入调试信息(GDB 调试必须加此参数,必考!
-c 只编译,不链接
-O2 开启优化(优化级别 2)
-I 目录 指定头文件搜索路径
-L 目录 指定库文件搜索路径

[!WARNING] 填空高频:为程序加入调试信息,使用 -g 参数。

例题:arm-linux-gcc ______ -o output input.c 中加调试信息,填 -g

命名规则说明

交叉编译器命名格式:<目标架构>-<操作系统>-<编译器>

  • arm-linux-gcc:目标 ARM 架构,运行 Linux,使用 GCC 编译器
  • arm-none-eabi-gcc:目标 ARM,裸机(无操作系统),EABI 接口

本章小结

Linux 内核五大组成:进程管理 / 内存管理 / 文件系统 / 网络协议栈 / 设备驱动

μCLinux = 无MMU + 软实时(不是硬实时!)
Android = 基于Linux内核

实时化:RT-Linux补丁 / PREEMPT-RT补丁

交叉编译器:arm-linux-gcc
  -g 参数 = 加入调试信息(必考!)

真题演练

以下是NCRE三级嵌入式真题中与本节相关的典型考题:

1. 嵌入式Linux中,不属于Linux内核部分的功能是( )。

  • A)用户界面
  • B)内存管理
  • C)网络接口
  • D)进程间通信
答案解析

答:A Linux内核主要由5个子系统组成:进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)、进程间通信(IPC)。用户界面不属于内核部分的功能,它属于用户空间的应用层。


2. 以下关于Linux的叙述,错误的是( )。

  • A)Linux内核第一次问世是在1991年10月
  • B)Linux是一种微内核结构
  • C)同一个应用程序在UNIX环境下的运行速度和效率往往高于Linux环境
  • D)Linux系统最初以Unix为原型,以实现POSIX标准作为其目标
答案解析

答:B Linux属于单内核(宏内核)结构,而非微内核结构。Unix、嵌入式Linux、WinCE、Mac OS、Android OS和DOS操作系统都是典型的单内核操作系统。属于微内核结构的典型嵌入式操作系统有Symbian、VxWorks、QNX、uC/OS-II等。


3. 下面关于Unix与Linux的叙述中,错误的是( )。

  • A)Linux属于一种"类Unix"系统
  • B)Unix是优秀的主流操作系统
  • C)两者的源代码不同,两者的函数名称和参数也各不相同
  • D)Linux的运行效率还没有超过Unix
答案解析

答:C Linux的源代码与Unix的源代码是完全不同的,但尽管如此,两者的函数和命令的功能、处理结果、函数名称和参数十分相同,Unix的行命令、驱动程序和应用程序在Linux上能够运行。C项说"函数名称和参数也各不相同"是错误的。


4. 【填空题】若以S3C2410为核心的目标机上已经移植成功Linux操作系统。若要开发该目标机的Linux应用程序,通常使用arm-linux-_交叉编译器来编译应用程序。若要对一个应用程序进行调试排错,则应该在编译命令中加_参数对它进行编译。

答案

答:gcc;-g 开发ARM平台Linux应用程序通常使用arm-linux-gcc交叉编译器。若要对应用程序进行调试排错,需要在编译命令中加入-g参数,这样编译器会在生成的输出文件中加入GDB能够使用的调试信息。