[全网首发] 红米 Note 10 Pro 联发科1100 启用 KVM 运行 QEMU
洛雪_QwQ
编辑于 2022年10月23日 09:13
收录于文集
共42篇

前言:

KVM:既Kernel-based Virtual Machine

你可以叫它linux内核虚拟机

这是一个内核功能 你可以在编译内核的时候将它开启 或者作为一个模块载入内核

有了它 你可以让linux内核变成一个hypervisor

配合QEMU运行硬件虚拟化加速支持的虚拟机

安卓内核是基于linux

这里以arm64架构进行讨论(x86不在本次讨论范围)

我们市边上大部分手机都是arm64架构的

arm64又是一个精简指令集

果想要让kvm工作的话 光靠编译内核开启虚拟化和kvm是不足够的 

首先排除自身CPU以及CPU的OEM厂商对虚拟化的限制

剩下的就涉及到一个新的概念:arm64异常级别(Exception Level 简称为EL)

这里的异常指的是 在精简指令集(RISC)体系结构中 中断或打断程序正常执行的事件 //不理解没关系

arm64有4个异常级别EL0/1/2/3

ARM64处理器在EL0时执行进程

在EL1时执行内核

EL2对应的是虚拟机监控器

EL3对应的是安全监控器

其中arm64架构安全扩展又分为正常世界和安全世界 通过安全监视器EL3(三星的SBOOT貌似是运行在此级别上)进行切换

我们需要注意的是 这里面有个异常级别二(EL2)对应的是虚拟机监控器

而kvm想要正常工作 必须要运行在EL2上  并且kvm是属于内核空间 因此为了方便切换 让内核运行在EL2便是整个安卓kvm成功的关键问题

可是手机厂商对这个异常级别是不开放的(pixel6系列是个意外)

这个地方往往被手机厂商用来执行一些自定义代码

如果这个级别被开放 那么它的权限将高于整个系统

(举一个例子 我们解锁了设备的bootloader 也仅仅是对EL1完全掌控) 

但是凡是都有以外的联发科的天玑 1100 内核直接运行在了EL2上

现在这个设备上的KVM还是残血状态 还有很多问题没有解决

因为寄存器捕获的问题是无法运行windows系统的

只能够运行linux系统

cut-off

开始之前

你应该准备如下东西 

  1. 红米 Note 10 Pro (国行)手机一部 (需要 解锁 \ ROOT \ TWRP)

  2. UP提供的内核文件由 @无念_ 编译

  3. Linux安装镜像

你还更应该注意以下事项

  1. 本教程不讨论任何有关于这样做的意义问题(生命的意义在于折腾) 

  2. 在进行教程时务必做好数据备份

关于kvm运行windows arm64系统

这个目前来说还是没能实现

UP也实测了一下  Windows  boot manager过后不会转圈圈  目前是缺少对一些寄存器的捕获

Android搭建QEMU环境

1.部署chroot debian linux

建议选择debian sid的chroot

Qemu是一个多平台的开源虚拟机

他没有为安卓专门出过apk

但是我们仍然可以运行它

这里我推荐使用termux里面部署一个chroot debian安装QEMU

可以先去参考下UP发的视频教程

网页链接​

2.刷入KVM内核

进入TWRP

刷入KVM内核

内核下载链接( https://olphschool-my.sharepoint.com/:u:/g/personal/a7556_365v_me/ETTH-imS0IZNngDlpusEg2MBIULNXc7WXmnkWZm39-mpAg?e=zl5u8X )

3.安装QEMU

在终端里面输入

apt install qemu-system-aarch64

结束以后输入

qemu-system-aarch64 --version

//检查qemu版本以及是否安装到位

4.KVM调用测试:

输入以下命令:

qemu-system-aarch64 -M virt -cpu host --enable-kvm -monitor stdio -vnc :0

你的面前应该会出现一个QEMU控制台

此时输入info kvm

输出的

kvm support: enable

就调用成功了

5.启动QEMU

设置音频

export PULSE_SERVER=tcp:127.0.0.1:4713  启动命令 qemu-system-aarch64 -machine virt,accel=kvm,gic-version=host -object memory-backend-ram,id='pc.ram&#​39;,size=2048,x-use-canonical-path-for-ramblock-id='off&#​39; -m 2048M -cpu host -smp 4,cores=1,threads=1,sockets=4 -device virtio-gpu-pci,edid=true,max_hostmem=512M,xres=1600,yres=720 -usb -device usb-ehci,id='ehci&#​39;,maxframes='128&#​39; -device usb-tablet -device usb-kbd -enable-kvm -serial stdio -drive if=none,file='虚拟机空白镜像文件&#​39;,id=hd0 -device virtio-blk-device,drive=hd0 -pflash /你的目录/EFI_DEBUG.img -pflash /你的目录/EFI_VARS.img -smbios type='4&#​39;,manufacturer='Intel&#​39;,max-speed='2600&#​39;,current-speed='2600&#​39;,sock_pfx='XBZJ&#​39;,version='QEMU-XBZJ&#​39;,serial='XBZJ&#​39;  -display 'vnc&#​39;="127.0.0.1:0&#​34;,key-delay-ms='0&#​39;,connections='30000&#​39;,to='2&#​39;,lossy='off&#​39;,non-adaptive='off&#​39;,id='video0&#​39;,audiodev='HDA&#​39; -audiodev 'alsa&#​39;,id='HDA&#​39;,in.channels='2&#​39;,in.frequency='44100&#​39;,out.buffer-length='4399&#​39;,in.format='s16&#​39;,in.voices='2&#​39; -device 'intel-hda&#​39; -global intel-hda.multifunction='on&#​39; -global intel-hda.msi='auto&#​39; -device 'hda-duplex&#​39; -global hda-duplex.mixer='true&#​39; -global hda-duplex.use-timer='true&#​39; -global hda-duplex.cad='4294967295&#​39; -global hda-duplex.audiodev='HDA&#​39; -drive if=none,file=/安装盘,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom

如果不出意外就可以去VNC连接

地址 127.0.0.1:0

安装好后关机

去掉后面的光盘命令

启动

qemu-system-aarch64 -machine virt,accel=kvm,gic-version=host -object memory-backend-ram,id='pc.ram&#​39;,size=2048,x-use-canonical-path-for-ramblock-id='off&#​39; -m 2048M -cpu host -smp 4,cores=1,threads=1,sockets=4 -device virtio-gpu-pci,edid=true,max_hostmem=512M,xres=1600,yres=720 -usb -device usb-ehci,id='ehci&#​39;,maxframes='128&#​39; -device usb-tablet -device usb-kbd -enable-kvm -serial stdio -drive if=none,file='虚拟机空白镜像文件&#​39;,id=hd0 -device virtio-blk-device,drive=hd0 -pflash /你的目录/EFI_DEBUG.img -pflash /你的目录/EFI_VARS.img -smbios type='4&#​39;,manufacturer='Intel&#​39;,max-speed='2600&#​39;,current-speed='2600&#​39;,sock_pfx='XBZJ&#​39;,version='QEMU-XBZJ&#​39;,serial='XBZJ&#​39;  -display 'vnc&#​39;="127.0.0.1:0&#​34;,key-delay-ms='0&#​39;,connections='30000&#​39;,to='2&#​39;,lossy='off&#​39;,non-adaptive='off&#​39;,id='video0&#​39;,audiodev='HDA&#​39; -audiodev 'alsa&#​39;,id='HDA&#​39;,in.channels='2&#​39;,in.frequency='44100&#​39;,out.buffer-length='4399&#​39;,in.format='s16&#​39;,in.voices='2&#​39; -device 'intel-hda&#​39; -global intel-hda.multifunction='on&#​39; -global intel-hda.msi='auto&#​39; -device 'hda-duplex&#​39; -global hda-duplex.mixer='true&#​39; -global hda-duplex.use-timer='true&#​39; -global hda-duplex.cad='4294967295&#​39; -global hda-duplex.audiodev='HDA&#​39;

到这里就完事了