为什么32位驱动程序不能在64位上运行

时间:2011-06-10 14:36:12

标签: x86 64-bit x86-64 cpu-architecture

从过去的读数来看,似乎大多数 32位驱动程序无法在64位上运行。

在纯粹的概念层面,我看到64位计算机在使用32位驱动程序时具有额外的“空间”,所以我试图确定为什么他们通常会工作。 (我来自用户空间)

我已阅读x86-64上的this wiki文章,其中说明了

  

堆栈上的推送和弹出总是以8字节为单位,指针宽度为8字节。

我可以看到这可能是32位驱动程序在64位上失败的原因,因为它发出的pop()弹出的数据是驱动程序预期的两倍。

我刚刚提到的内容可能完全不合适,因为我是一个用户空间人,在这种情况下,或者其他方式,为什么32位驱动程序失败时的一些实际示例(代码或外行解释)在64位上运行?

4 个答案:

答案 0 :(得分:7)

简单地说,你不能在32位指针中存储64位地址。因此,如果您的代码涉及将指针来回传递给操作系统,就像设备驱动程序通常那样,它就不会很好地结束。

驱动程序通常是在物理设备(例如磁盘)和内存之间移动数据。将要求驱动程序将X磁盘扇区传送到地址为Y的存储器中。

在64位操作系统上,Y将是64位地址,因此您的32位驱动程序无法处理此问题。当然还有一个问题,即传递的指针大小是它预期的两倍,所以如果DID运行它可能会记录错误的内存......

答案 1 :(得分:4)

请记住驱动程序可以与硬件通信。如果将32位驱动程序代码加载到距离硬件memory-mapped registers的位置超过4千兆字节的内存区域会怎么样?驱动程序代码将在内存中涂写,与自身或它应该驱动的硬件无关。

答案 2 :(得分:1)

x86-64处理器无法在特权(内核)模式下运行32位代码。兼容模式仅适用于用户空间。

答案 3 :(得分:0)

我的价值2美分。微软并没有给老鼠讲解它在发布升级或补丁时造成的混乱。

特别是关于Legacy硬件与x64代操作系统兼容。 我在这里谈论无数的科学硬件,只有32位驱动程序,硬件无法获得并且不再支持,因此Labs运行XP或最多7 x86。同样消费者如何购买生物识别扫描仪和各种医疗设备。

x64路径应该设计为适应传统的32位硬件。