2011-06-10 56 views
6

从过去的读数看来似乎大多数 32位驱动程序将无法在64位上工作。为什么32位驱动程序不能在64位上工作

在纯粹的概念层面上,我发现64位机器在使用32位驱动程序时有额外的“空间”,因此我试图确定为什么他们最经常会使用而不是。 (我从用户空间来)

我已阅读this维基文章X86-64其中规定

push和pop堆栈上总是在8字节的进步,和指针8个字节宽。

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

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

回答

6

简而言之,你不能在一个32位指针中存储一个64位地址。因此,如果您的代码涉及将指针传递到操作系统,正如设备驱动程序通常所做的那样,它不会很好地结束。

驱动程序通常是关于在财政设备(例如磁盘)和内存之间移动数据。驱动程序将被要求在地址Y处将X磁盘扇区传输到内存中。

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

+0

,所以驱动程序可能会要求一些内存分配,操作系统将返回一个地址,它(驱动程序)无法解决/指向? – wal 2011-06-10 14:52:36

+0

@wal。是的,但更简单的事情出错了,如上所述。 – Roddy 2011-06-10 14:57:51

4

请记住,司机在那里与硬件交谈。如果将32位驱动程序代码加载到远离硬件memory-mapped registers所在位置超过4千兆字节的内存区域,该怎么办?驱动程序代码将在内存中涂写,与本身或它应该驱动的硬件无关。

+0

如果驱动程序被标记为(不知何故)为32位,并且只加载到小于4gig的地址中,那么票价如何? – wal 2011-06-10 14:45:44

+0

32位代码仍然会以32位模式运行。它不会神奇地转换成64位模式。这与在32位386+处理器上以虚拟86模式运行的16位代码基本相同。整体环境是64位,但32位部分运行在32位沙箱中。 – 2011-06-10 14:47:04

+0

当然,但它仍然会运行。 (都在32位模式下) – wal 2011-06-10 14:50:09

0

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

+0

实际上,他们可以并且已经在MacOS X 10.5中进行实践,尽管您运行的是64位应用程序(没有仿真),但内核是32位的。 – LocoDelAssembly 2011-06-12 06:00:48

+1

他们正在运行一个32位内核,并在用户空间切换到64位。这与在64位内核中运行32位驱动程序不同。 – 2011-06-12 12:00:56

0

我的2美分价值。微软并没有对老鼠发布升级或补丁时造成的混乱情况。

特别是关于传统硬件与x64代OS兼容。 我在这里谈论无数的科学硬件,那里只有32位驱动程序,硬件无法获得和不再支持,从而使实验室运行XP或至多7 x86。同样,消费者如何购买生物识别扫描仪和各种医疗设备。

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

相关问题