26

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

cristi:~ diciu$ 文件 ./a.out
./a.out:Mach-O 64 位可执行 x86_64
cristi:~ diciu$ 文件 /mach_kernel
/mach_kernel:具有 2 个架构的 Mach-O 通用二进制文件
/mach_kernel(用于架构 i386):Mach-O 可执行 i386
/mach_kernel(用于架构 ppc):Mach-O 可执行 ppc
克里斯蒂:~ diciu$ ./a.out
克里斯蒂:~ diciu$ echo $?
1
4

6 回答 6

44

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

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

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

于 2008-09-08T15:34:59.263 回答
6

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

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

但这不是您必须担心的事情。

于 2008-09-08T15:27:46.753 回答
6

请注意,并非所有32 位内核都能够运行 64 位进程。Windows 肯定没有这个属性,而且我从未见过它在 Linux 上完成。

于 2008-09-10T07:06:04.103 回答
2

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

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

事实上,操作系统所做的大多数事情不一定会在 64 位上运行得更快——操作系统不是一个重型数据处理器,那些部分(流、磁盘 I/O 等)可能会被转换到 64 位(无论如何都是操作系统的插件)。

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

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

-亚当

于 2008-09-08T15:50:56.840 回答
1

An ELF32 file can contain 64bit instructions and run in 64 bit mode. Only thing it is having is that organization of header and symbols are in 32bit format. Symbols table offsets are 32 bits. Symbol table entries are 32 bit wide etc. A file which contain both 64 bit code and 32 bit code can expose itself as 32 bit ELF file wheres it uses 64 bit registors for its internal calculations. mach_kernel is one such executable. Advantage it get is that 32 bit driver ELFs can linked to it. If it take care of passing pointers which are located below 4GBs to other linked ELF binaries it will work fine.

于 2009-06-17T13:44:57.447 回答
0

内核为 64 位只会带来内核扩展(即,通常是驱动程序)可以是 64 位的有效优势。事实上,您需要拥有全部 64 位内核扩展,或者(就像现在一样)全部 32 位;它们需要是正在运行的内核架构的本机。

于 2008-09-08T15:32:08.757 回答