构建实时Linux内核及测量系统延迟
在Linux系统中,构建实时内核(RTL)可以让系统具备硬实时能力,满足对时间要求严格的应用场景。本文将详细介绍如何应用RTL补丁、配置和构建RTL内核,以及如何理解和测量系统延迟。
1. 应用RTL补丁
在应用RTL补丁之前,需要确保已经将补丁文件
patch-5.4.69-rt39.patch
解压,并放在
5.4.69
内核源代码树的上一级目录。以下是具体的操作步骤:
1.
进行预检查
:
cd linux-5.4.69
patch -p1 --dry-run < ../patch-5.4.69-rt39.patch
通过
--dry-run
选项进行预检查,确保补丁能够正确应用。检查结束后,可以通过
echo $?
查看返回值,如果返回值为
0
,表示预检查通过。
2.
应用补丁
:
patch -p1 < ../patch-5.4.69-rt39.patch
执行上述命令,正式应用补丁。
除了上述方法,还可以使用
xzcat ../patch-5.4.69-rt39.patch.xz | patch -p1
命令来应用补丁。
2. 配置和构建RTL内核
配置和构建RTL内核的步骤与普通内核基本相同,但需要对内核进行一些特定的配置,以利用RTL的特性。具体步骤如下:
1.
精简内核特性
:
lsmod > /tmp/mylsmod
make LSMOD=/tmp/mylsmod localmodconfig
通过上述命令,将当前系统加载的模块信息保存到
/tmp/mylsmod
文件中,并使用
localmodconfig
选项精简内核特性,使其与当前系统配置相匹配。
2.
启动内核配置界面
:
make menuconfig
在
make menuconfig
界面中,进行以下配置:
- 导航到
General setup
子菜单。
- 滚动到
Preemption Model
子菜单,默认选择的是
Voluntary Kernel Preemption (Desktop)
。
- 按下
Enter
键进入
Preemption Model
子菜单,选择
Fully Preemptible Kernel (Real-Time)
选项,该选项对应内核配置宏
CONFIG_PREEMPT_RT
。
- 保存并退出
menuconfig
界面后,使用以下命令检查是否正确选择了
CONFIG_PREEMPT_RT
:
grep PREEMPT_RT .config
如果输出
CONFIG_PREEMPT_RT=y
,表示配置正确。
3.
构建RTL内核
:
make -j4 && sudo make modules_install install
使用
make -j4
命令并行编译内核,然后使用
sudo make modules_install install
命令安装内核模块和内核。
4.
重启系统并验证内核版本
:
重启系统,在启动时按下
Shift
键显示GRUB菜单,选择新构建的
5.4.69-rtl
RTL内核。登录系统后,使用以下命令验证内核版本:
uname -r
输出应该为
5.4.69-rt39-rtl-llkd1
。
需要注意的是,要实现真正的硬实时,仅仅有硬实时内核是不够的,还需要仔细设计和编写用户空间的应用程序、库和工具,以及内核模块和驱动程序,以符合实时要求。
3. 标准内核与RTL内核的技术差异
以下是标准内核(或主线内核)与RTL内核的一些关键技术差异:
| 组件/特性 | 标准或主线(原生)Linux | RTL(完全可抢占/硬实时Linux) | RT工作是否已合并到主线? |
| — | — | — | — |
| 自旋锁 | 自旋锁临界区是非可抢占的内核代码 | 尽可能可抢占,称为“睡眠自旋锁”,实际上自旋锁已转换为互斥锁 | 否 |
| 中断处理 | 传统上通过上下半部(hardirq/tasklet/softirq)机制处理 | 线程化中断:大多数中断处理在一个内核线程中完成(2.6.30,2009年6月) | 是 |
| 高分辨率定时器(HRTs) | 由于从RTL合并而来,此处可用 | 具有纳秒级分辨率的定时器(2.6.16,2006年3月) | 是 |
| 读写锁 | 无界;写者可能会饥饿 | 公平的读写锁,写者延迟有界 | 否 |
| lockdep | 由于从RTL合并而来,此处可用 | 非常强大的(内核空间)工具,用于检测和证明锁的正确性 | 是 |
| 跟踪 | 由于从RTL合并而来,此处有一些跟踪技术可用 | Ftrace的起源(在一定程度上perf也是)来自RT开发者试图查找延迟问题 | 是 |
| 调度器 | 许多调度器特性由于从RTL合并而来,此处可用 | 实时调度以及截止时间调度类(SCHED_DEADLINE)的工作首先在此处完成(3.14,2014年3月);还有完全无滴答操作(3.10,2013年6月) | 是 |
4. 系统延迟及其测量
在Linux内核中,延迟是指系统对事件做出响应所需的时间。常见的延迟类型包括调度延迟和中断延迟:
-
调度延迟
:指内核调度器唤醒一个用户空间线程(或进程),使其变为可运行状态,到该线程(或进程)实际在处理器上运行所经过的时间。
-
中断延迟
:指硬件中断发生(如网络中断)到其中断处理程序实际开始处理所经过的时间。
cyclictest
是一个用户空间程序,用于测量内核延迟,其输出值以微秒为单位。通常关注的是平均延迟和最大延迟值,如果这些值在系统可接受的范围内,则表示系统正常;否则,可能需要对产品进行重新设计、调整内核配置或检查其他时间关键代码路径。
以下是使用
cyclictest
测量调度延迟的示例:
graph LR
A[cyclictest进程运行] --> B[调用nanosleep或clock_nanosleep系统调用]
B --> C[进程进入睡眠状态]
C --> D[定时器到期,触发硬件中断]
D --> E[中断处理]
E --> F[唤醒cyclictest进程]
F --> G[进程进入运行队列]
G --> H[成为最高优先级任务]
H --> I[执行上下文切换]
I --> J[cyclictest进程在处理器上执行]
测量调度延迟的步骤如下:
1.
设置工作环境
:在树莓派设备上设置工作环境,具体步骤可参考相关文档。
2.
下载和应用RT补丁
:
- 检查树莓派设备上运行的内核版本,例如
5.4.51-v7+
。
- 下载与设备内核版本最接近的RTL补丁,例如
patch-5.4.70-rt40.patch.xz
:
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.70-rt40.patch.xz
- 解压补丁文件,并应用补丁:
cd linux
patch -p1 < ../patch-5.4.70-rt40.patch
- 配置补丁后的内核,开启 `CONFIG_PREEMPT_RT` 内核配置选项:
make ARCH=arm bcm2709_defconfig
make ARCH=arm menuconfig
在
menuconfig
界面中,选择
Fully Preemptible Kernel (Real-Time)
选项。
- 使用适当的工具链编译内核:
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
-
安装
cyclictest应用程序和其他所需软件包 :在树莓派设备上安装cyclictest应用程序以及stress等工具。 -
运行测试用例并分析结果
:在系统负载下运行
cyclictest测试用例,并分析结果,甚至可以绘制图表来辅助分析。
通过以上步骤,你可以构建一个RTL内核,并测量系统的延迟,以确保系统满足实时要求。
构建实时Linux内核及测量系统延迟
5. 树莓派上的具体操作流程
在树莓派上进行实时内核的构建和延迟测量,具体操作流程如下:
5.1 准备工作
-
检查树莓派上运行的内核版本,例如使用命令
uname -r查看。假设当前运行的是5.4.51-v7+内核。 -
下载树莓派特定的内核源代码树,此步骤可参考相关资料。下载完成后,会有一个名为
linux的目录,通过以下命令查看内核的具体版本:
head -n4 linux/Makefile
输出示例如下:
# SPDX-License-Identifier: GPL-2.0
VERSION = 5
PATCHLEVEL = 4
SUBLEVEL = 70
由此可知,内核版本为
5.4.70
。
5.2 获取并应用RTL补丁
-
下载合适的实时(RTL)补丁,选择与设备内核版本最接近的补丁,对于
5.4.70内核,可使用以下命令下载:
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.70-rt40.patch.xz
如果可用的RTL补丁版本与设备内核版本不完全匹配,选择最接近的版本并尝试应用,若不成功,可能需要手动调整代码或更换内核版本。
- 解压补丁文件,并应用补丁:
unxz patch-5.4.70-rt40.patch.xz
cd linux
patch -p1 < ../patch-5.4.70-rt40.patch
5.3 配置内核
- 设置初始内核配置,对于树莓派3[B+],使用以下命令:
make ARCH=arm bcm2709_defconfig
-
自定义内核配置,使用
make ARCH=arm menuconfig命令打开配置界面,在界面中进行如下操作:-
导航到
General setup子菜单。 -
滚动到
Preemption Model子菜单,选择Fully Preemptible Kernel (Real-Time)选项,对应CONFIG_PREEMPT_RT配置宏。 -
保存并退出配置界面后,使用
grep PREEMPT_RT .config命令检查是否正确配置,若输出CONFIG_PREEMPT_RT=y则配置成功。
-
导航到
5.4 编译内核
使用适当的工具链编译内核,假设使用
x86_64-to-ARM32
的工具链,命令如下:
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
6. 安装相关应用程序
在树莓派设备上安装
cyclictest
应用程序以及其他所需软件包,如
stress
工具,可使用以下命令:
sudo apt-get install cyclictest stress
7. 运行测试并分析结果
在系统负载下运行
cyclictest
测试用例,同时使用
stress
工具模拟系统负载,以下是一个简单的测试示例:
stress --cpu 4 --io 4 --vm 2 --vm-bytes 128M &
cyclictest -p 80 -t 4 -n
上述命令中,
stress
命令模拟了CPU、IO和内存的负载,
cyclictest
命令以优先级80运行4个测试线程,并使用
clock_nanosleep
系统调用。
运行测试后,分析
cyclictest
的输出结果,主要关注平均延迟和最大延迟值。可以将测试结果保存到文件中,使用绘图工具(如
gnuplot
)绘制图表,以便更直观地分析延迟情况。
8. 总结
通过以上步骤,我们可以在树莓派等设备上构建一个硬实时的RTL内核,并使用
cyclictest
工具测量系统的延迟。在实际应用中,要实现真正的硬实时系统,不仅需要一个硬实时内核,还需要对用户空间的应用程序、库和工具,以及内核模块和驱动程序进行精心设计和优化,以确保系统的延迟在可接受的范围内。
以下是整个操作流程的总结表格:
| 步骤 | 操作内容 | 命令示例 |
| — | — | — |
| 准备工作 | 检查内核版本,下载内核源代码树 |
uname -r
,参考相关资料下载 |
| 获取并应用补丁 | 下载合适的RTL补丁,解压并应用 |
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.70-rt40.patch.xz
,
unxz patch-5.4.70-rt40.patch.xz
,
patch -p1 < ../patch-5.4.70-rt40.patch
|
| 配置内核 | 设置初始配置,自定义配置 |
make ARCH=arm bcm2709_defconfig
,
make ARCH=arm menuconfig
|
| 编译内核 | 使用工具链编译内核 |
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
|
| 安装应用 | 安装
cyclictest
和
stress
等工具 |
sudo apt-get install cyclictest stress
|
| 运行测试 | 模拟系统负载,运行
cyclictest
测试 |
stress --cpu 4 --io 4 --vm 2 --vm-bytes 128M &
,
cyclictest -p 80 -t 4 -n
|
| 分析结果 | 关注平均和最大延迟值,绘制图表 | 保存输出到文件,使用
gnuplot
绘图 |
graph LR
A[准备工作] --> B[获取并应用补丁]
B --> C[配置内核]
C --> D[编译内核]
D --> E[安装应用]
E --> F[运行测试]
F --> G[分析结果]
通过遵循这些步骤和建议,你可以构建一个满足实时需求的Linux系统,并有效地测量和优化系统的延迟性能。
超级会员免费看
59

被折叠的 条评论
为什么被折叠?



