49、构建实时Linux内核及测量系统延迟

构建实时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
  1. 安装 cyclictest 应用程序和其他所需软件包 :在树莓派设备上安装 cyclictest 应用程序以及 stress 等工具。
  2. 运行测试用例并分析结果 :在系统负载下运行 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系统,并有效地测量和优化系统的延迟性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值