关于C#:为什么32位内核可以运行64位二进制文??件?

关于C#:为什么32位内核可以运行64位二进制文??件?

How come a 32 bit kernel can run a 64 bit binary?

在我的OS X机器上,内核是32位二进制文??件,但它可以运行64位二进制文??件。
这是怎么工作的?

1
2
3
4
5
6
7
8
9
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

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

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

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


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


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

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

但是您不必担心。


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

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

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

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

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

-亚当


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


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


推荐阅读