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

时间:2008-09-08 15:23:07

标签: c macos 64-bit 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

6 个答案:

答案 0 :(得分:43)

当陷入内核上下文时,CPU可以从64位执行模式切换到32位,并且仍然可以构造32位内核来理解从64位用户空间应用程序传入的结构。

MacOS X内核无论如何都不直接取消引用用户应用程序的指针,因为它驻留在自己独立的地址空间中。例如,ioctl调用中的用户空间指针必须先解析为其物理地址,然后再解析为在内核地址空间中创建的新虚拟地址。 ioctl中的指针是64位还是32位并不重要,在任何一种情况下内核都不会直接取消引用它。

因此混合使用32位内核和64位二进制文​​件可以正常工作,反之亦然。您不能做的是将32位库与64位应用程序混合,因为它们之间传递的指针将被截断。 MacOS X在每个版本中都提供了32位和64位版本的更多框架。

答案 1 :(得分:6)

运行二进制文件的不是内核。这是处理器。

二进制文件调用库函数,那些函数需要为64位。如果他们需要进行系统调用,他们有责任应对他们自己是64位的事实,但内核只有32位。

但这不是你不必担心的事情。

答案 2 :(得分:6)

请注意,所有 32位内核都不能运行64位进程。 Windows肯定没有这个属性,我从来没有在Linux上看到它。

答案 3 :(得分:2)

能够加载和运行64位二进制文​​件的32位内核必须有一些64位代码来处理内存映射,程序加载和其他一些64位问题。

但是,调度程序和许多其他操作系统操作不需要在64位模式下工作以处理其他问题 - 它将处理器切换到32位模式并根据需要返回以处理驱动程序,任务和内存分配和映射,中断等。

事实上,操作系统执行的大多数操作不一定能以64位运行更快 - 操作系统不是繁重的数据处理器,而是那些部分(流,磁盘I / O等)很可能转换为64位(无论如何插入操作系统)。

但裸内核本身可能不会更快地执行任务切换等,如果它是64位。

当大多数人仍在运行32位应用程序时尤其如此,因此并不总是需要模式切换,即使这是一个低开销操作,也需要一些时间。

- 亚当

答案 4 :(得分:1)

ELF32文件可以包含64位指令并以64位模式运行。它唯一具有的是标题和符号的组织是32位格式。符号表偏移量为32位。符号表条目是32位宽等。包含64位代码和32位代码的文件可以将其自身暴露为32位ELF文件,因为它使用64位寄存器进行内部计算。 mach_kernel就是这样一个可执行文件。它获得的优势是32位驱动程序ELF可以链接到它。如果它负责将位于4GB以下的指针传递给其他链接的ELF二进制文件,它将正常工作。

答案 5 :(得分:0)

内核为64位只会带来内核扩展(即通常驱动程序)可能是64位的有效优势。实际上,您需要拥有所有64位内核扩展,或者(现在的情况)所有32位内核扩展;他们需要原生于运行内核的架构。

相关问题