在QEMU上跑使用Xenomai修饰过的linux系统(实时操作系统)


前言

由于实验室需要编写实时性操作系统,故尝试在qemu上跑打过Xenomai补丁的linux内核。实践时间为2021年11月18日。


以下是本篇文章正文内容

一、各配置环境(重要!)

采用Ubuntu 18.04,qemu-6.1.0,linux-5.4.77,ipipe-core-5.4.77-x86-2.patch,xenomai-v3.1.1,busybox-1.25.0,预估占用共50G,需提前分配好磁盘空间。
ps:
1、使用Ubuntu18.04是因为高版本的Ubuntu用到了glibc 2.31及以上的版本,而构建busybox的时候会用到’stime’库,从glibc2.3.1开始不再支持stime。
2、一定要注意linux内核和ipipe补丁的版本对应,X.Y.Z三个数字都必须相同,否则可能会失败。

二、QEMU

2.1 下载qemu源码

官方网站:https://download.qemu.org/
wget https://download.qemu.org/qemu-6.1.0.tar.bz2
下载稳定版本 6.1.0
ps:RC版本是发行候选版本

2.2 编译并安装

首先装好需要的依赖 sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv
sudo apt install ninja-build flex bison

解压 tar xvJf qemu-6.1.0.tar.bz2
进入到qemu目录下cd qemu-6.1.0
编译并安装
./configure
make
make install
之后可以通过which qemu-system-x86_64来查看是否安装成功(如图)
在这里插入图片描述

三、linux内核、Xenomai及ipipe补丁下载及编译

参考https://zhuanlan.zhihu.com/p/409685505

3.1 下载

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.77.tar.xz
wget https://xenomai.org/downloads/ipipe/v5.x/x86/ipipe-core-5.4.77-x86-2.patch
wget https://source.denx.de/Xenomai/xenomai/-/archive/v3.1.1/xenomai-v3.1.1.tar.bz2

3.2 解压并打补丁

tar -Jxf linux-5.4.77.tar.xz
tar -jxf xenomai-v3.1.1.tar.bz2
./xenomai-v3.1.1/scripts/prepare-kernel.sh --linux=./linux-5.4.77/ --ipipe=./ipipe-core-5.4.77-x86-2.patch --arch=x86_64

3.3 配置内核参数

cd linux-5.4.77/
make ARCH=x86_64 menuconfig
使用图形化配置内核参数(如下图),消除掉Xenomai/cobalt项的所有Warning(注:单击n或y可配置,修改完成后直接EXIT便可保存)
在这里插入图片描述

3.4 编译

前几年的博客中有提到使用kpkg来编译,但经笔者尝试后发现失败,查阅资料发现应该是kernel-package包不再支持下载的问题,还没有找到如何解决,所以采取下面的方法:

先做两处文件修改:在 linux-5.4.77/arch/x86/kernel/process.h 里加上对 linux-5.4.77/arch/x86/kernel/ipipe.c 里定义的一个函数的声明:
void __ipipe_halt_root(int use_mwait);
之后在 linux-5.4.77/.config 中将
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
的双引号里的内容删除。

随后编译
make -j 4 vmlinux modules bzImage

一段时间之后应该会报错
ERROR: "__ipipe_dispatch_irq" [drivers/pinctrl/intel/pinctrl-intel.ko] undefined!

只需删除文件夹 linux-5.4.77/drivers/pinctrl/intel
并去掉 linux-5.4.77/drivers/pinctrl/Makefile 中如下的一行obj-$(CONFIG_X86) += intel/
之后再次编译即可。

之后需要进行安装
首先在xeno文件夹下生成configure:./scripts/bootstrap
之后可以创建一个build文件夹,在build文件夹下./configure --with-core=mercury --enable-smp --enable-pshared
随后make install即可(如果要在qemu上跑,要注意使用DESTDIR安装到后面创建的文件系统中)

四、buxybox编译并创建文件系统

4.1 下载

使用busybox-1.25.0版本,下载地址 https://busybox.net/downloads/

4.2 编译

cd busybox-1.25.0
make defconfig
make menuconfig
在menuconfig中修改配置,使用静态编译busybox。
在这里插入图片描述
之后进行编译
make -j4
make install
此时可以在 busybox-1.25.0 目录下,看到_install目录,可通过下面的命令来验证是否安装成功:
./busybox ls

4.3 创建文件系统

4.3.1 首先将上一步生成的_install文件夹复制到其他位置

cd ..
mkdir ramdisk
cd ramdisk
cp -r ../busy-1.25.0/_install/* .

4.3.2 设置初始化进程init

cd ramdisk
ln -s bin/busybox init

4.3.3 设置开机启动程序(inittab)

首先设定一些所需要的文件夹
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
init程序首先会访问etc/inittab文件,因此,我们需要编写inittab,指定开机需要启动的所有程序。
cd etc
vim inittab

inttab内容如下

::sysinit:/etc/init.d/rcS   
::askfirst:-/bin/sh    
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

之后赋予其可执行的权限
chmod +x inttab

4.3.4 编写系统初始化命令(rcS)

从inittab文件中可以看出,首先执行的是/etc/init.d/rcS脚本,因此,我们生成初始化脚本
mkdir init.d
cd init.d
vim rcS

rcS文件内容如下


#!/bin/sh

mount proc
mount -o remount,rw /
mount -a    
clear                               
echo "My Tiny Linux Start :D ......"

赋予可执行权限
chmod +x rcS

4.3.5 编写fstab文件

在rcS脚本中,mount -a 是自动挂载 /etc/fstab 里面的东西,可以理解为挂在文件系统,因此我们还需要编写 fstab文件来设置我们的文件系统。
cd ramdisk/etc/
vim fstab

fstab内容如下


# /etc/fstab


proc            /proc        proc    defaults          0       0

sysfs           /sys         sysfs   defaults          0       0

devtmpfs        /dev         devtmpfs  defaults          0       0

4.3.6 生成镜像

至此,我们已经完成了RAM Disk中相关文件的配置,可以压缩生成文件镜像了。
cd ramdisk
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.img
最后生成的initramfs.img就是我们的根文件系统。

五、最终效果

在完成了qemu、linux内核补丁、文件系统的配置后,终于可以来测试我们的内核啦
运行如下命令:
qemu-system-x86_64 -kernel linux-5.4.77/arch/x86_64/boot/bzImage -initrd ../initramfs.img
如果能弹出QEMU界面,显示如下信息说明成功:
在这里插入图片描述

也可以将qemu监视器中的内容重定向到terminal中:
qemu-system-x86_64 -kernel ./linux-5.4.77/arch/x86_64/boot/bzImage -initrd ./initramfs.img -m 4096 -nographic -smp 4 -append "console=tty0 console=ttyS0,115200n8 edd=off nokaslr"

从QEMU退出可以用poweroff
ps :可能会出现输入这行命令后,只显示 VNC server running on 127.0.0.1:5900而不显示图形界面的问题
解决方法:安装SDL图形库
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
之后,重新进入qemu目录下重新编译:
./configure --enable-debug --target-list=x86_64-softmmu
make
make install

参考资料

1、https://blog.csdn.net/o_alpha/article/details/113487031?spm=1001.2014.3001.5501
2、https://zhuanlan.zhihu.com/p/409685505
3、https://blog.csdn.net/jasonLee_lijiaqi/article/details/80967912

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值