Windows 10 ARM64 实战

您所在的位置:网站首页 模拟arm64 Windows 10 ARM64 实战

Windows 10 ARM64 实战

2023-03-24 04:54| 来源: 网络整理| 查看: 265

本文章在知乎 和 BetaWorld 社区 同步发布。

最近 Windows 10 登录高通骁龙 835/845 平台的新闻闹得沸沸扬扬的,如果你好奇 Windows 10 在 ARM 平台的运行状况,或者想知道所谓的 x86 模拟器到底能不能运行某些软件,现在你就可以在 QEMU 上模拟运行 ARM 上的 Windows 了!

当然你要有足够足够足够的耐心...毕竟 QEMU 是异构模拟,而且固件也不完善,性能相当糟糕(装系统能装一下午的那种糟糕),仅供蛋疼无聊的 geek 尝试!

准备工具QEMU 2.11.0-rc1 或以后的版本,Windows 二进制下载Linaro UEFI Release 17.08低版本有 bug,启动会蓝屏高版本去掉了启动 Windows 需要的 Legacy VGA 支持USB Mass Storage DXE 驱动请使用其中的 USBMassStorageDxe_arm64.efi目前由于各种各样的问题,只能从 USB 设备启动 Windows,也就是 Windows to GoAHCI、SCSI、NVMe 磁盘目前都不支持由于 Linaro UEFI 里面没有带这个驱动,所以需要手动加载或者将这个模块插入到 UEFI 固件中Windows 10 ARM64 版本v1709 Build 16299 和当前最新的 Insider Build 17074 均测试通过虽然现在 Always Connected PC 上预装的是 Windows 10 S但是完全可以安装 Pro 甚至是 Enterprise,只要有相应的授权

初期准备

首先创建两个 VHD

一个 UEFI 能访问的 VHD,存放 USB Mass Storage DXE 驱动模块

大小 16MB 足矣,下文称为 hdd.vhd

(如果能够把驱动模块集成到 UEFI 里面,这个 VHD 可以省略)

以及一个实际安装系统的 VHD,下文称为 usb.vhd

大小 32-64GB 足够了,毕竟这也只能作为实验

挂载 hdd.vhd,创建分区并格式化为 FAT32 格式

放入 USBMassStorageDxe_arm64.efi 模块文件,然后卸载 VHD

挂载 usb.vhd,使用 GPT 分区表,创建 ESP 和安装系统的分区

ESP 使用 FAT32 格式,大小 100MB

安装系统的分区使用 NTFS,占剩下的空间

给这两个分区分配盘符,下文假设 ESP 为 S:,系统安装分区为 W:

然后使用 dism 将系统 ISO 的 install.wim 恢复到 W:

假设 ISO 挂载到 G:,恢复的映像 ID 为 4

(一般 4 是 Pro,具体的 ID 请使用 dism /get-wiminfo 查看)

C:\> dism /apply-image /imagefile:G:\sources\install.wim /index:4 /applydir:W:\

然后使用 bcdboot 在 ESP 分区上建立引导

C:\> bcdboot W:\Windows /s S: /f UEFI

然后卸载 VHD,建议备份一下 usb.vhd 再继续

QEMU 配置与系统的启动

将 Linaro UEFI 的 QEMU_EFI.fd 复制到一个方便的位置

下面假设为以下路径

EFI D:\QEMU_EFI.fd hdd.vhd D:\hdd.vhd usb.vhd D:\usb.vhd

然后用以下命令启动 QEMU ARM64 模拟器...

qemu-system-aarch64 -M virt -m 2048 -cpu cortex-a53 -smp 2 -bios D:\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-kbd -device usb-tablet -drive file=D:\usb.vhd,id=usbstick,if=none -device usb-storage,drive=usbstick -hda D:\hdd.vhd

其中

-m 2048 为内存大小,单位为 MB

-cpu cortex-a53 为模拟的 CPU 内核,可选 cortex-a57cortex-a53

-smp 2 为模拟的 CPU 核心数

以上可以按实际情况调整

模拟器启动之后,按 ESC 进入 UEFI 的设置菜单,选择 Boot Manager,选择最下面的 EFI Internal Shell,进入 EFI Shell

然后应该可以看到 hdd.vhd 的分区 FS0:

键入以下命令加载 USB Mass Storage 驱动

load fs0:\USBMassStorageDxe_arm64.efi

然后键入以下命令,刷新设备列表

map -r

这时应该能看到一个 FS0: 和一个 FS1:

一般 usb.vhd 的 ESP 会分配到 FS0:,所以我们键入

fs0:\efi\boot\bootaa64.efi

启动系统

如无意外的话,系统就会启动了~

截图系统启动,Logo 来自于 UEFI 固件开始菜单系统属性自带的 UWP 是原生的,不过是32位Edge 是原生 64 位 ARM系统组件,如 Shell Experience Host(开始菜单、通知中心等 UI 模块)、Text Input Application (触摸键盘与手写模块)、Cortana(小娜与搜索 UI)等 UWP 则为原生 64 位 ARM 程序用 .Net Framework 自带的 C# 编译器编译了一个简单的 Hello World 程序,显示为 32 位,实际上是 x86-32 (系统没有带任何 ARM 平台的 .Net Framework,系统默认的 shell 也是 cmd 而不是 PowerShell)同时运行三个平台(x86-32、ARM、ARM64)的 cmd.exe,并显示 PROCESSOR_ARCHITECTURE 环境变量Windows 目录下的四个 System 目录(SyCHPE32: CHPE DLL,供 x86 程序调用,内部是 ARM 机器码,使得核心系统库不需要进行二进制翻译,减少性能损失;SysARM32: ARM 32 位系统文件;System32: ARM 64 位系统文件;SysWOW64: x86 32 位系统文件)x86 二进制翻译器核心组件:xtajit.dll、xtac.exe、XtaCache.exe运行 x86-32 版本的 Notepad++运行 x86-32 版本的 CPU-Z(CPU-Z 的驱动加载失败,但是依然能获取部分信息)性能测试

注意:由于 QEMU 使用的是异构模拟,性能肯定非常糟糕,这里仅作为 x86 二进制翻译性能的一个参考。

也许很少人知道,在 Windows RT 被越狱的时候,有一批移植到 Windows RT 的原生 ARM32 Windows 程序,而这些程序在 Windows 10 ARM64 平台依然可以运行。

而其中有一份 7zip 9.22 beta。

这里我们就用这个版本,以及官方下载的 7zip 9.22 beta x86-32 版本做一个简单的性能对比。

测试环境:

宿主

Intel i5 6300HQ,4GBx2 DDR4 2133Mhz 双通道内存,Windows 10 Build 17074 x64

系统盘 为 Intel 600p SSD 128G,存放虚拟机 VHD 的为希捷 5400 转机械硬盘

QEMU 2.11.0-rc4 @ Ubuntu 16.04 LTS (WSL),使用默认配置编译,SDL 图形

QEMU 启动参数如上文所示

虚拟机

Machine virt,Cortex-A53 双核,2GB 内存

系统盘为 XHCI USB Mass Storage (原因见上文)

Windows 10 Build 17074 ARM64

原生 ARM 32 位版本(点击看大图)x86 版本(点击看大图)

有细心的朋友可能会发现,这两个版本并非完全相同,所以这只是一个非常粗略的性能比较

希望有朋友能够用同一份源码编译两个 arch 再进行对比

但可以明显看到,x86 二进制翻译带来了接近 30-50% 的性能损失

对于轻量级应用来说问题不大(骁龙 835 的性能还是可以保证的)

但是对于性能要求高的应用,就会非常吃力

尽管如此,在技术上已经非常成功了(想想今天我们用来跑系统的 QEMU...)

参考链接BetaArchive 社区的讨论主贴

https://www.betaarchive.com/forum/viewtopic.php?f=62&t=37172

QEMU bug tracker 上关于启动 Windows ARM64 的讨论

https://bugs.launchpad.net/qemu/+bug/1717708



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3