Featured image of post 什麼是 Qemu?如何使用?

什麼是 Qemu?如何使用?

一款免費開源模擬器

1.1 Let’s start!

Qemu 是一個通用的開源電腦模擬器和虛擬機。它可以模擬各種硬件平台,包括 x86、ARM、PowerPC 等 CPU 架構,也可以運行多種作業系統,如 Linux、Windows、macOS 等。 Qemu 的主要作用包括:

  1. 完整系統仿真:可以在不同硬件架構上模擬整個計算機系統,包括 CPU、內存、硬盤、網卡等硬件設備。這對於跨平台開發、測試新操作系統、探索新硬件架構都很有用。
  2. 作為虛擬機監控程序(hypervisor): Qemu 可以託管客戶操作系統,為其提供虛擬化的硬件環境。這種方式通常性能更好,接近於在物理硬件上運行。
  3. 用戶模式仿真: Qemu 也可以只模擬目標系統的用戶空間,而不模擬完整的系統。這對於移植軟件、跨平台開發很有幫助。
  4. 系統調試和分析:通過QEMU模擬,可以更好地追蹤和理解系統的行為,檢測潛在的 bug。

總的來說, Qemu 作為一個靈活且精確的虛擬化解決方案,被廣泛應用於軟件開發、系統移植、硬件模擬等多個領域。

1.1.0 Toolkit

buildroot
busybox
kernel 5.x
ARMv8 cross compiler

1
2
sudo apt install gcc-aarch64-linux-gnu  #64bit
sudo apt install gcc-arm-linux-gnueabi  #32bit

1.1.1 qemu+kernel Reference

  1. 使用qemu搭建ARM64调试环境,支持文件共享,支持gdb调试
  2. Linux kernel QEMU setup
  3. QEMU运行ARM Linux内核
  4. qemu初步
  5. QEMU学习笔记
  6. https://youtube.com/playlist?list=PLdrYbn8q6soONlL-aEc9b8bKeAtgK0VmB
  7. Buildroot架構解析
  8. 核心編譯_鳥哥
  9. Install and Build QEMU simulator

1.1.2 Linux 開發板資料

1.2 buildroot

使用簡單的方式 (累= =) 1. 2. 3. 4.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sudo apt update
sudo apt update #升級套件
sudo apt install gcc-aarch64-linux-gnu -y  #安裝aarch64 cross compiler
ls /usr/bin/ | grep gcc* #列出安裝gcc

sudo apt install qemu-system -y #安裝qemu
ls /usr/bin/ | grep qemu #列出qemu安裝的架構

mkdir qlinux
cd qlinux
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.117.tar.xz #下載kernel
tar -Jvxf linux-5.15.117.tar.xz

git clone https://github.com/buildroot/buildroot.git    #下載buildroot
cd buildroot
make qemu_arm_vexpress_defconfig #ARM926EJ-S,使用 Versatile Express 配置文件
sudo make

sudo qemu-system-arm -M vexpress-a9 -smp 2 -m 1024 \
-kernel output/images/zImage -dtb output/images/vexpress-v2p-ca9.dtb \
-drive file=output/images/rootfs.ext2,if=sd,format=raw \
-append "console=ttyAMA0,115200 root=/dev/mmcblk0" \
-serial stdio -net nic,model=lan9118 -net user -display none

buildroot login: root
Yocto

1.3 Raspberry pi 3b

Emulating a Raspberry Pi in QEMU
Raspberry Pi 4 emulation with QEMU virt https://pominglee.blogspot.com/p/linux.html
qemu編譯 64-bit Raspberry PI 3B with Qemu in 2023

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
sudo apt update
sudo apt update #升級套件
sudo apt install gcc-aarch64-linux-gnu -y  #安裝aarch64 cross compiler
ls /usr/bin/ | grep gcc* #列出安裝gcc

# sudo apt install qemu-system -y #安裝qemu
# ls /usr/bin/ | grep qemu #列出qemu安裝的架構

git clone https://gitlab.com/qemu-project/qemu.git 
cd qemu 
git submodule init 
git submodule update --recursive 
cd build
sudo ../configure --enable-slirp
sudo make -j
sudo make install

wget https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2022-09-26/2022-09-22-raspios-bullseye-arm64-lite.img.xz
xz -d 2022-09-22-raspios-bullseye-arm64-lite.img.xz
ls -la
fdisk  -l 2022-09-22-raspios-bullseye-arm64-lite.img

sudo mkdir /mnt/image
sudo mount -v -o offset=$((512*8192)) ./2022-09-22-raspios-bullseye-arm64-lite.img /mnt/image/
ls -ls /mnt/image/
cp /mnt/image/bcm2710-rpi-3-b.dtb /mnt/image/kernel8.img ./
sudo touch /mnt/image/ssh
sudo umount /mnt/image
qemu-img resize ./2022-09-22-raspios-bullseye-arm64-lite.img 4G

# qemu-system-aarch64 -machine raspi3b -cpu cortex-a53 -smp 4 -m 1G -kernel kernel8.img -dtb bcm2710-rpi-3-b.dtb -sd 2022-09-22-raspios-bullseye-arm64-lite.img -append "root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4" -usbdevice keyboard -usbdevice mouse -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2022-:22 

qemu-system-aarch64 -machine raspi3b -cpu cortex-a53  -nographic  -smp 4 -m 1G \
-kernel kernel8.img -dtb bcm2710-rpi-3-b.dtb -sd 2022-09-22-raspios-bullseye-arm64-lite.img \
-append "root=/dev/mmcblk0p2 rw rootwait console=ttyAMA0,115200 dwc_otg.lpm_enable=0 rootfstype=ext4" \
-display none -usbdevice keyboard -usbdevice mouse -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2022-:22 

1.4 virtualbox

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <linux/init.h>
#include <linux/module.h>
#include <linux/blkdev.h>
MODULE_LICENSE("Dual BSD/GPL");

#define MY_BLOCK_MAJOR	240
#define MY_BLKDEV_NAME	"my_block"

static __init int my_block_init(void)
{
	int status;
	status = register_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME);
	if (status < 0) {
		 printk(KERN_ERR "unable to register mybdev block device\n");
		 return -EBUSY;
	}
	printk(KERN_INFO "Hello kernel\n");
	return 0;
}

static void __exit my_block_exit(void)
{
	printk(KERN_INFO "Goodbye\n");
	unregister_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME);
}

module_init(my_block_init);
module_exit(my_block_exit);

Licensed under CC BY-NC-SA 4.0
最後更新 Jun 13, 2023 00:00 UTC
網站穩定運行
使用 Hugo 建立 ,   主題 StackJimmy 設計