面向 Itanium 的 Windows XP 2002:难以抑制的愤怒

Hacker News Top 新闻

摘要

一篇复古计算博客文章报道称,一个 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 总会搞破坏,只因他们有能力这么做。

相似文章

像1997年那样编译Quake!

Fabien Sanglard

一份详细的指南,介绍如何重现使用Windows NT 4和Visual C++ 6等老式工具编译Quake的win32二进制文件的过程(就像1997年所做的那样)。

为 Windows XP 构建 Principia

Hacker News Top

一篇详细的技术博客文章,讲述了通过创建自定义交叉编译工具链,为 Windows XP 构建开源游戏 Principia 的过程。