当前位置: 首页 > news >正文

QEMU环境搭建

QEMU环境搭建

  • 前言
  • 交叉编译工具链的安装
  • QEMU的安装
  • 根文件系统制作
  • 内核源码的编译
  • 运行qemu模拟器
  • 内核模块测试
  • 应用测试

前言

为了方便编译和运行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环境来学习内核原理和常见的稳定性问题。

参考: 使用QEMU搭建ARM64实验环境

相关文章:

  • idea2023版使用Free MyBatis plugin插件报错
  • MySQL里面的日期字符串如何转成日期做比较运算,获取两个日期之间的所有日期(包括起始日期)
  • 2848. 与车相交的点(24.9.19)
  • libwebsockets之日志系统
  • opencv羊群计数,动态目标检测跟踪
  • 简单好用的OCR API
  • mysql数据库优化及sql调优,Java后端社招面试经历
  • Premiere情侣恋爱记录照片展示爱情相册视频模板
  • Java实战:Spring Boot集成MongoDB
  • (二十三)Flask之高频面试点
  • 为什么ChatGPT预训练能非常好地捕捉语言的普遍特征和模式
  • SpringCache缓存专题
  • SetWindowLongPtr之GWLP_USERDATA
  • 华为OD机试真题 Python 实现【去除多余空格】【2022.11 Q4 新题】
  • LeetCode 8. 字符串转换整数 (atoi)(C++)
  • 作为程序员的你,常用的软件有哪些?
  • 当谈论 React hook,我们究竟说的是什么?
  • RocketMQ疑难杂症之No route info of this topic解决方案
  • 国产CAE的涅槃-岩土行业高性能离散元软件MatDEM
  • 我国登山鞋行业参与者越发广泛带来广阔潜在需求 女性市场值得期待
  • Go语言 Gin处理响应
  • 消除视觉Transformer与卷积神经网络在小数据集上的差距
  • SpringBoot Disruptor框架遇到的问题
  • 思维方式之概率思维
  • 小结 | 逻辑回归
  • 第二证券|两大板块掀涨停潮,有个股猛拉20cm!这只港股复牌一度暴跌
  • 【我亲身经历的2022年软件质量工作】
  • [leetcode 315] 计算右侧小于当前元素的个数
  • ESP32中micro-ROS与ROS2通信(点亮esp32指示灯)
  • Shell ❀ 条件测试语句
  • Transforming the Latent Space of StyleGAN for Real Face Editing翻译
  • 导入shp数据到postgis库