c - 为什么 32 位内核可以运行 64 位二进制文​​件?

标签 c macos x86 x86-64 32-bit

在我的 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/

相关文章:

c - 使用 isspace 和 getchar() 忽略空格

macos - 在 osx 上完整记录 HTTPS 流量。

macos - Node.js 版本和 Heroku

C 从头文件导入#defines

c - 从文件中读取姓名和号码并修改

c - 如何用GCC生成IP相对寻址指令

gcc - 无法修改数据段寄存器。尝试时抛出一般保护错误

assembly - 带有字节目标的 mov 指令立即到内存

c - msp430F1611 SPI 通信

swift - 试图将文本字段添加到 nsmenuitem 但它不会显示