前言
为了方便编译和运行linux,搭建一个用于学习linux的QEMU环境。
环境:
处理器架构:arm64
内核源码:linux-rt-5.15
ubuntu版本:ubuntu18
代码阅读工具:vim+cscope
交叉编译工具链的安装
$ sudo apt-get install gcc-aarch64-linux-gnu
$ aarch64-linux-gnu-gcc -v
QEMU的安装
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
wget https://download.qemu.org/qemu-4.2.1.tar.xz
tar xvJf qemu-4.2.1.tar.xz
cd qemu-4.2.1
./configure --target-list=x86_64-softmmu,x86_64-linux-user,arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-kvm --enable-virtfs
make
sudo make install
如果出现:
error: VirtFS rlibattr develequires libcap devel and
可运用apt-get build-dep qemu去装置一切的依靠库
如提示sources.list相关问题,则更换源:
ubuntu18.04更换国内源:
a. 备份/etc/apt/sources.list文件
sudo mv /etc/apt/sources.list/etc/apt/sourses.list.backup
b. 新建/etc/apt/sources.list文件
sudo vi /etc/apt/sources.list
c. 输入以下内容(阿里源)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
d.
sudo apt-get update
编译完成之后,qemu在 /usr/local/bin目录下
/usr/local/bin/qemu-system-aarch64 -version
QEMU emulator version 4.2.1
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
根文件系统制作
可参考引用的文章,记住改了根文件系统的内容,要重新编译Image。
比如chmod a+x rcS 、sudo mknod console c 5 1等操作。
制作好的根文件系统
内核源码的编译
下载linux-rt源码
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git/
放置根文件系统到源码目录
cd linux-rt-5.15
sudo cp ../../busybox-1.31.1/_install _install_arm64 -a
配置defconfig
添加hotplug支持:
+CONFIG_UEVENT_HELPER=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
添加initramfs的支持:
+CONFIG_INITRAMFS_SOURCE="_install_arm64"
编译
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
make Image -j8
运行qemu模拟器
创建共享目录,用于主机和qemu运行的系统进行共享文件
mkdir kmodules
运行
qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt \
-m 1024 -smp 4 -kernel arch/arm64/boot/Image --append "rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8" -nographic \
--fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none \
-device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount
其中:-cpu指定了模拟的cpu为 cortex-a57,-m 1024 指定内存大小为1G, -smp 4指定模拟的系统为4核处理器 ,-kernel指定启动的内核镜像, --append指定传递的命令行参数,后面的选项指定共享目录已经使用的9P协议
内核模块测试
前面已经支持了主机和qemu上的系统共享目录,这个目录就是kmodules目录:通过mount可以查看被挂载到了qemu上的系统的/mnt目录下
Makefile文件:
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
KERNEL_DIR ?= /home/hou/linux_rt/linux-rt-5.15
obj-m := module_test.o
modules:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
install:
cp *.ko $(KERNEL_DIR)/kmodules
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init module_test_init(void)
{
printk("module_test_init\n");
return 0;
}
static void __exit module_test_exit(void)
{
printk("module_test_exit\n");
}
module_init(module_test_init);
module_exit(module_test_exit);
MODULE_LICENSE("GPL");
编译拷贝:
$ make modules
$ make install
到QEMU的内核系统中,进入/mnt目录下:执行模块的插入/移除命令:
insmod module_test.ko
lsmod
rmmod module_test
应用测试
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello World, QEMU!!!\n");
return 0;
}
编译拷贝执行:
aarch64-linux-gnu-gcc test.c -o test
cp test ../../kmodules/
./test
后续就可以使用这套QEMU环境来学习内核原理和常见的稳定性问题。