在我的 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 位版本的框架。
关于c - 为什么 32 位内核可以运行 64 位二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49934/