目录
前言
由于实验室需要编写实时性操作系统,故尝试在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.youkuaiyun.com/o_alpha/article/details/113487031?spm=1001.2014.3001.5501
2、https://zhuanlan.zhihu.com/p/409685505
3、https://blog.youkuaiyun.com/jasonLee_lijiaqi/article/details/80967912