所有 WoW64 应用程序都经过 WoW64 仿真层。
我想知道这一层发生了什么。(特别是他们如何转换地址空间)
请给我一些重要的观点。
由于您已经发布了图表,因此很清楚您知道 WOW64 存在的原因。现在回答你的问题:
我想知道这一层发生了什么。
我想你想知道它是如何实现的。
进程启动:加载程序像往常一样加载 64 位用户模式部分“Ntdll.dll”,但也会加载 32 位 Ntdll.dll,以防进程用于 32 位执行。现在加载程序负责使用 Wow64.dll 进行初始化,它在 32 位 Ntdll 中设置进程和线程上下文并“将 CPU 切换到 32 位模式”以执行。
系统调用:现在一切都在 32 位模式下运行,直到系统调用。我们知道系统调用会经过Ntdll.dll、User32.dll、Gdi32.dll等;在这种情况下是 32 位版本。这些库有一个单独的 32 位版本,位于 \Windows\Syswow64 位文件夹中。这些只是存根,而不是发出“本机系统调用”,实际上是在 Wow64.dll 中调用。现在,Wow64.dll 很容易转换到 64 位模式,将参数转换为对应的 64 位,使用 64 位版本发出系统调用,获取结果,并将输出重新转换为 32 位。然后它将 CPU 转换回 32 位模式并返回输出。
异常分派、用户回调、文件系统和注册表操作以及 I/O 都以相同的方式处理,在某个地方使用挂钩。阅读下面规定的书。
(尤其是他们如何转换地址空间)。
64 位地址空间是 32 位地址空间的超集。另外,32 位/64 位中的相同指针(实际上是 PTE)不用于引用整个地址空间,但用户空间和系统空间有单独的页表。
请给我一些重要的观点。
要了解 Windows,我能给你的最重要一点是阅读“Windows Internals”——Russinovich
MSDN说:
WOW64 是 x86 仿真器,它允许基于 32 位 Windows 的应用程序在 64 位 Windows 上无缝运行。WOW64 随操作系统提供,无需显式启用。
该系统将 32 位应用程序与 64 位应用程序隔离开来,包括防止文件和注册表冲突。支持控制台、GUI 和服务应用程序。该系统为剪切和粘贴和 COM 等场景提供跨 32/64 边界的互操作性。但是,32 位进程不能加载 64 位 DLL 来执行,64 位进程也不能加载 32 位 DLL 来执行。
具体有什么不明白的?您是否已经阅读过有关 WoW64 子系统的Wikipedia 文章?我想你会发现它提供了一个相当全面的概述。
微软在这里提供了一些额外的细节:WOW64 Implementation Details
“特别是,他们如何转换地址空间”
关键是要知道 amd 和 intel x64 处理器支持并行运行 32 位和 64 位代码。这允许操作系统(在运行本机 x64 时)为 32 位线程创建一个上下文,该线程具有 32 位寻址与 64 位线程共存
类似地,当宿主操作系统运行32位时,它可以创建16位线程来运行win16和dos应用程序。
请注意,我认为在 64 位操作系统中运行时,它不能创建 32 位和 16 位线程——我猜 AMD 认为这只是向后兼容太多了 :-)