[全網(wǎng)首發(fā)] 紅米 Note 10 Pro 聯(lián)發(fā)科1100 啟用 KVM 運(yùn)行 QEMU

前言:
KVM:既Kernel-based Virtual Machine
你可以叫它linux內(nèi)核虛擬機(jī)
這是一個(gè)內(nèi)核功能 你可以在編譯內(nèi)核的時(shí)候?qū)⑺_啟 或者作為一個(gè)模塊載入內(nèi)核
有了它 你可以讓linux內(nèi)核變成一個(gè)hypervisor
配合QEMU運(yùn)行硬件虛擬化加速支持的虛擬機(jī)
安卓內(nèi)核是基于linux
這里以arm64架構(gòu)進(jìn)行討論(x86不在本次討論范圍)
我們市邊上大部分手機(jī)都是arm64架構(gòu)的
arm64又是一個(gè)精簡指令集
果想要讓kvm工作的話 光靠編譯內(nèi)核開啟虛擬化和kvm是不足夠的?
首先排除自身CPU以及CPU的OEM廠商對虛擬化的限制
剩下的就涉及到一個(gè)新的概念:arm64異常級別(Exception Level 簡稱為EL)
這里的異常指的是 在精簡指令集(RISC)體系結(jié)構(gòu)中 中斷或打斷程序正常執(zhí)行的事件 //不理解沒關(guān)系
arm64有4個(gè)異常級別EL0/1/2/3

ARM64處理器在EL0時(shí)執(zhí)行進(jìn)程
在EL1時(shí)執(zhí)行內(nèi)核
EL2對應(yīng)的是虛擬機(jī)監(jiān)控器
EL3對應(yīng)的是安全監(jiān)控器
其中arm64架構(gòu)安全擴(kuò)展又分為正常世界和安全世界 通過安全監(jiān)視器EL3(三星的SBOOT貌似是運(yùn)行在此級別上)進(jìn)行切換
我們需要注意的是 這里面有個(gè)異常級別二(EL2)對應(yīng)的是虛擬機(jī)監(jiān)控器
而kvm想要正常工作 必須要運(yùn)行在EL2上? 并且kvm是屬于內(nèi)核空間 因此為了方便切換 讓內(nèi)核運(yùn)行在EL2便是整個(gè)安卓kvm成功的關(guān)鍵問題
可是手機(jī)廠商對這個(gè)異常級別是不開放的(pixel6系列是個(gè)意外)
這個(gè)地方往往被手機(jī)廠商用來執(zhí)行一些自定義代碼
如果這個(gè)級別被開放 那么它的權(quán)限將高于整個(gè)系統(tǒng)
(舉一個(gè)例子 我們解鎖了設(shè)備的bootloader 也僅僅是對EL1完全掌控)?
但是凡是都有以外的聯(lián)發(fā)科的天璣 1100 內(nèi)核直接運(yùn)行在了EL2上
現(xiàn)在這個(gè)設(shè)備上的KVM還是殘血狀態(tài) 還有很多問題沒有解決
因?yàn)榧拇嫫鞑东@的問題是無法運(yùn)行windows系統(tǒng)的
只能夠運(yùn)行l(wèi)inux系統(tǒng)

開始之前
你應(yīng)該準(zhǔn)備如下東西?
紅米 Note 10 Pro?(國行)手機(jī)一部?(需要?解鎖 \ ROOT \ TWRP)
UP提供的內(nèi)核文件由 @無念_?編譯
Linux安裝鏡像
你還更應(yīng)該注意以下事項(xiàng)
本教程不討論任何有關(guān)于這樣做的意義問題(生命的意義在于折騰)?
在進(jìn)行教程時(shí)務(wù)必做好數(shù)據(jù)備份
關(guān)于kvm運(yùn)行windows arm64系統(tǒng)
這個(gè)目前來說還是沒能實(shí)現(xiàn)
UP也實(shí)測了一下? Windows? boot manager過后不會(huì)轉(zhuǎn)圈圈? 目前是缺少對一些寄存器的捕獲
Android搭建QEMU環(huán)境
1.部署chroot debian linux
建議選擇debian sid的chroot
Qemu是一個(gè)多平臺的開源虛擬機(jī)
他沒有為安卓專門出過apk
但是我們?nèi)匀豢梢赃\(yùn)行它
這里我推薦使用termux里面部署一個(gè)chroot debian安裝QEMU
可以先去參考下UP發(fā)的視頻教程
https://www.bilibili.com/video/BV1Qe411j7vB
2.刷入KVM內(nèi)核
進(jìn)入TWRP
刷入KVM內(nèi)核
內(nèi)核下載鏈接( https://olphschool-my.sharepoint.com/:u:/g/personal/a7556_365v_me/ETTH-imS0IZNngDlpusEg2MBIULNXc7WXmnkWZm39-mpAg?e=zl5u8X )



3.安裝QEMU
在終端里面輸入
apt install qemu-system-aarch64
結(jié)束以后輸入
qemu-system-aarch64 --version
//檢查qemu版本以及是否安裝到位
4.KVM調(diào)用測試:
輸入以下命令:
qemu-system-aarch64 -M virt -cpu host --enable-kvm -monitor stdio -vnc :0
你的面前應(yīng)該會(huì)出現(xiàn)一個(gè)QEMU控制臺
此時(shí)輸入info kvm
輸出的
kvm support: enable
就調(diào)用成功了
5.啟動(dòng)QEMU
設(shè)置音頻
export?PULSE_SERVER=tcp:127.0.0.1:4713?
啟動(dòng)命令
qemu-system-aarch64?-machine?virt,accel=kvm,gic-version=host?-object?memory-backend-ram,id='pc.ram',size=2048,x-use-canonical-path-for-ramblock-id='off'?-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',maxframes='128'?-device?usb-tablet?-device?usb-kbd?-enable-kvm?-serial?stdio?-drive?if=none,file='虛擬機(jī)空白鏡像文件',id=hd0?-device?virtio-blk-device,drive=hd0?-pflash?/你的目錄/EFI_DEBUG.img?-pflash?/你的目錄/EFI_VARS.img?-smbios?type='4',manufacturer='Intel',max-speed='2600',current-speed='2600',sock_pfx='XBZJ',version='QEMU-XBZJ',serial='XBZJ'??-display?'vnc'="127.0.0.1:0",key-delay-ms='0',connections='30000',to='2',lossy='off',non-adaptive='off',id='video0',audiodev='HDA'?-audiodev?'alsa',id='HDA',in.channels='2',in.frequency='44100',out.buffer-length='4399',in.format='s16',in.voices='2'?-device?'intel-hda'?-global?intel-hda.multifunction='on'?-global?intel-hda.msi='auto'?-device?'hda-duplex'?-global?hda-duplex.mixer='true'?-global?hda-duplex.use-timer='true'?-global?hda-duplex.cad='4294967295'?-global?hda-duplex.audiodev='HDA'?-drive?if=none,file=/安裝盤,id=cdrom,media=cdrom?-device?virtio-scsi-device?-device?scsi-cd,drive=cdrom
如果不出意外就可以去VNC連接
地址 127.0.0.1:0
安裝好后關(guān)機(jī)
去掉后面的光盤命令



啟動(dòng)
qemu-system-aarch64?-machine?virt,accel=kvm,gic-version=host?-object?memory-backend-ram,id='pc.ram',size=2048,x-use-canonical-path-for-ramblock-id='off'?-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',maxframes='128'?-device?usb-tablet?-device?usb-kbd?-enable-kvm?-serial?stdio?-drive?if=none,file='虛擬機(jī)空白鏡像文件',id=hd0?-device?virtio-blk-device,drive=hd0?-pflash?/你的目錄/EFI_DEBUG.img?-pflash?/你的目錄/EFI_VARS.img?-smbios?type='4',manufacturer='Intel',max-speed='2600',current-speed='2600',sock_pfx='XBZJ',version='QEMU-XBZJ',serial='XBZJ'??-display?'vnc'="127.0.0.1:0",key-delay-ms='0',connections='30000',to='2',lossy='off',non-adaptive='off',id='video0',audiodev='HDA'?-audiodev?'alsa',id='HDA',in.channels='2',in.frequency='44100',out.buffer-length='4399',in.format='s16',in.voices='2'?-device?'intel-hda'?-global?intel-hda.multifunction='on'?-global?intel-hda.msi='auto'?-device?'hda-duplex'?-global?hda-duplex.mixer='true'?-global?hda-duplex.use-timer='true'?-global?hda-duplex.cad='4294967295'?-global?hda-duplex.audiodev='HDA'
到這里就完事了