当前位置:  开发笔记 > 运维 > 正文

为什么32位内核可以运行64位二进制文​​件?

如何解决《为什么32位内核可以运行64位二进制文​​件?》经验,为你挑选了3个好方法。

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

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

DGentry.. 44

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

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

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



1> DGentry..:

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

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

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



2> pilif..:

它不是运行二进制文件的内核.这是处理器.

二进制文件调用库函数,那些函数需要为64位.如果他们需要进行系统调用,他们有责任应对他们自己是64位的事实,但内核只有32位.

但这不是你不必担心的事情.



3> Adam Mitz..:

请注意,并非所有 32位内核都能够运行64位进程.Windows肯定没有这个属性,我从未在Linux上看到它.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有