面向 Itanium 的 Windows XP 2002:难以抑制的愤怒
摘要
一篇复古计算博客文章报道称,一个 QEMU 分支现在能够模拟 Intel Itanium(Merced),足以运行适用于 IA-64 的 Windows XP 2002,并记录了在 macOS 上构建交叉编译器以帮助其运行的过程。
暂无内容
查看缓存全文
缓存时间: 2026/08/03 22:35
# 面向安腾的 Windows XP 2002:无边的愤怒
来源:https://virtuallyfun.com/2026/08/03/windows-xp-2002-for-the-itanium-unbridled-rage/
Windows XP ia64 build 2600 的全貌
这是个激动人心的消息:有一个 Qemu 的分支实现了可用的安腾 Merced 模拟,而且足以运行 Windows XP/2003!请出 **Malte Kuhlmann**(https://github.com/makuhlmann)的 Qemu 分支(https://github.com/makuhlmann/qemu-system-ia64/tree/merced),它基于 syunnPC(https://github.com/syunnPC)的 AI 安腾强化版 Qemu 分支(https://github.com/syunnPC/qemu-system-ia64/tree/main)。我相信在某个时间点会有某种合并。一如既往,事情一旦有趣起来就进展飞快。总之,我在构建这个东西时遇到了数不尽的糟心问题。我本该把能运行 Alph64 Windows 的 Qemu Alpha 的构建步骤记下来!……然而我没有,所以那些配方(希望是暂时性地)算是丢了。于是,我又跳回了我的 Mac mini——毕竟 macOS 既有足够的 UNIX 血统来干正事,又足够主流来跑真正的应用。部分原因是我确实想构建固件,因为我感觉这可能是我一直忽略的某个关键「同步」环节。
构建交叉编译器对我来说或对这个博客来说都不算什么新鲜事。事实上,我现在手头就有两个来自其他项目的:
```
jsteve@Jasons-Mac-mini gcc % /usr/local/os2/bin/i386-pc-linux-gnuaout-gcc -v
Reading specs from /usr/local/os2/lib/gcc-lib/i386-pc-linux-gnuaout/2.8.1/specs
gcc version 2.8.1
jsteve@Jasons-Mac-mini gcc % /usr/local/i586-linux2/bin/i586-linux-gcc -v
Reading specs from /usr/local/i586-linux2/lib/gcc-lib/i586-linux/2.8.1/specs
gcc version 2.8.1
```
毕竟 GCC 2.8.1 作为 macOS arm64 二进制来交叉编译到 i386 似乎还「凑合」……但这不属于这里的讨论范围。由于这是一次「现代」构建,所以不需要任何奇怪的操作。一切都很顺利。很意外吧,我知道。显然,多年后的人再看这段话就不会成立了。
## Binutils
没什么可看可说的,就用 binutils 2.46.0,开箱即配置/构建完成。不错。
```
../binutils-2.46.0/configure --target=ia64-linux-gnu --prefix=/usr/local/ia64-linux-gnu
```
## GCC
这有点怪,因为安腾并不是一个垂死的平台,而是一个彻底死透的平台(https://www.phoronix.com/news/Itanium-IA-64-GCC-16-Obsolete)。不过,多亏了单枪匹马维持火种的 René Rebe(https://www.theregister.com/software/2024/11/01/gcc-15-to-undeprecate-itanium-support-for-now/626941),我干脆选用了所提到的版本 15,看看它是否还能用。剧透:确实能用!在 macOS 上构建也意味着我确实装了 Homebrew,因此不必手工构建那么多依赖,直接 brew 出 GCC 所需的依赖即可。这倒是让配置过程稍微复杂了一点。
```
../gcc-15.3.0/configure \
--target=ia64-linux-gnu \
--prefix=/usr/local/ia64-linux-gnu \
--disable-bootstrap \
--disable-multilib \
--enable-languages=c \
--with-gmp=/opt/homebrew \
--with-mpfr=/opt/homebrew \
--with-mpc=/opt/homebrew \
CPPFLAGS="-I/opt/homebrew/include" \
LDFLAGS="-L/opt/homebrew/lib"
```
有一个怪异的 fdopen 重复定义会把构建搞乱,这得怪 zlib。我就知道会这样。
```
In file included from ../../gcc-15.3.0/zlib/zutil.c:10:
In file included from ../../gcc-15.3.0/zlib/gzguts.h:21:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:61:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_stdio.h:322:7: error: expected ')'
322 | FILE *fdopen(int, const char *) __DARWIN_ALIAS_STARTING(__MAC_10_6, _...
| ^
../../gcc-15.3.0/zlib/zutil.h:140:33: note: expanded from macro 'fdopen'
140 | # define fdopen(fd,mode) NULL /* No fdopen() */
```
解决办法当然是把 zutil.h 的第 140 行注释掉。之后大部分就能构建出来了(记得把 binutils 的二进制目录加入 PATH!*export PATH=/usr/local/ia64-linux-gnu/bin:$PATH*)。它会抱怨缺少 pthread,因为它想构建所有 Linux 相关的东西,但我们不管它。
```
In file included from ../../../gcc-15.3.0/libgcc/gthr.h:157,
from ../../../gcc-15.3.0/libgcc/libgcov-interface.c:27:
./gthr-default.h:35:10: fatal error: pthread.h: No such file or directory
35 | #include
| ^~~~~~~~~~~
compilation terminated.
```
不过我还是得手动复制 libgcc.a:
```
cp ia64-linux-gnu/libgcc/libgcc.a /usr/local/ia64-linux-gnu/ia64-linux-gnu/lib/libgcc.a
```
然后只需 cd 到 gcc 目录并执行 make install。就这样,我现在有了一个安腾交叉编译器,可以用来构建固件了!
```
jsteve@Jasons-Mac-mini gcc % /usr/local/ia64-linux-gnu/bin/ia64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/ia64-linux-gnu/bin/ia64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/local/ia64-linux-gnu/libexec/gcc/ia64-linux-gnu/15.3.0/lto-wrapper
Target: ia64-linux-gnu
Configured with: ../gcc-15.3.0/configure --target=ia64-linux-gnu --prefix=/usr/local/ia64-linux-gnu --disable-bootstrap --disable-multilib --enable-languages=c --with-gmp=/opt/homebrew --with-mpfr=/opt/homebrew --with-mpc=/opt/homebrew CPPFLAGS=-I/opt/homebrew/include LDFLAGS=-L/opt/homebrew/lib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.3.0 (GCC)
```
漂亮!
## Qemu
我过去肯定 brew 过一些依赖,但要我说具体是哪些,我还真想不起来。首先获取源码(截至此刻,2026 年 7 月 31 日)。
```
git clone --branch merced --single-branch https://github.com/makuhlmann/qemu-system-ia64.git
```
然后建一个构建目录,因为我们不在源码目录里构建!在 macOS 上配置当然……有点怪。
```
../qemu-system-ia64/configure \
--disable-qom-cast-debug \
--disable-stack-protector \
--extra-cflags='-O2 -fno-stack-protector -fzero-call-used-regs=skip -ftrivial-auto-var-init=uninitialized' \
--disable-guest-agent-msi --disable-werror --enable-slirp \
--target-list=ia64-softmmu --disable-sdl --python=/usr/bin/python3
```
既然我在 macOS 上,我想用 cocoa 后端,所以 GTK+ 或 SDL 我都无所谓。接下来就是跑 make 而已……我用了 -j6 来吃满六个核心,结果它飞速编译了几分钟后带着一个奇怪的错误停了下来,我只管再敲一次 `make`,它就完成了。我不太清楚它卡在了哪里,也真不在乎。
对于本次安装,我使用的是这个镜像:
5.1.2600.0.xpclient.010817-1148_ia64fre_client-professional_retail_en-us-WXPIFPP_EN.iso(https://archive.org/details/5.1.2600.0.xpclient.-010817-1148-ia-64fre-client-professional-retail-en-us-wxpifpp-en)
它的 MD5 校验和是:604ee3141ed6a34391a89a33c0019702
因为 XP Itanium 的版本*很多*,但很容易拿错。
## 安装
现在到了「困难」部分:让它真正装上。首先创建一个硬盘,比如 20GB?
```
./merced-build/qemu-img create -f vmdk ia64-xp64-merced.vmdk 20G
Formatting 'ia64-xp64-merced.vmdk', fmt=vmdk size=21474836480 compat6=off hwversion=undefined
```
这是我用的命令行,感谢 Roy Tam!
```
merced-build/qemu-system-ia64-unsigned \
-bios ./merced-build/roms/ia64-firmware/ia64-firmware.bin \
-machine ia64-vpc,i8042=off,nvram=ia64fw-nvram-merced.bin \
-cdrom "5.1.2600.0.xpclient.010817-1148_ia64fre_client-professional_retail_en-us-WXPIFPP_EN.iso" \
-hda "ia64-xp64-merced.vmdk" \
-accel tcg,thread=multi,tb-size=2048 -smp 1 -m 1536 \
-vga ati -cpu merced \
-display cocoa,zoom-to-fit=on \
-nic user,model=i82557a,hostfwd=tcp::3386-:3389
```
就这样,它会启动进入 EFI 固件。
安腾 EFI 固件
能看到这个固件镜像,再次证实了我们确实可以用我们的 GCC 交叉编译器来交叉编译安腾固件!
然后光驱会提示按任意键从光盘启动。
按任意键从 CD-ROM 启动……。
这里我得提一句:Qemu 在高分辨率显示器上缩放效果不太好。但既然我们启用了 zoom-to-fit 选项,就可以缩放窗口以便阅读,或者直接最大化。
从这里开始,基本上就是一次正常的 XP 安装。
与旧的 RISC 不同,系统分区的创建现在由安装程序处理,就像所有其他 EFI/UEFI 平台一样。我得说,这是个不错的改变。然后只需选择磁盘的剩余部分,我把它格式化为 NTFS(快速),之后它就开始复制文件了。对我来说,这一步在 5 分钟内就完成了。
快速重启后,你就进入了图形安装程序。从这里开始,它可能会崩溃或死死锁住。如果出现这种情况,就重新创建硬盘镜像,再重试安装。我试了 5 次才成功。不过我得说,用 syunn 的分支我一次都没能装完。
XGCJ6-Q6XGJ-BQ2QQ-BRWJ7-67X7W
在被询问时,我直接选择了默认网络设置。在之前的构建中,这会在各种时候失败和/或硬锁,总体成功率只有 1/5。不算好。不过我今天只装了一次 XP 2600,而且是一次成功,耗时 30–40 分钟,所以我想我可以这么说:一如既往,一切都在推进中,而且越来越好!
在我的 M4 上,又花了约 30 分钟,然后大功告成。
搞定了!
我强烈建议配置好 RDP,然后用远程桌面应用程序来操作,因为目前方向键会过于频繁地重复触发,让打字变成一件苦差事。而且这还能解决任何 cocoa 视频缩放问题。
未来呢?那么 Windows XP 的 2003 版本呢?也就是:
5.2.3790.0.srv03_rtm.030324-2048_ia64fre_client-professional_retail_en-us-NRMPIFPP_EN.iso
用同样的配置,换不同的 ISO,没错,它在我的 M4 Mac mini 上大约 40 分钟就装好了。
Windows Server build 2462
为什么这么说?就连目前能找到的最早的 Windows Server Itanium 构建,5.1.2462(https://archive.org/details/5.1.2462.0.main.-010315-1720-ia-64fre-server-enterprise-retail)也能安装并运行!当然,时间得在 2001 年 8 月之前。
其他操作系统呢?就目前而言,我不认为还有别的什么能跑。Monterey 没什么起色,HP-UX、VMS 等也一样。
下一步何去何从?编译器!诸如此类。不用说,因为这是第一代安腾,我当初在拥有安腾时构建的所有东西都无法运行,因为那些是针对安腾2 的。你是不是也很喜欢这种糟糕的二进制兼容性?这就是为什么 80386 在 2026 年依然和 1987 年一样有存在感。当然,Apple 总会搞破坏,只因他们有能力这么做。
相似文章
更多模拟器佳品,一个能启动Windows的Intel Itanium (IA-64)模拟器
来自Yufeng Gao和gdwnldsKSC的一款新的Intel Itanium (IA-64)模拟器能够启动Windows Server 2003和Windows XP 64位版,但运行速度非常慢。代码预计将在后续开源。
使用新 es40 分支在 DEC Alpha 上运行 Windows 2000
es40 模拟器的新分支增加了 JIT 编译和 S3 图形支持,可在 DEC Alpha 系统上更快地模拟 Windows 2000 和 OpenVMS。
在86Box上使用M6 Mac Mini模拟600MHz的Pentium II与Voodoo 3
本文回顾了86Box在Apple Mac Mini M6上的模拟性能,成功实现了对搭载Voodoo 3显卡的600MHz Pentium II的稳定模拟,并强调了单线程CPU速度对于精确复古模拟的重要性。
像1997年那样编译Quake!
一份详细的指南,介绍如何重现使用Windows NT 4和Visual C++ 6等老式工具编译Quake的win32二进制文件的过程(就像1997年所做的那样)。
为 Windows XP 构建 Principia
一篇详细的技术博客文章,讲述了通过创建自定义交叉编译工具链,为 Windows XP 构建开源游戏 Principia 的过程。