32位内核如何可以运行64位二进制文件?
在我的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二进制文件,它将正常工作。