通过 qemu 在 x86 上实现全系统模拟 PowerPC

某软件开发过程中,需要参考 PowerPC 架构代码,但并没有 ppc 架构的机器环境,VMware 只能模拟同架构的 OS,而想要模拟不同架构,进行跨架构开发的话只能通过 qemu 进行模拟。本文记录了在 Linux 和 Windows 两种环境下实现过程:在 Windows 通过 VMware 建立 Ubuntu18.04 虚拟机,然后在 Ubuntu18.04 下用 qemu 实现全系统模拟 PowerPC;或者直接在 Windows 下用 win-64bits 的 qemu 来实现,两种方法都可行。

Ubuntu18.04 搭建过程

安装 qemu

1
sudo apt-get install qemu

下载 ppc 镜像

Ubuntu16.04.6 之后的版本不再支持 ppc 架构,这里使用最后一个发行版 ubuntu-16.04.6-server-powerpc.iso,下载地址:
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/releases/16.04/release/ubuntu-16.04.6-server-powerpc.iso

生成硬盘镜像

1
qemu-img create -f qcow2 ubuntu16.qcow2 60G

安装系统

1
qemu-system-ppc -L pc-bios -boot d -M mac99 -m 1024 -net nic,model=sungem -net user -hda ubuntu16.qcow2 -cdrom ubuntu-16.04.6-server-powerpc.iso

开始运行

1
qemu-system-ppc -L pc-bios -boot c -prom-env "boot-device=hd:,\yaboot" -prom-env "boot-args=conf=hd:,\yaboot.conf" -M mac99 -m 1024 -net nic,model=sungem -net user -hda ubuntu16.qcow2 -g 1024x768x32

效果图

image-20230519231357094

image-20230519232612089

Windows10 搭建过程

安装 qemu

qemu 官网已经支持 Windows,并提供了二进制工具集,直接下载二进制使用最为方面。QEMU Binaries for Windows (64 bit) 下载地址:
https://qemu.weilnetz.de/w64/

方法一:复制 Linux 硬盘镜像

如果已经在 Ubuntu Linux 环境下成功安装了 ppc 系统,可以直接把 ubuntu16.qcow2 镜像文件复制到 Windows 环境下使用。

进入 qemu 二进制存放目录,在 Windows 命令行下运行:

1
.\qemu-system-ppc.exe -L pc-bios -boot c -prom-env "boot-device=hd:,\yaboot" -prom-env "boot-args=conf=hd:,\yaboot.conf" -M mac99 -m 1024 -net nic,model=sungem -net user -hda ubuntu16.qcow2 -g 1024x768x32

方法二:参照 Ubuntu 搭建过程从零开始

Windows 环境搭建过程和 Ubuntu 搭建方法一样,只是记得把命令中的 qemu-system-ppc 换成.\qemu-system-ppc.exe

三步走:

  1. 生成硬盘镜像
1
.\qemu-img.exe create -f qcow2 ubuntu16.qcow2 60G
  1. 安装系统
1
.\qemu-system-ppc.exe -L pc-bios -boot d -M mac99 -m 1024 -net nic,model=sungem -net user -hda ubuntu16.qcow2 -cdrom ubuntu-16.04.6-server-powerpc.iso
  1. 开始运行
1
.\qemu-system-ppc.exe -L pc-bios -boot c -prom-env "boot-device=hd:,\yaboot" -prom-env "boot-args=conf=hd:,\yaboot.conf" -M mac99 -m 1024 -net nic,model=sungem -net user -hda ubuntu16.qcow2 -g 1024x768x32

效果图

image-20230519230101675

image-20230519231054400

参考资料

一开始查阅的中文教程,实操过程中出现各种问题,然后 google 上用英文搜索后,发现了一些英文靠谱的教程,一试便成功了。参考的是 GitHub 上 ross-newman 大佬给出的方法:

https://gist.github.com/ross-newman/a744988b298ea1ad47c5dae1baafcb22

Building PPC Linux code using QEMU on Ubuntu 18.04 LTS:

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
#!/bin/bash
echo "Building Debina 10 QEMU instance..."
wget https://cdimage.debian.org/cdimage/ports/10.0/powerpc/iso-cd/debian-10.0-powerpc-NETINST-1.iso
sudo apt install qemu
# Create new disk for install
qemu-img create -f qcow2 debian10.qcow2 2000M
# Boot the install image
qemu-system-ppc -L pc-bios -boot d -M mac99 -m 1024 -net nic,model=sungem -net user -hda debian10.qcow2 -cdrom ./debian-10.0-powerpc-NETINST-1.iso -g 1024x768x8
# Run the image
qemu-system-ppc -L pc-bios -boot c -prom-env "boot-device=hd:,\yaboot" -prom-env "boot-args=conf=hd:,\yaboot.conf" \
-M mac99 -m 1024 -net nic,model=sungem -net user -hda debian10.qcow2 -g 1024x768x32

echo "Building lUbuntu 16.04 QEMU instance..."
#wget http://cdimage.ubuntu.com/releases/14.04/release/ubuntu-14.04.6-server-powerpc.iso
wget http://cdimage.ubuntu.com/lubuntu/releases/16.04.1/release/lubuntu-16.04-desktop-powerpc.iso
qemu-img create -f qcow2 lubuntu14.qcow2 2000M
qemu-system-ppc -L pc-bios -boot d -M mac99 -m 1024 -net nic,model=sungem -net user -hda lubuntu14.qcow2 -cdrom lubuntu-14.04.5-desktop-powerpc.iso
qemu-system-ppc -L pc-bios -boot c -prom-env "boot-device=hd:,\yaboot" -prom-env "boot-args=conf=hd:,\yaboot.conf" -M mac99 -m 1024 -net nic,model=sungem -net user -hda lubuntu14.qcow2 -cdrom lubuntu-14.04.5-desktop-powerpc.iso

#Building u-boot for PPC
echo "Building U-Boot for QEMU..."
sudo apt install gcc-powerpc-linux-gnu
git clone https://git.denx.de/u-boot.git
make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- qemu-ppce500_defconfig
make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu-
#qemu-system-ppc -machine help
#qemu-system-ppc -cpu help
qemu-system-ppc -M ppce500 -m 1024 -nographic -kernel ./u-boot