2008-09-08 115 views
24

在我的OS X机器上,内核是一个32位的二进制文件,但它可以运行一个64位的二进制文件。 这是如何工作的?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 
+0

[OSX在32位内核上运行时如何运行64位二进制文​​件?](https://superuser.com/q/340549/241386) – 2017-05-03 04:33:46

回答

43

CPU可以从64位执行模式切换到32位时,它捕获到内核上下文,和一个32位内核仍然可以构造成理解来自64位用户空间的应用通过在结构中。

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

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

6

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

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

但是,这不是你不必担心的。

0

对于内核为64位只会带来的有效优点,即内核扩展(即,通常的驱动程序)可以是64位。事实上,你需要拥有所有的64位内核扩展,或者(现在就是这样)所有的32位内核扩展;它们需要是运行内核的体系结构本地的。

+0

只要有便宜的硬件需要便宜的第三方驱动程序,则不需要预计很快就会发生64位内核:-) – pilif 2008-09-08 15:33:23

+0

64位Windows需要64位驱动程序,并且内核以64位模式运行。您无法在64位Windows上运行32位驱动程序。上面的例子是OS X,它没有单独的32位和64位版本(只能在64位的32位内核上运行64位应用程序)。 – 2008-09-08 15:35:42

+0

NT和OSX都在微内核上运行,当消息传递时它们可以执行64位模式切换。它会减慢速度。 – 2008-09-26 18:15:35

2

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

但是,调度程序和许多其他操作系统操作不需要在64位模式下工作以处理其他问题 - 它将处理器切换到32位模式并根据需要返回以处理驱动程序,任务,内存分配和映射,中断等等。实际上,操作系统所做的大多数事情并不一定会在64位上执行更快的运行 - 操作系统并不是一个沉重的数据处理器,而那些是(流,磁盘I/O等)可能会转换为64位(无论如何,插件到操作系统)。

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

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

- 亚当

6

请注意,并非所有位内核能够运行64位的处理。 Windows肯定没有这个属性,我从来没有看到它在Linux上完成。

1

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

相关问题