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

7

从过去的阅读中,似乎大多数32位驱动程序在64位上无法工作。

从纯概念层面上看,我认为64位机器在使用32位驱动程序时有额外的“空间”,因此正在尝试确定为什么它们通常不起作用。(我是来自用户空间的)

我已经阅读了这篇关于x86-64的维基百科文章,其中提到:

堆栈上的推送和弹出总是以8字节步幅进行,指针宽度为8字节。

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

我刚才提到的可能完全错了,因为我是一个用户空间的人,如果是这样,或者其他情况下,有哪些实际例子(代码或通俗易懂的解释)可以解释为什么32位驱动程序在64位上运行时会失败?

4个回答

7
简单来说,你无法在32位指针中存储64位地址。因此,如果你的代码涉及与操作系统来回传递指针(如设备驱动程序通常所做的),那么结果可能不会很好。

驱动程序通常涉及在物理设备(例如磁盘)和内存之间移动数据。驱动程序将被要求将X个磁盘扇区传输到地址Y处的内存中。

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


那么驱动程序可能会请求一些内存分配,操作系统会返回一个地址,该地址驱动程序无法寻址/指向? - wal

4

请记住,驱动程序是用来与硬件通信的。如果32位驱动程序代码被加载到距离硬件的内存映射寄存器超过4GB的内存区域中,那么驱动程序代码将在与自身或其所需驱动的硬件无关的内存中涂鸦。


如果驱动程序被标记为32位,并且仅加载到小于4G的地址中,那会怎样呢? - wal
32位代码仍将在32位模式下运行。它不会神奇地被翻译成64位模式。这本质上与16位代码在32位386+处理器上以virtual86模式运行的情况相同。整体环境是64位的,但32位部分在32位沙盒中运行。 - Marc B
当然可以,但它仍将在32位模式下运行。 - wal
想象一下这样的情况:一个64位应用程序调用硬盘驱动程序来写出一个文件,并提供一个指向系统中物理位置为5GB的某些数据的指针。如果没有大量的后台处理,该数据对驱动程序是不可访问的。32位驱动程序可能会运行,但速度极慢,几乎无法使用。 - Marc B
@Marc,你能详细解释一下“硬件内存映射寄存器”或提供一个链接来更详细地描述你的答案吗? - wal
简单来说,你的显卡内存会被映射到系统内存的某个位置,这样你就可以像访问系统内存中的内容一样直接访问显卡内存。同样的,寄存器也可以这样操作,你可以使用 mov 指令代替 inout 汇编指令。 - Marc B

2

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


实际上,它们可以,并且已经在MacOS X 10.5中实践过了,即使您运行64位应用程序(无需仿真),内核也是32位的。 - LocoDelAssembly
2
他们正在运行一个32位内核,并将其切换到用户空间的64位。这与在64位内核中运行32位驱动程序不同。 - Axel Gneiting

1
我的两分钱。微软在发布升级或补丁时,对其造成的混乱并不关心。
特别是关于遗留硬件与x64一代操作系统兼容性的问题。我说的是有无数科学硬件只有32位驱动程序,而这些硬件现在已经无法获得支持和购买,因此实验室只能运行XP或最好的7 x86版本。同样的情况也适用于购买了生物识别扫描仪和各种医疗设备的消费者。
x64应该被设计为适应遗留的32位硬件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接