从过去的读数来看,似乎大多数 32位驱动程序无法在64位上运行。
在纯粹的概念层面,我看到64位计算机在使用32位驱动程序时具有额外的“空间”,所以我试图确定为什么他们通常会不工作。 (我来自用户空间)
我已阅读x86-64上的this wiki文章,其中说明了
堆栈上的推送和弹出总是以8字节为单位,指针宽度为8字节。
我可以看到这可能是32位驱动程序在64位上失败的原因,因为它发出的pop()弹出的数据是驱动程序预期的两倍。
我刚刚提到的内容可能完全不合适,因为我是一个用户空间人,在这种情况下,或者其他方式,为什么32位驱动程序失败时的一些实际示例(代码或外行解释)在64位上运行?
答案 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位硬件。