在我的 OS X 机器上,内核是 32 位二进制文件,但它可以运行 64 位二进制文件。
这是如何运作的?
cristi:~ diciu$ file ./a.out
./a.out: Mach-O 64-bit executable x86_64
cristi:~ diciu$ file /mach_kernel
/mach_kernel: Mach-O universal binary with 2 architectures
/mach_kernel (for architecture i386): Mach-O executable i386
/mach_kernel (for architecture ppc): Mach-O executable ppc
cristi:~ diciu$ ./a.out
cristi:~ diciu$ echo $?
1
当 CPU 陷入内核上下文时,它可以从 64 位执行模式切换到 32 位,并且仍然可以构建 32 位内核来理解从 64 位用户空间应用程序传入的结构。
无论如何,MacOS X 内核不会直接从用户应用程序取消引用指针,因为它驻留在自己单独的地址空间中。例如,ioctl 调用中的用户空间指针必须首先解析为其物理地址,然后在内核地址空间中创建新的虚拟地址。 ioctl 中的指针是 64 位还是 32 位并不重要,在任何一种情况下内核都不会直接取消引用它。
因此,混合 32 位内核和 64 位二进制文件可以工作,反之亦然。您不能做的是将 32 位库与 64 位应用程序混合使用,因为它们之间传递的指针将被截断。 MacOS X 在每个版本中都提供了更多 32 位和 64 位版本的框架。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)