Xenomai 4是一种双内核架构, 继承了Xenomai系列的特点,通过在Linux内核中嵌入一个辅助核心(companion core),来提供实时能力。这个辅助核心专门处理那些需要极低且有界响应时间的任务。
本文将在官网教程(https://evlproject.org/core/build-steps/)的基础上, 更详细地介绍如何编译和构建双内核 Xenomai 4.
概述
我是在vmware 的ubuntu 24.04的虚拟机上安装该内核的, 别的版本没测试过, 22.04 应该也行. 再之前的版本可能构建工具链太老, 会出现一些问题.
- vmware workstation pro 17
- ubuntu 24.04 (8核, 8G内存, 80G硬盘)
这里需要注意的是需要保证硬盘空间大于50G, 之前设置为40G时,编译到一半空间不足.
安装该双内核架构, 大体上分为两个步骤, 一个是常规的编译内核的部分, 这个步骤和编译其他的linux内核差不多. 另一个是编译libevl这个库,用来测试双内核是否安装成功.
0. 前置依赖软件
大体上是这些, 如果哪里有报错缺什么包, 再补充.
sudo apt update
sudo apt install cmake make git flex bison libncurses5-dev gcc exuberant-ctags bc libssl-dev meson ninja-build libelf-dev libbpf-dev
1. 编译内核
获取内核源码
git clone https://git.xenomai.org/xenomai4/linux-evl.git
禁用两个config, 以防后面make 报错 (来源于:https://askubuntu.com/questions/1329538/compiling-kernel-5-11-11-and-later)
cd linux-evl
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
然后设置开启evl-core,
make menuconfig
选择`Processor type and features
选中 EVL real-time core
然后选择save 后退出, 开始make, 需要注意的是make -j 会把所有核都拿去编译, 造成系统卡死, make一半就退出了, 建议留几个核, 比如:
make -j4
然后等待一段时间后, 安装内核
sudo make modules_install install
更新grub, 这样可以在开机时按shift+tab或者shift 进入boot, 选择新的双内核启动
sudo update-grub2
至此, 带有evl功能的内核就安装好了.
2. 编译libevl
获取libevl
git clone https://git.xenomai.org/xenomai4/libevl.git
使用meson一套来进行编译:
mkdir libevl_build
# meson setup -Duapi=[刚刚安装的内核源码目录] $builddir $srcdir
meson setup -Duapi=./linux-evl ./libevl_build ./libevl
cd libevl_build
meson compile
ninja install
由于默认把libevl 动态库安装到了/usr/local/lib/x86_64-linux-gnu/
目录下, 我们需要做些额外工作来让evl 能找到这个共享库
所以需要做如下操作:
sudo vim /etc/ld.so.conf.d/custom_libs.conf
将下面这行添加到/etc/ld.so.conf.d/custom_libs.conf
里
/usr/local/lib/x86_64-linux-gnu/
然后保存退出,再执行如下命令:
sudo ldconfig
3. 验证evl core的安装
重启虚拟机, 在开启时进入boot (按shift),选择内核linux 6.11 进入
运行命令 sudo evl test
,如果出现如下结果说明安装成功了.
中间可能会出现这样的错误, 但是官网(https://evlproject.org/core/testing/)说是正常的,不用紧张.
../libevl/tests/sched-quota-accuracy.c:213: FAILED: evl_control_sched(44, &p, &q, test_cpu) (=Operation not supported)
sched-quota-accuracy: no kernel support
../libevl/tests/sched-tp-accuracy.c:222: FAILED: evl_control_sched(45, p, ((void *)0), test_cpu) (=Operation not supported)
sched-tp-accuracy: no kernel support
../libevl/tests/sched-tp-overrun.c:220: FAILED: evl_control_sched(45, p, ((void *)0), test_cpu) (=Operation not supported)
参考链接:
- https://evlproject.org/core/