32位内核如何运行64位二进制文件?

26

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

1
OSX在运行32位内核的同时如何运行64位二进制文件? - phuclv
6个回答

45

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

不管怎样,MacOS X内核都不直接从用户应用程序中解引用指针,因为它存在自己独立的地址空间。例如,在ioctl调用中的用户空间指针必须先解析为其物理地址,然后在内核地址空间中创建一个新的虚拟地址。无论ioctl中的指针是64位还是32位,内核都不会直接解引用它。

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


1
这是否意味着32位内核必须意识到64位指针,因为它必须进行转换? - Alex B

7

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

二进制文件会调用库函数,这些函数需要是64位的。如果它们需要进行系统调用,那么它们需要自己处理这样一个事实:它们自己是64位的,但内核只有32位。

但这不是你需要担心的事情。


7
请注意,并非所有32位内核都能运行64位进程。Windows显然没有这个属性,我从未在Linux上看到过这样的情况。

1
主题行不行,但osx标签可以。 - gabr
明白了--我错过了那个。希望这个比较对其他遇到这个问题的人有用。我会稍微编辑一下文本。 - Adam Mitz
2
Linus永远不会允许这个功能进入Linux,他甚至因PAE发脾气。 - Aaron Franke

2
能够加载和运行64位二进制文件的32位内核必须具有一些64位代码来处理内存映射、程序加载和其他一些64位问题。然而,调度程序和许多其他操作系统操作不需要在64位模式下工作,以处理其他问题 - 它会根据需要将处理器切换到32位模式和返回,以处理驱动程序、任务、内存分配和映射、中断等。实际上,操作系统执行的大部分任务在64位模式下并不一定会更快 - 操作系统不是一个重型数据处理器,而那些需要(流、磁盘I/O等)的部分可能已经转换为64位(OS的插件)。但是裸内核本身如果是64位的话,它可能不会在任务切换等方面表现得更快。特别是当大多数人仍在运行32位应用程序时,因此不总是需要模式切换,即使这是一个低开销的操作,它也需要一些时间。-Adam

1

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


实际上有一段时间,MacOS 运行内核的大部分都是在 32 位模式下运行的,我想。或者那只是 Solaris?无论如何,我认为这在某种程度上是为了驱动程序的兼容性。(第一批 x86 Mac 不支持 64 位模式,所以不幸的是他们用 32 位代码库开始了一切。)我不知道 MacOS 是否仍然在内核中使用 32 位模式;我怀疑不会。 - Peter Cordes

0

内核变为64位只会带来这样一个有效的好处,即内核扩展(例如,通常是驱动程序)可以是64位的。实际上,您需要拥有所有64位内核扩展,或者(像现在一样)所有32位扩展;它们需要与运行内核的体系结构相适应。


只要还有需要廉价第三方驱动程序的廉价硬件存在,就不要指望64位内核很快出现 :-) - pilif
64位Windows需要64位驱动程序,内核以64位模式运行。您不能在64位Windows上运行32位驱动程序。上面的示例是OS X,它没有单独的32比特和64比特版本(只能在带有32位内核的x64上运行64位应用程序)。 - Brad Wilson
NT和OSX都运行在微内核上,这种情况下在消息传递时可以进行32<->64位模式切换。但是这样会减慢速度。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接