操作系统内核的构建能否同时在x86和ARM上运行?

操作系统内核的构建能否同时在x86和ARM上运行?,x86,kernel,arm,cpu,instruction-set,X86,Kernel,Arm,Cpu,Instruction Set,我的意思是:这个构建(包括x86和ARM架构驱动程序)可以在x86计算机上运行,也可以在其他ARM设备上运行 我知道现在没有这样的CPU支持这两种指令集。但从理论上讲,这会成为现实吗?通电后,CPU可以检查程序所在的指令集?我认为这不会实现。我的理由是: -编译一个程序的两个版本更容易,在安装过程中,它可以决定是在ARM还是x86平台上 如果您正在查看32位命令。它们被大量使用,您需要将指令集增加一倍,这将降低CPU的效率。如果你运气不好,32位的指令集会满足你的需要,所以你必须改成33位,这

我的意思是:这个构建(包括x86和ARM架构驱动程序)可以在x86计算机上运行,也可以在其他ARM设备上运行


我知道现在没有这样的CPU支持这两种指令集。但从理论上讲,这会成为现实吗?通电后,CPU可以检查程序所在的指令集?

我认为这不会实现。我的理由是: -编译一个程序的两个版本更容易,在安装过程中,它可以决定是在ARM还是x86平台上

  • 如果您正在查看32位命令。它们被大量使用,您需要将指令集增加一倍,这将降低CPU的效率。如果你运气不好,32位的指令集会满足你的需要,所以你必须改成33位,这会非常尴尬

  • 真的,我不明白你为什么要这么做。这只会导致效率低下


我不认为如此,有可能在两个指令集中写入内核,并且有一个特殊的启动代码,在两个架构上执行不同的操作,这两种架构都会为Architecture激发适当的内核。

让我们假设可以完成。需要做些什么

嗯,您需要编译整个内核两次,一次使用x86,一次使用ARM操作码(组装后的汇编程序)。好的,那么我们只需要一个小程序,查询我们使用的是哪个CPU,然后分支到x86版本或ARM版本

哎呀,这是一个引导问题。为了确定要使用哪个版本,您将使用这两个操作码中的哪一个?ARM或x86—请记住,它需要同时在这两个平台上运行

这是可能的。分支指令的编码可能是nop或ARM上的某个东西。所以现在我可以让x86和ARM的第一条指令都不同了——其中一条分支很短,我现在知道它是x86,并从那里跳到我的x86内核。而另一个则不接受分支,并会陷入下面的代码,然后分支到ARM版本(反之亦然)

这将是一个很棒的代码技巧


但你为什么要这么做?你会有一半的内核在内存中没有被使用(也许你可以把它换成磁盘)。您也可以从一开始就为正确的目标编译。(此外,我不确定是否有任何工具可以让你编译两个内核并将它们放在一个映像中,但如果你入侵了自己的链接器,就可以做到这一点)。

这主要是一个引导加载程序中的支持问题,以及加载后操作系统会做什么。这不仅在理论上是可能的,10.6.x-10.7.x版本的OSX内核(
/mach_kernel
)以通用i386/x86_64二进制文件的形式出现:

$ file /Volumes/KernelDebugKit/mach_kernel
/Volumes/KernelDebugKit/mach_kernel: Mach-O universal binary with 2 architectures
/Volumes/KernelDebugKit/mach_kernel (for architecture x86_64):  Mach-O 64-bit executable x86_64
/Volumes/KernelDebugKit/mach_kernel (for architecture i386):    Mach-O executable i386
10.5.x内核甚至是i386/PowerPC通用二进制文件:

$file /Volumes/KernelDebugKit/mach_kernel
/Volumes/KernelDebugKit/mach_kernel: Mach-O universal binary with 2 architectures
/Volumes/KernelDebugKit/mach_kernel (for architecture i386):    Mach-O executable i386
/Volumes/KernelDebugKit/mach_kernel (for architecture ppc): Mach-O executable ppc
引导加载程序(苹果的EFI固件实现(x86)或OSX的OpenFirmware(ppc))需要支持“fat”二进制格式,并能够决定并运行正确的格式。当然,一旦加载内核,它需要操作系统其余部分的整个支持基础设施以兼容的格式提供,以便做任何有用的事情

请注意,较旧版本的OSX甚至附带了“Rosetta”,这是一种用于在x86/x86-64 CPU上运行PowerPC二进制文件的运行时二进制翻译系统

明确地说,x86和ppc版本的内核存储在同一个文件中是完全不相关的。

这是可能的

除了dave和其他海报上的答案之外,我还编写了一个python脚本,它将产生在x86和ARM上运行的代码技巧,这将根据启动的不同而采用不同的路径

我不熟悉x86,所以如果这不起作用,请原谅我

导入系统 导入结构 输入数学 armClobberReg=0 臂移=31 如果(armClobberReg>15): sys.stderr.write(“错误!ARM缓冲寄存器无效\n”) 系统出口(-1) 如果(armClobberReg==15): sys.stderr.write(“警告:r15将在ARM上受到重击\n”) 如果(臂移&1!=1或臂移>31): sys.stderr.write(“警告!手臂移位无效。请改用31\n”) 臂移=31 jmpOffset=(armClobberReg1)
jmpAndEqNopInstruction=struct.pack(“OSX就是这么做的,内核包含了所有受支持体系结构的代码,还有一些特殊的引导代码,可以让当前体系结构的所有东西都启动并运行起来。你的问题让人困惑。你的第一段问:我们可以构建一个运行在x86和ARM上的内核吗?你的第二段提出了一个完全不同的问题:“我们可以构建一个CPU来计算程序使用的ISA,并相应地改变它的行为吗?”?"。谢谢。在第二段中,我提出了一种方法,可以实现内核同时在两种体系结构上运行。请参阅,了解根据ISA将分支到不同位置并将相对分支到附近地址的polyglot ARM/x86机器代码。re:如何处理另一半内存?x86内核只需标记ARM内核即可l内存区域为空闲,并将其用于动态分配,或将其归零并将其用作其BSS。反之亦然。现代Linux将一些函数标记为“init”,并将它们组合在一个init部分中,在它们达到目的后,可以将其释放。(释放内核块意味着将其添加到分配器的空闲列表中。)