ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用qemu-kvm在天玑9400上运行Win10 ARM,CPU-Z实测

用qemu-kvm在天玑9400上运行Win10 ARM,CPU-Z实测 让天玑9400这台ARM芯片跑起Windows 10 on ARM再用CPU-Z看看它到底是什么水平——这个组合听起来有点绕但实际做一遍之后我发现它比单纯跑安兔兔更有意思。它不像手机评测室里的短跑冲刺更像一次对ARM Linux虚拟化栈的全面体检。如果你手里正好有一台能刷入Linux的天玑9400设备或者只是好奇ARM虚拟化到底能走多远这篇文章应该能给你一些参考。这个实验里最关键的三个角色是天玑9400、qemu-kvm和Windows 10 on ARM。它们放在一起很容易被理解成“手机用户想跑Windows”但真正从业者的视角不是这个。我更喜欢把它当成一条链路物理芯片提供虚拟化扩展Linux内核通过KVM暴露硬件虚拟化能力QEMU负责构造一台ARM64虚拟机Windows 10 on ARM在这台虚拟机里运行最后CPU-Z用来回答“此时系统看到的CPU到底是什么”。链路中的每一环都可能成为瓶颈所以这个实验真正验证的不是某个跑分数字而是一整套ARM虚拟化方案在真实芯片上是否可落地。1. 先搞清楚这个实验到底在验证什么1.1 天玑9400不是普通的ARM处理器天玑9400是联发科的旗舰级移动SoC从公开信息看它基于ARMv9架构使用台积电的先进工艺CPU部分包含超大核、大核和小核的混合设计。这些细节对跑Windows来说很重要但更重要的是它的虚拟化能力。ARMv9架构本身包含了硬件虚拟化扩展也就是ARM的Virtualization Extensions。这意味着一个操作系统可以作为hypervisor运行把物理CPU划分成多个虚拟CPU并且让虚拟机里的指令大部分都能直接跑在物理核心上不需要逐条翻译。这是KVM能在ARM上工作的硬件基础也是天玑9400能运行qemu-kvm的前提。不过手机SoC有硬件能力不代表设备厂商一定开放给你用。很多手机和平板的固件并不暴露KVM相关接口你可能连/dev/kvm都看不到。所以这个实验能不能做首先取决于你的天玑9400设备是不是有可用的Linux环境以及内核有没有启用KVM支持模块。这和x86桌面上装个Ubuntu完全不同后者几乎开箱即用。1.2 qemu-kvm解决的不是“模拟”而是“复用”很多教程会把QEMU和“模拟器”划等号但在qemu-kvm这个组合里真正的角色分配是qemu-system-aarch64负责提供虚拟设备和管理生命周期KVM负责让虚拟机里的CPU指令尽量直接跑到物理核心上。这里有一个容易被忽略的点因为天玑9400和Windows 10 on ARM都是ARM64架构所以这是一次同架构虚拟化。虚拟机里的Windows不需要跨架构翻译指令这和x86电脑上跑Android模拟器是完全不同的路径。同架构虚拟化的好处是性能损耗小坏处是你不能把x86的软件装进去能跑什么完全取决于ARM64 Windows生态里有什么。CPU-Z就是一个很好的验证工具。它轻量能直接读出当前Windows看到的处理器型号、核心信息、线程数、虚拟化支持状态。在虚拟机里打开CPU-Z看到的结果不是“天玑9400”而是QEMU构造出来的虚拟CPU这本身就说明了一个重要的虚拟化事实虚拟机里的CPU信息可以被固件和hypervisor改写不一定等于物理芯片的真实身份。正因如此CPU-Z在这个实验里更像一个信号灯用来判断链路通不通。2. 动手之前先把环境检查一遍2.1 确认宿主系统、内核和KVM权限我一般会先把宿主环境当成一个普通ARM64 Linux服务器对待。你需要的不是手机上的普通Android用户态而是一个能够安装qemu、加载内核模块并且有root权限的Linux环境。常见的载体包括Linux开发板、台式机形态的ARM主机或者部分支持Linux启动的天玑9400工程设备。第一步是确认KVM是否存在。在终端里执行ls /dev/kvm如果看到/dev/kvm说明内核已经创建了KVM节点接下来只需要确认你当前的用户是否有权限访问它。多数发行版会把kvm用户组加给登录用户但如果你是在最小化系统里手动安装的可能要执行sudo groupadd -r kvm sudo usermod -aG kvm $USER改完用户组之后需要重新登录或者用newgrp kvm临时加入组。接着看一下内核是否加载了相关的KVM模块。ARM64平台通常使用kvm模块lsmod | grep kvm modinfo kvm | grep file如果模块不存在需要根据你使用的内核版本和发行版安装对应的linux-modules或kvm内核包。这一步听起来基础但实际踩坑的人很多。我自己有一次花了半小时排查QEMU启动失败最后发现只是模块没加载。2.2 安装QEMU和UEFI固件在Debian系系统上安装命令通常是sudo apt update sudo apt install qemu-system-arm qemu-utils qemu-efi-aarch64qemu-efi-aarch64提供ARM64虚拟机使用的UEFI固件文件一般是QEMU_EFI.fd。Windows 10 on ARM虽然从技术上看可以跑在没有UEFI的纯裸机环境下但实际安装镜像需要UEFI启动所以这一步不能省。安装完成后先确认两个关键文件which qemu-system-aarch64 ls /usr/share/qemu-efi-aarch64/QEMU_EFI.fd如果找不到UEFI固件可能是包名不同。Fedora系系统里面通常叫edk2-aarch64openSUSE可能叫qemu-arm。不同发行版的文件路径不一样最好用dpkg -L或rpm -ql确认。2.3 准备好Windows 10 on ARM镜像和CPU-Z接下来需要Windows 10 on ARM的安装镜像。这里我要强调请从微软官方渠道获取ISO不要为了图省事随便下载第三方精简版。原因很简单虚拟化实验里镜像的完整性直接决定失败概率。如果官方找不到可以去Microsoft软件下载页面搜索Windows 10 ARM版。下载之后建议校验哈希值至少确认文件大小和官方页面一致。同时准备CPU-Z的Windows on ARM版本。CPU-Z官网提供了ARM64安装包装到Windows里可以显示处理器和内存信息。如果你下载到了x86版在ARM64 Windows上也能跑但会走模拟层信息显示可能不完全准确。所以最好选ARM64版本。这一步还需要准备一张virtio驱动镜像。不过这里有一个现实问题QEMU的virtio系列驱动在Windows on ARM上的支持不如x86那么完备如果安装阶段识别不到virtio磁盘Windows安装程序会提示找不到驱动器。为了降低难度第一次安装时可以先使用QEMU模拟出的SATA控制器而不是virtio-blk。这个问题我在后面的章节会详细说。3. 从镜像到可用的Windows 10 ARM实例3.1 创建虚拟磁盘并整理启动命令在安装Windows之前先创建一个虚拟磁盘。我建议用qcow2格式因为它支持动态增长和快照方便你在安装过程中反复回滚qemu-img create -f qcow2 win10arm.qcow2 64G64G是一个比较稳妥的起步容量如果后面要装很多工具再加也不迟。qcow2文件不会一开始就占64G它只会随着实际数据变大所以不用太担心磁盘空间浪费。然后准备启动命令。我先把一个最小可用的模板贴出来再解释每个参数export QEMU_EFI/usr/share/qemu-efi-aarch64/QEMU_EFI.fd export WIN_ISO/path/to/Win10_ARM.iso qemu-system-aarch64 \ -machine virt \ -cpu max \ -smp 8 \ -m 8192 \ -bios $QEMU_EFI \ -drive filewin10arm.qcow2,ifnone,iddisk \ -device ich9-ahci,idahci \ -device ide-hd,drivedisk,busahci.0 \ -cdrom $WIN_ISO \ -netdev user,idnet0 \ -device e1000e,netdevnet0 \ -device qemu-xhci,idxhci \ -device usb-tablet,busxhci.0 \ -display gtk这段命令里-machine virt表示使用QEMU为ARM64虚拟化准备的通用虚拟平台-cpu max的意思是向虚拟机暴露当前支持的最高CPU特性集合。注意这里不直接等于天玑9400的原生型号而是QEMU根据宿主机能力合成的一个虚拟CPU。-smp 8表示给虚拟机8个核-m 8192是8GB内存。我建议不要把内存设得太小Windows 10 on ARM启动过程比较吃内存4GB也能跑但体验会差很多。存储设备我特意用了模拟的SATA控制器而不是virtio-blk这是为了让Windows安装程序能直接识别硬盘。网卡也用e1000e模拟而不是默认的virtio-net目的同样是兼容性优先。3.2 开始安装分区、驱动和首次启动启动命令后QEMU会通过GTK窗口显示虚拟机画面。如果一切正常你应该能看到UEFI固件启动画面然后进入Windows安装界面。如果卡在UEFI阶段多半是固件文件路径不对或者镜像不完整这时候先别急着调QEMU参数回到检查ISO哈希和固件文件。进入安装界面后选自定义安装。如果你前面用的是SATA控制器应该能看到一个未分配的磁盘。直接新建分区、格式化并安装即可。这里不需要手动加载任何第三方驱动因为SATA和e1000e都是QEMU模拟的设备Windows内置驱动通常能直接识别。Windows安装过程会重启几次。每次重启后QEMU需要重新从虚拟磁盘启动。如果它重新进入安装程序而不是磁盘启动可能需要调整UEFI启动顺序或者检查-boot参数。在实际操作里我更推荐用-boot orderc指定默认从磁盘启动需要装系统时再临时加-boot orderd。第一次进入Windows桌面之后先别急着跑分。你还需要把分辨率调成显示器支持的格式可能还需要安装TSBTablet Screen Blocker或触摸屏驱动不过这些都不是必须。这次实验的核心是CPU先把系统稳定运行起来就够了。3.3 安装virtio驱动这一步为什么容易卡住很多人看网上资料会看到虚拟机使用virtio-blk和virtio-net来提升I/O性能。这个方向是对的但放到Windows 10 on ARM上就成了一个容易翻车的环节。virtio驱动对x86 Windows的支持很成熟但在ARM64 Windows上可用的virtio驱动并不多尤其是老版本镜像往往无法识别virtio磁盘导致安装程序直接报“找不到驱动器”。为了避免这个问题我给出的顺序是先用SATA/e1000e完成安装进入Windows桌面之后再尝试安装virtio驱动。如果驱动装不上那就继续用模拟设备跑完整个测试。CPU-Z这个工具对磁盘和网络I/O不敏感它主要测试CPU所以就算virtio没装上也不影响我们观察CPU信息。如果你手头确实找到了适配ARM64的virtio驱动镜像也可以走另一条路在安装程序界面加载驱动后切换到virtio设备。但我的建议是第一次实验不要同时换多个变量先让系统跑通再逐个优化。安装完Windows后把CPU-Z装进去。打开CPU-Z你可能会看到处理器名称不是MediaTek而是“ARMv8 (AArch64)”或者一个类似“V8”的字符串。这很正常因为QEMU的虚拟CPU并不包含真实SoC的型号信息。重点不是看到“天玑9400”几个字而是看它是否能正确识别核心数、线程数、指令集和虚拟化状态。4. 在虚拟机里运行CPU-Z怎么跑才有参考价值4.1 CPU-Z到底能看到什么CPU-Z在x86平台上能读出处理器品牌字符串、步进、核心电压、内存频率等。在ARM64 Windows虚拟机上它的信息完整性要打一个问号。比如它可能识别不到具体的步进编号也可能把CPU厂商识别成一个通用ARM名称因为UEFI SMBIOS表中没有写入完整的CPU品牌信息。但这不等于没有价值。至少有三项信息是可靠的核心线程数、是否支持虚拟化、指令集特性。CPU-Z如果显示当前系统有8个逻辑处理器并且支持ARMv8或ARMv9相关特性说明SMP管理已经生效。如果它能显示虚拟化状态为“支持”说明QEMU已经向客户机暴露了虚拟化扩展但要注意这并不代表Windows内可以再开一个嵌套虚拟机。跑分方面CPU-Z会有一个性能测试板块通过CPU逻辑运算给出一个参考分数。这个分数在ARM64 Windows上能跑但和x86平台的分数不能直接对比数据库里的参考样本也少得多。所以我的判断是CPU-Z的分数在这里只能做纵向参考比如调整QEMU参数前后对比不适合跟网上x86分数做跨架构比较。4.2 跑分之前要做的几个设置为了让测试结果尽可能稳定建议先做几件小事。第一关闭Windows Update。Windows Update在后台持续下载和编译会明显干扰CPU测试。在设置里暂停更新几天或者通过组策略关闭自动更新都可以减少噪声。第二把虚拟机的显示窗口暂时关掉或者最小化。虽然QEMU的显示不会直接占用太多CPU但GTK窗口在渲染时会有一些开销。如果条件允许可以用-display none配合串口输出或者使用SPICE/VNC连接但那样观察桌面会麻烦一些。简单起见最小化窗口就够了。第三固定CPU核心数和内存大小。比如你都用8核8GB来测就不要一会儿调成4核一会儿调成12核。QEMU的-smp参数直接影响Windows看到的处理器拓扑核心数变了分数没有可比性。第四在CPU-Z的“About”页面确认软件版本和当前处理器最大频率。有些虚拟化配置里Windows电源计划可能会把CPU频率降低改成“高性能”电源计划能减少频率漂移。4.3 分数能说明什么不能说明什么经过这些准备之后你得到的一个CPU-Z分数可以解释为“这台虚拟化Windows 10 on ARM在固定参数下对CPU运算密集型任务的执行效率”。它能说明QEMUKVM这套虚拟化栈在这个SoC上是否稳定能说明CPU核心分配是否正常也能在一定程度上反映虚拟化开销。但它不能说明“天玑9400的真实跑分是多少”。原因很简单虚拟机里的CPU不是物理CPU直通它经过QEMU的设备虚拟化和KVM的调度还受到宿主系统其他进程的影响。如果你在宿主上同时跑着编译任务虚拟机里的分数会明显下降。如果你用-cpu max和-cpu cortex-a76跑两次分数也会不一样但这不是物理芯片变了而是QEMU暴露给虚拟机的CPU特性不同。所以我很不建议把这个实验结果当成“天玑9400能跑多少分”的证据它更接近“天玑9400在这套虚拟化方案里能稳定提供多少计算能力”的参考。如果你需要看物理芯片本身的性能应该在Linux宿主上运行原生ARM64基准测试比如用Geekbench 6的ARM64 Linux版本那样才有直接参考价值。5. 实际落地时最容易踩的坑5.1 启动卡在UEFI或Windows徽标这是出现概率非常高的一类问题。启动时卡在UEFI界面一般有三个原因-bios参数指定的固件文件路径错误、镜像文件不完整、CPU型号选择不当。先做排除不要急着换镜像。你可以在QEMU的日志输出里加-D /tmp/qemu.log -d guest_errors看看有没有明显错误。如果Windows徽标出现后转圈很久或者重启后陷入循环多半是存储控制器的问题。比如你之前用virtio-blk启动Windows没驱动系统自然找不到启动盘。解决办法就是回到SATA控制器路线或者提前在安装阶段加载对应驱动。5.2 网络和存储驱动异常Windows虚拟机里如果网卡设备是virtio-net但系统没有内置驱动会出现本地连接未识别甚至设备管理器里出现未知设备。这时候要么老老实实换回e1000e要么进入系统后从驱动镜像安装。磁盘驱动异常的表现更隐蔽——Windows能正常使用但磁盘型号显示错误或者系统启动后出现缓慢。遇到这种情况第一反应应该是检查当前使用的是模拟SATA还是virtio-blk。很多“性能很卡”的反馈最后都发现是因为Windows没有正确的virtio驱动硬盘工作在较低效的模拟模式下。5.3 qemu进程占用高但Windows内部卡顿如果宿主机用top看到qemu进程占了大量CPU同时Windows内部响应很慢优先检查KVM是否真正启用。在QEMU运行后进入QEMU控制台快捷键CtrlAlt2输入info kvm如果返回kvm supporton说明KVM已生效。如果显示off说明当前没有使用KVM而是走TCG模拟。TCG模式下ARM64同架构模拟虽然能跑但性能和开销都比KVM差一大截。另外也可能是虚拟机内存不够Windows频繁发生页面交换。我建议最少给6GB8GB更稳妥。5.4 嵌套虚拟化和Hyper-V的坑有些人在Windows里还会继续开WSL2或者Hyper-V。在ARM64虚拟机上这通常做不到因为QEMU/KVM默认不会把ARM虚拟化扩展再次暴露给客户机。即便CPU-Z显示虚拟化状态为“支持”也不代表客户机里的Windows可以再嵌套运行虚拟化软件。不只是功能问题Hyper-V一旦启用Windows会主动修改内存管理方式导致QEMU客户机里的TimeStamp Counter等行为改变进而让CPU-Z跑分结果飘忽。所以跑分前最好关闭Hyper-V相关功能尤其是“基于虚拟化的安全性”。还有一个容易误导的点CPU-Z里看到“虚拟化: 支持”不代表物理芯片一定支持嵌套。这个状态只代表QEMU通过Hypervisor告知客户机“我有虚拟化功能”。真要在客户机里跑KVM需要QEMU额外增加CPU特性透传配置目前ARM64环境下的支持还不够友好不要在这上面浪费太多时间。6. 这个实验真正带给我们的经验6.1 适合谁不适合谁这个实验适合三类人一是研究ARM服务器虚拟化场景的开发者想验证Linux KVM栈在真实ARM SoC上的可用性二是做嵌入式系统和Windows兼容层的测试工程师需要把Windows on ARM放进自动化环境三是纯粹对ARM生态感兴趣、手上又有可刷系统的天玑9400设备的技术探索者。它不适合所有人。如果你想用这种方式日常运行Windows软件体验会非常折磨。因为Windows 10 on ARM本身还依赖x86模拟来运行大量Win32应用再加上QEMU虚拟化层双重模拟会让很多应用慢得难以接受。另外天玑9400设备要获得一个开放的Linux宿主环境门槛本身就不低普通用户没必要为了跑一个CPU-Z去折腾系统。从工程角度看我更推荐把这个方案放到服务器场景或开发板场景而不是手机场景。手机SoC的电源管理、时钟、中断控制器和标准ARM服务器有很多差异KVM的兼容性也更容易踩坑。6.2 一套可复用的五层验证框架做完这个实验我给自己沉淀了一个“五层验证框架”以后再做类似跨平台虚拟化测试时都会按这个顺序排查第一层宿主硬件虚拟化。检查/dev/kvm是否存在info kvm是否打开。第二层QEMU配置。确认machine、cpu、固件、存储控制器和内存参数是否匹配。第三层Guest系统启动。确认Windows安装能完成UEFI引导正常。第四层驱动和设备。确认存储、网络、显示设备被系统识别优先用兼容性最好的模拟设备。第五层应用测试。跑CPU-Z或其他工具前先冻结环境、关闭更新、固定参数再记录结果。这个框架不只适用于Windows on ARM。你在任何一台ARM64 Linux主机上跑qemu-kvm遇到问题时都可以按这个顺序逐层检查。它最大的作用是让你不会一上来就怀疑“芯片性能不行”而是先确认链路哪一层断了。回到最开始的问题天玑9400使用qemu-kvm运行Windows 10 on ARM然后跑CPU-Z到底有没有意义我的答案是有但意义不在分数。它用一个轻量工具把一个复杂链路拉通了一遍让你能亲手确认KVM是否可用、QEMU设备模拟是否兼容、Windows ARM生态是否能跑起来。这个过程本身就是最好的技术训练。下次再有人问“ARM Linux虚拟化到底行不行”你至少知道该从哪一层开始回答。
返回列表