关于 32 位和 64 位 Windows
目录
今天,Windows 的当前版本既有 32 位版本,也有 64 位版本。虽然对于功能强大的台式计算机或服务器,在大多数情况下,由于其内存限制,使用 32 位版本是没有意义的,但仍有许多较旧或功能较弱的计算机或嵌入式系统具有资源限制。这就是为什么许多软件仍然仅以 32 位版本开发的原因之一。
对于在 32 位和 64 位系统上执行的 32 位应用程序,Microsoft 为 32 位应用程序提供了一种操作模式,即使在 64 位平台上也能运行。
然而,对于开发者来说,事实并非如此。32 位 Windows 版本只能使用 32 位驱动程序,而 64 位 Windows 只能使用 64 位驱动程序。
由于 Kithara RealTime Suite 附加到内核或驱动程序级别,因此必须安装匹配的编译才能正常工作。这意味着只有 32 位版本的 Kithara RealTime Suite 在 32 位 Windows 上运行,只有 64 位版本的 Kithara RealTime Suite 在 64 位 Windows 上运行。
64 位系统的主要优点是提供更大的地址范围,以便可以为 4 GB 以上的驱动程序和应用程序使用更多的主内存 (RAM)。指针的宽度均为 64 位,而不是 32 位。
64 位 Windows 上的 32 位实时应用程序怎么样?
用户的需求通常是:
-
现有的 32 位应用程序无法切换到 64 位
-
在移植 32 位应用程序时快速支持 64 位 Windows
-
只有一个应用程序应同时支持 32 位和 64 位 Windows 系统
这就是为什么 Kithara 开发了一种特殊的操作模式,让 32 位程序在 64 位平台上实时运行。结果是 KiK64 (Kithara32-in-Kithara64) 扩展。
有三种方法可以在不同的 Windows 系统上运行 Kithara RealTime Suite:
-
在 32 位 Windows 上运行 32 位应用程序
-
在 64 位 Windows 上运行 64 位应用程序
-
在 64 位 Windows 上运行 32 位应用程序(需要 KiK64)
KiK64 (Kithara32-in-Kithara64)
基本上,KiK64扩展由一个转换层组成,该转换层在不同的地址模式之间转换地址。这必须在数据地址和代码地址的运行时完成。例如,我们想看看当 64 位系统上发生定时器中断并且 32 位实时代码请求当前时钟滴答时会发生什么:
-
64:发生定时器中断,Kithara RealTime Suite的中断服务程序开始
-
KiK64:将代码和数据地址转换为 32 位
-
32:执行用户的定时器函数,调用一个函数来请求时钟滴答声,并给出一个32位的指针
-
KiK64:将代码和数据地址转换为 64 位
-
64:Kithara RealTime Suite 确定时钟滴答并写入 64 位变量
-
KiK64:将代码和数据地址转换为 32 位
-
32:评估时钟滴答声并完成用户的定时器功能
-
KiK64:将代码和数据地址转换为 64 位
-
64:回到 64 位世界,从定时器中断返回
想象一下,在执行更复杂的应用(如使用EtherCAT主站)时,必须做些什么!但在大多数情况下,它都是有效的,尽管由于复杂的转换层仍然存在一些限制和问题。
已知问题
性能损失:代码和数据地址的每个必要地址转换都会消耗一定量的 CPU 处理时间。根据代码的不同,或多或少会发生性能损失。
功能限制:某些函数不允许调用或不适用于 32 位进程:
-
无法使用 Win32 API 函数
-
无法使用 KS_updateDriver 更新驱动程序(过时功能)
-
如果尚未安装 KRTS 驱动程序,KS_openDriver 将不会安装 KRTS 驱动程序
-
KS_openAdapter 不能用于使用标志“KSF_VIRTUAL_WINDOWS_CONNECTION”设置连接到 Windows NDIS 网络堆栈的实时网络适配器。
-
目前对 Windows 8/8.1 的支持不稳定,不推荐使用
请注意,我们不建议将 KiK64 用于新的和更复杂的应用程序。
移植到 64 位的工作太多了?
将现有的 32 位应用程序移植到 64 位版本是值得的,因为:
-
由于可用的内存更多,问题更少
-
在某些类型的应用程序中可能执行得更快
-
在 64 位 Windows 上使用本机 64 位程序大幅提高性能
-
未来还会提供 32 位系统吗?
如果您认为将现有的 32 位应用程序移植到 64 位版本中工作量太大,那么请尝试仅将应用程序中具有时间关键型和硬件相关部分的一些较小部分移植到特殊的 64 位程序中,将主要部分保留在 32 位程序中,并通过同步方式在两个程序之间进行通信。从一小部分开始并有未来的前景总是比睡过头并最终按下恐慌按钮要好!
有关 64 位 Windows 的其他说明
找出它是 32 位还是 64 位
大多数 Windows 用户甚至不知道他们的 Windows 是 32 位版本还是 64 位版本。在使用“普通”应用程序时,在大多数情况下,这方面并不重要。通过正常执行,无法识别应用程序的编译方式。
在我们讨论 32 位和 64 位之间的区别之前,我们将展示如何找出类型。
确定 Windows 类型
若要了解您正在运行的 Windows,可以打开系统属性:
*转到“控制面板”并打开“系统”
*或找到“计算机”的链接,然后使用右键单击打开“属性”
- 或按住“Windows-Key”并按“Pause/Break-Key”
在“系统信息”下,您将看到“系统类型”,它告诉计算机运行的是“32 位操作系统”还是“64 位操作系统”。
确定应用类型
_This仅对 64 位 Windows versions._有效
Windows 任务管理器可用于确定类型。
只需启动应用程序并打开 Windows 任务管理器:
*在任务栏上执行右键单击,然后选择“启动任务管理器”
- 或按住“Ctrl-Key”+“Shift-Key”并按“Esc-Key”
现在切换到“进程”选项卡并找到应用程序的名称。如果名称标有额外的星号和数字 32 (‘*32’),则它是一个 32 位进程。所有其他进程都是 64 位进程。
确定其他文件的类型
驱动程序 (‘*.SYS’) 和库 (‘*.DLL’) 通常不显示类型。使用“Dependency Walker”等程序,可以查找大于 32 位的地址。在这种情况下,它很可能是 64 位编译。
Kithara Software 的所有编译都会在 DLL 文件或 SYS 文件属性的“详细信息”选项卡中提供此信息(在 Windows 资源管理器中右键单击该文件并选择 “属性”)。
“产品版本”显示类型:例如“9.53a,Build 2360,32 位最终版本”
重定向器
Windows 本身具有不同的机制来运行 32 位应用程序而不会出现任何问题,即使它们使用 Win32/COM 函数和接口或 Windows 注册表:
请参阅此处(也了解“system32”和“SysWoW64”之间的区别):
64 位平台上的 32 位软件的已知问题
在 64 位 Windows 系统上使用 32 位第三方软件时,上述重定向器可能会导致奇怪的影响。例如,旧版本的 Total Commander(低于 7.5)不知道重定向器。较新的版本可以选择禁用重定向器以访问真正的“system32”目录。
使用 32 位应用程序的 INF 文件安装驱动程序可能会出现其他问题。这可能会导致在 32 位 Windows 上实际安装 64 位驱动程序(原因不起作用)!