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能够使用的调试信息。