达尔文内核体系结构和操作系统X,64位对32位内核,这是如何工作的



根据活动监视器的报告,OS X Lion(10.7)操作系统主要运行在64位二进制文件上。考虑到这一点,以及我的笔记本电脑运行32位版本的EFI,因此也运行32位内核的事实,arch混合通常是如何工作的?

Darwin Kernel Version 11.3.0: Thu Jan 12 18:48:32 PST 2012; root:xnu-1699.24.23~1/RELEASE_I386

通常情况下,人们会在x86_64上运行32b二进制文件,但另一种方式则需要将cpu推入64b模式,而AFAIK无法撤消。

希望这个问题足够清楚。。

x86-64体系结构相当复杂;它不仅有一个64位模式和一个32位模式,它还有两个主要模式(long和legacy),每个模式都有许多子模式(参见维基百科的文章)。

在传统模式下,CPU基本上模拟32位CPU。它有各种子模式(真实、受保护等),但不能使用64位指令或寻址进行切换。一般来说,非64位操作系统将在这种模式下运行。

在长模式下,CPU具有64位功能,但也可以在32位和16位"兼容"模式下运行。模式切换由代码段描述符中的L和D标志控制(请参阅本PDF中的"为64位世界扩展x86")——本质上,内存的不同部分可以标记为包含64位、32位或16位代码,CPU切换到当前运行的代码段的适当模式。内核的代码段可以标记为64位或32位,与运行应用程序的代码段无关。

所以原则上,这很简单。在实践中,我确信有很多我不知道的复杂情况(我真的不太了解上下文切换过程),但只要操作系统"知道"它在64位CPU上运行,并适当地配置代码段描述符,在32位内核下运行64位进程就没有根本问题。

顺便说一句,OS X还可以在PowerPC G5 CPU上的32位内核下运行64位进程,最早可以追溯到10.3版本。PPC CPU有一个完全不同的体系结构,我不知道模式切换是如何工作的。

EFI和内核是两个独立的东西
您可以拥有一个32位EFI和一个64位内核。这不是重点。。。

Lions的内核默认情况下通常以64位模式运行,除非您强制它以32位模式运行。

您所说的"拱形混合"是由x86_64标准保证的
64位模式与32位代码完全向后兼容。

在32位模式下运行64位代码是不可能的
但苹果的Mach-O格式解决了这个问题,因为你可以构建提供32位和64位代码的二进制文件。

编辑

显然,MacOSX并没有一个整体32/64位的CPU模式
我真的不知道这是怎么可能的,也不知道它是如何用CPU内部管理这些东西的。

但似乎每个程序都是在其"尽可能好的模式"下运行的
所以我错了,64位原生代码可以用32位内核运行。。。

将尝试进一步查看…:)

最新更新