Ubuntu系统实时内核编译教程
一、简介
RTOS
RTOS(实时性操作系统),指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。
根据实际应用,可以选择采用硬实时操作系统或软实时操作系统。
- 硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。
- 软实时系统就是那些从统计的角度来说,一个任务能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误。
Linux系统并不算是一个RTOS系统,其实时处理能力不强,但是我们可以通过加入PREEMTP_RT补丁的方式,实现硬实时需求。
二、下载内核源码加入补丁
- 创建存放文件夹
mkdir kernel
cd kernel
- 下载内核源码和补丁
内核下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
补丁下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/
- 安装下载依赖项
sudo apt-get install libncurses-dev
- 加入补丁
#解压内核
tar -xzvf linux-5.6.19.tar.gz
#解压补丁
gunzip patch-5.6.19-rt12.patch.gz
cd linux-5.6.19/
#打补丁
patch -p1 < ../patch-5.6.19-rt12.patch
Tip:补丁和内核的版本需严格对应!!
三、内核配置
- 打开内核配置界面
make menuconfig
- 选择General setup
- 选Preemption Model (Voluntary Kernel Preemption (Desktop))
-
选择内核抢占模型
选Fully Preemptible Kernel (RT)
其中:
Preemptible Kernel (Basic RT): 这种抢占模型类似于“抢占内核(低延迟桌面)”模型。除了上面提到的属性外,线程中断处理程序是强制的(就像使用内核命令行参数时一样threadirqs)。该模型主要用于 PREEMPT_RT 补丁实现的替代机制的测试和调试。
Fully Preemptible Kernel (Real-Time): 除了少数选定的关键部分之外,所有内核代码都是可抢占的。线程中断处理程序是强制的。此外,还实现了几种替代机制,如睡眠自旋锁和 rt_mutex,以减少抢占禁用部分。此外,大的抢占禁用部分被单独的锁定结构取代。必须选择这种抢占模型以获得硬实时行为。
按esc键返回至主页面
- 选Kernel hacking
-
选Memory Debugging
-
按下‘/’搜索DEBUG_INFO
选择OK,按下回车键
- 按下’1’
- 在Compile the kernel with debug info选项上按下‘n’,取消编译时产生debug文件
四、编译内核
- 编译并安装内核
#阻止编译产debug文件
CONFIG_DEBUG_INFO=n
#编译并打包
make -j6 && make -j6 bindeb-pkg
在文件夹中会生成相应的deb包,强烈建议进行备份,在其他设备上则无需再次编译
- 安装内核
sudo dpkg -i linux-*.deb
这一步可能会报错:
(1) dpkg: 处理软件包 linux-libc-dev:amd64 (–install)时出错: 现在尚不能配置软件
解决方法:
// 现将info文件夹更名
sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old
// 再新建一个新的info文件夹
sudo mkdir /var/lib/dpkg/info
sudo apt-get update
sudo apt-get -f install
// 执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下
sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old
// 把自己新建的info文件夹删掉
sudo rm -rf /var/lib/dpkg/info
// 把以前的info文件夹重新改回名字
sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info
(2) 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list”错误
解决方法:
在下载的内核文件找到.config文件,Ctrl+F搜索 CONFIG_SYSTEM_TRUSTED,并将对应的两行删除
五、安装内核
- 安装deb内核软件包
sudo dpkg -i linux-*.deb
- 更新grub并重启
sudo update-grub
sudo reboot
- 查看内核版本
uname -a
可能出现情况:
重启时可能出现进入不了系统的情况,提示:has invalid signature , you need to load the kernel first
解决方法:
重启进入bios界面,关闭secure boot
六、测试实时性
- 安装依赖
sudo apt install rt-tests stress gnuplot
- 下载测试源码
git clone https://gitee.com/rosens_admin/Real-Time-Test
- 运行测试
sudo ./rt-test.sh
等待测试完成,测试结果会生成图片放在测试脚本所在文件
安装实时补丁前后的对比,可以明显看出安装补丁后实时性有了极大的提升。