返回

文章详情

x86模拟器团队发现的糟糕代码,他们在仿真过程中修复了它

Hacker News2026年6月16日 04:46

在一次交流战争故事时,我的一个同事讲述了一个过去的故事,那时Windows包含一个针对x86-32的处理器模拟器,运行在本地使用其他处理器的系统上。(这种情况发生过很多次。至于这个特定的故事适用于哪个处理器,我也不知道。)这个特定的模拟器采用二进制翻译,生成本地代码以执行与原始x86-32代码等效的操作。这比通过解释器的仿真提供了显著的性能提升。你可以想象,x86-32就像是一种字节码,而模拟器则是即时编译器。无论如何,我的同事发现有一个程序需要在栈上分配大约64KB的内存并初始化它。标准的方法是进行栈探查以确保有64KB的内存可用,然后从栈指针中减去65536,再在一个小的紧凑循环中初始化内存。但是使用循环来初始化内存对于用于编译这段代码的编译器来说太单调了。编译器没有生成一个循环来初始化缓冲区的每个字节,而是通过将循环展开为65,536条每条4字节长的“写字节到内存”指令来“优化”代码。总的来说,程序用了256KB的代码来初始化64KB的数据。这让团队非常反感,以至于他们向翻译器添加了特殊代码,以检测这个可怕的函数并将其替换为等效的紧凑循环。作者雷蒙德参与了Windows的发展超过30年。2003年,他开始了一个名为《旧新事物》的网站,该网站的受欢迎程度远远超出了他的想象,这一发展至今仍让他感到不安。这个网站催生了一本书,巧合的是也叫《旧新事物》(Addison Wesley 2007)。他偶尔会出现在Windows开发文档的Twitter账户上,讲述一些没有任何有用信息的故事。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡