一、查看当前Linux内核版本
uname -r
本次测试使用的环境
1、虚拟机VirtualBox 7.0.6
2、Ubuntu18.04.2,内核版本是5.4.0-150
注意:后面的指令都是在root账户下输入的,如果在home下,几乎所有命令都加sudo
二、内核和补丁下载
下载相近版本内核
内核下载网站:https://mirrors.edge.kernel.org/pub/linux/kernel/
(网站打开后,目录是按字母排序,需要下拉到Linux开头的地方找想要的内核)
下载与内核版本一致的补丁
补丁下载网站: https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
本次测试选了5.4.10版本的内核,5.4.10-rt5版本的实时补丁
三、安装依赖库
网上的资料对于依赖库的内容略有区别,但经测试,安装下面这些是够用的
apt-get -y update
apt-get install patch
apt-get install build-essential make gcc libncurses-dev libssl-dev libc6-dev libelf-dev bison dwarves zstd flex
四、配置Linux内核
4.1、在/usr/src/下新建一个文件夹,可命名为rt_linux_preempt
将两个压缩包复制到该文件下,解压缩
下面是官方文件提供的解压方法(应该是针对.xz压缩包)
$ xz -cd linux-4.4.12.tar.xz | tar xvf -
$ cd linux-4.4.12
$ xzcat ../patch-4.4.12-rt19.patch.xz | patch -p1
本次测试使用的是.gz压缩包。对于.gz压缩包,可使用下面的解压缩方法
tar -vxzf linux-x.x.x.tar.gz
gunzip -d patch-x.x.x-rtx.patch.gz // 这个命令执行完后,原patch压缩包会自动删除
将解压出来的.patch文件移动(或复制)到解压出来的linux-x.x.x文件夹中
在linux-x.x.x文件夹中查看.patch 的权限,将文件的权限修改一下
chmod 777 patch-x.x.x-rtx.patch
给linux内核配置RT patch:(打Patch)
patch -p1 < patch-x.x.x-rtx.patch
4.2、执行一次make clean,确保文件夹下没有旧的make后生成的文件
4.3、将原内核配置文件复制到linux-x.x.x文件夹下
cp -v /boot/config-$(uname -r) .config
4.4、配置内核
make menuconfig
图形符号界面出来后,执行以下操作
1、“General setup” -> “Preemption Model” -> 选择 “Fully Preemptible Kernel(Real-Time)”
2、“Device Drivers” -> 去掉"Staging drivers"(按空格,或者按n)
3、“Processor type and features” -> “Timer frequency” -> 选择"1000Hz "
4、General setup -> Timers subsystem,选中“High resolution timer support” // 使用高精度Timer, 可以提高RTLinux实时性
5、保存并退出
说明:
1、以上修改项可以全部修改完后一起保存,也可以修改一项保存一项。
2、界面显示,需要终端窗口最大化。如果是虚拟机,虚拟机的窗口也要最大化,否则会显示失败。
4.5、编辑.config文件
删除或注释.config文件中CONFIG_SYSTEM_TRUSTED_KEYS与CONFIG_SYSTEM_REVOCATION_KEYS的配置参数
说明:
1、建议选择删除目标变量的配置参数的方法;如果选择注释掉,后面make的时候会出现一些额外的提示;
2、.config文件中可能不存在CONFIG_SYSTEM_REVOCATION_xxx这类变量;
3、有的资料还建议注释掉CONFIG_MODULE_SIG_ALL、CONFIG_MODULE_SIG_KEY等,经测试最好别动,否则后面make的时候会出现额外的提示,需要分析然后决定怎么操作。
五、编译RTLinux内核(-jn表示n线程编译,n根据分配的处理器数量)
在内核源码目录下,执行make编译
make -j8
Two thousand years Later。。。(根据电脑性能而定,本次测试大概1小时左右)
make结束后,执行
make modules_install
make install
两个指令运行结束,并没有报错,说明安装成功
说明:
1、经测试,两条指令没有先后顺序;
2、make modules_install后面的-jn可有可无。
六、制作initramfs启动引导:
需要制作initramfs 才能引导RTlinux 内核启动
cd /boot
在/boot目录下:执行
mkinitramfs -k -o initrd.img-x.x.x-rtx x.x.x-rtx # 版本号是实际用到的版本
七 重启
正确完成后,执行reboot,重启
重启后,执行uname -r,看输出结果是否为下x.x.x-rtx
参考连接中提到了,重启后会出现内核选择界面,以及提供了若没出现,该怎么修改等内容,
实际测试中,
1、并没有会跳出选择界面,会直接启动加了实时补丁的内核(应该是.gurb文件中,GRUB_DEFAULT=0的原因,且加了实时补丁的内核刚好在列表的第一个)
2、如果按照博文中说的方法修改,不仅没有跳出界面,默认启动的内核也变成了没加实时补丁的(GRUB_DEFAULT=0改成了GRUB_DEFAULT=“1>2” %1代表默认启动内核,2代表所启动内核位于列表中第2个(序号从0开始))
要根据实际情况进行分析操作
八,实时性测试
8.1、安装rt-test
sudo apt-get install rt-tests
8.2.运行测试(4个线程,线程优先级80,以ns显示时间)
sudo cyclictest -t 4 -p 80 -N # -N 是纳秒显示; -n 是微妙显示
说明:
1、在虚拟机上面运行,实时性测试效果可能很差,如果用真机测试,这些延时等参数会好很多,一般的AVG在1-5us左右
2、测试中,用纳秒显示时,会显示出一个值很大的负数,具体原因还没查出
参考:
硬实时RTLinux?为Linux打实时preempt_rt补丁