pec*_*nie 7 windows unix 64-bit 32-bit macos
我最近发现即使加载了 x86 内核,Mac OS X 实际上也可以运行 64 位(x64)应用程序。这是第一次让我震惊。
但后来我意识到,如果系统在 x64 兼容 CPU 下启动并运行,则无论哪个内核管理进程都无法运行 x64 应用程序,这真的很奇怪。真的有那么难吗?只需将该该死的应用程序加载到内存中并将 CPU 操作指针设置为第一个字节,就像馅饼一样简单!
正如我所想象的那样,唯一的障碍是某种“可执行标头”。不幸的是,我对 Windows 架构和二进制结构不太熟悉,所以我需要在这里做更多的解释。
事实上类UNIX操作系统二进制头标准的ELF有它的兄弟ELF64,这(如文档这里描述)没有与ELF32多大差别,但即使32位内核是无法运行的x64代码。是的,这个程序可能链接到 x64 库,假设我们只是将它们复制并粘贴到 /usr/lib64 文件夹中。但我很确定这没有帮助,为什么?
最后,Mac OS X 内核有什么特别之处,所以它不用担心使用的程序指令集?Mac OS X 是否有一些通用且适用于两个内核可执行文件的头文件,所以它只能将应用程序加载到内存中并对 CPU 说“从这里执行,我不介意它代表什么”?
PS:我真的很想把这个问题放在哪里:在 stackoverflow.com 或 superuser.com 上,并决定放在这里,因为这个主题可能是更多特定于操作系统的东西。
真正的问题是为什么其他一些操作系统不能在 32 位内核上运行 64 位二进制文件。没有根本原因为什么它不可能。底层处理器架构同时支持 64 位指令集(amd64 aka x86-64)和 32 位指令集(i386),两者一起使用没有限制(特别是没有“64 位模式”与“32 位模式”分开;有一个long 模式,它允许来自 i386 和“本机”amd64 集的指令)。
在 32 位内核上运行 64 位应用程序确实需要在内核内部做更多的工作,因为它必须管理指向用户空间的 64 位指针和指向内核空间的 32 位指针。大多数(如果不是全部)在内核中传递的指针要么已知为内核空间,要么已知为用户空间,因此如果它们的大小不同,这不是问题。主要的困难是排除了通用指针类型的可能性,该类型具有不同的进程内存、内核内存和各种硬件(包括 RAM)使用的内存的值范围,但这在最近的 32 位内核中是不可能的无论如何,在 PC 级硬件上(如果你有 4GB 或更多的 RAM,或者想要映射 2GB 的 RAM 加上 2GB 的进程空间加上内核内存等等,你需要能够映射超过 32 位'
根据您引用的维基百科文章,OSX 能够在拥有 64 位内核之前在 amd64 处理器上运行 amd64 进程。Solaris 还在 amd64 处理器上混合了 i386 和 amd64 可执行文件,无论内核是 32 位还是 64 位(两者都可用)。
其他操作系统可以在(64 位)amd64 内核上运行 i386 进程,但不能在 32 位内核上运行 amd64 进程,例如 Linux、FreeBSD、NetBSD 和 Windows。然而其他操作系统将 amd64 和 i386 视为完全不同的架构,例如 OpenBSD。
归档时间: |
|
查看次数: |
3799 次 |
最近记录: |