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

时间:2020-03-05 18:49:25  来源:igfitidea点击:

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

解决方案

回答

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

二进制确实会调用库函数,而这些函数必须是64位的。而且,如果他们需要进行系统调用,则他们有责任解决自己本身是64位而内核只有32位这一事实。

但这不是我们不必担心的事情。

回答

对于内核为64位只会带来有效的优势,即内核扩展(即通常为驱动程序)可以是64位。实际上,我们将需要具有所有64位内核扩展,或者具有(现在是所有情况)所有32位内核扩展;或者,我们需要具有所有32位内核扩展。它们必须是正在运行的内核体系结构的本机。

回答

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

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

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

回答

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

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

实际上,操作系统所做的大多数事情都不一定能够以64位运行的更快速度,而操作系统并不是繁重的数据处理器,并且那些部分(流,磁盘I / O等)可能会转换为64位(无论如何都已插入操作系统)。

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

在大多数人仍在运行32位应用程序的情况下尤其如此,因此,尽管这是一项低开销的操作,但并非总是需要模式切换,但这确实需要一些时间。

-亚当

回答

请注意,并非所有的32位内核都能够运行64位进程。 Windows当然没有此属性,而且我从未在Linux上见过它。

回答

ELF32文件可以包含64位指令,并以64位模式运行。唯一的问题是标头和符号的组织采用32位格式。符号表的偏移量是32位。符号表条目为32位宽等。同时包含64位代码和32位代码的文件可以将其自身显示为32位ELF文件,其中使用64位寄存器进行内部计算。 mach_kernel就是这样一种可执行文件。它获得的好处是32位驱动器ELF可以链接到它。如果照顾到将位于4GB以下的指针传递给其他链接的ELF二进制文件,它将正常工作。