Darwin内核架构和OS X,32位内核的64位运行,这是如何实现的?

3

据Activity Monitor报告,OS X Lion(10.7)操作系统主要运行在64位二进制文件上。 鉴于这一点,以及我的笔记本电脑运行的是32位EFI版本和32位内核,那么通常情况下,架构混合是如何工作的呢?

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

通常情况下,人们会在x86_64上运行32位二进制文件,但反过来则需要将CPU推入64位模式,据我所知,这是无法撤消的。

希望我的回答足够清晰明了。

2个回答

4

x86-64架构非常复杂,它不仅有64位模式和32位模式,还有两种主要模式(长模式和遗留模式),每种模式下又有多个子模式(请参见维基百科文章)。

在遗留模式下,CPU基本上模拟了一个32位CPU。它有各种子模式(实模式、保护模式等),但无法切换使用64位指令或寻址。通常,不支持64位的操作系统会在此模式下运行。

在长模式下,CPU 具有 64 位能力,但也可以在 32 位和 16 位的“兼容性”模式下运行。模式切换由代码段描述符中的 L 和 D 标志控制(请参见this PDF中的“扩展 x86 到 64 位世界”)-- 实际上,不同的内存段可以标记为包含 64 位、32 位或 16 位代码,并且 CPU 将切换到当前正在运行的代码段所适用的适当模式。内核的代码段可以独立于运行应用程序的代码段被标记为 64 位或 32 位。
因此,原则上很简单。实际上,我相信有很多我不知道的复杂情况(我对上下文切换过程并不是很了解),但只要操作系统“知道”它正在运行在一个 64 位的 CPU 上,并适当地配置代码段描述符,就没有在 32 位内核下运行 64 位进程的根本问题。
顺便提一下,OS X也可以在PowerPC G5 CPU上的32位内核下运行64位进程,最早版本是10.3。PPC CPU有完全不同的架构,我不知道其中的模式切换是如何工作的。

1

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

Lion内核通常默认以64位模式运行,除非你强制它以32位模式运行。

你所谓的“架构混合”是由x86_64标准保证的。
64位模式完全向后兼容32位代码。

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

编辑

显然,Mac OS X没有整体的32/64位CPU模式。
我真的不知道这是如何可能的,以及它如何在CPU内部管理这些东西。

但似乎每个程序都在其“最佳模式”下运行。
所以我错了,64位本机代码可以在32位内核上运行...

会继续探索... : )


感谢您的回答。显然,我的系统始终启动32位内核,如uname所报告的那样。我的问题更多地是关于64位代码如何在32位内核上运行的可能性。我知道相反的情况很常见,例如在Linux、Win等操作系统中。 - overscore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接