2014-02-24 51 views
3

我对这个主题感到陌生,所以原谅我的无知?不同体系结构的操作系统汇编语言

我刚开始在我的linux系统上学习x86处理器的程序集。我写了一个简单的引导程序,它可以工作,但是特定于x86。我也明白寄存器等对于intel和amd或32位和64位是非常不同的。那么如何在同一时间为各种体系结构编写一个操作系统或应用程序。是的应用程序是特定于操作系统的,但是它们不应该是CPU特有的。就像它们被编译成机器代码时一样,它们需要用于一种类型的处理器(因为不同架构的寄存器等不同)?那么他们如何做到这一点?

还是有可能所有的x86都有公共寄存器和指令集,如athlon,pentium, i3,i5等,它只是在x86和64位架构不同?

+0

如今许多当前的处理器仍然可以处理x86程序,即使它们的体系结构是x64,如果您打算在x64和x86上制作软件,请将其转换为x86体系结构。 –

回答

0

你说的最后是正确的 - 所有的x86都有一套通用的指令,虽然它在引擎盖下做的细节显然是非常不同的。例如,在英特尔硬件上,实际上有隐藏的寄存器,x86汇编指令实际上无法访问。

的操作系统被写入组件将需要为不同的体系结构不同的汇编指令的部件(86 VS PPC VS ARM等...)

被用C语言编写的操作系统的部分可以也有一些差异,例如,当移动到x64时,您不能再假定指针是4个字节。为了处理C级别的这些差异,代码通常会使用大量的#ifdefs来处理差异。

这当然是一个非常大的话题,上面只是一个非常概括的概述。

+0

x86中的x有一些历史记录 - 最初是8086指令集。然后80186,80286,80386等......每一套都引入了新的功能。例如80386引入了32位寄存器。 该指令集旨在向后兼容。在8到16到32到64位的情况下,寄存器名称保持“增长” rax是64位寄存器,eax是低32位,ax是低16位,al是低8位。这样x86指令使用eax仍然可以在x64 CPU上工作 – thisisdog

+0

谢谢..随着组装事情变得更清晰的内部工作......一直在尝试高级语言但不知道到现在为止发生了什么..再次感谢 – MYNE

+0

在汇编编码中有代码16来使代码16位。那么这是什么告诉处理器使用哪种体系结构,如16位或32位或64位?像我们不能混合使用这两种权利? – MYNE

0

当您开始查看底层代码(例如引导代码,内核等)时,高级语言代码可移植的想法是无稽之谈。有很多不同的CPU需要不同的代码,但没有高级语言支持。这包括切换CPU模式,设置分页,存储/加载任务状态(在任务切换期间)等。

要解决此问题,最终使用非可移植代码(assembly)。对于内核代码,这通常意味着使用诸如条件代码之类的东西(例如#ifdef i386)并且将不可移植的部分转换为特殊的(CPU /架构特定的)目录;因此大部分代码都是可移植的(但是对于不同的情况,必须重新编写一小部分代码)。

这同样适用于启动代码;但是在这里它会变得更加混乱,因为对于完全相同的CPU,可能有几种不同的“预引导环境”(例如BIOS和UEFI)。我认为每个人都以各自不同的方式处理这个问题。

请注意,80x86具有“历史相关”寄存器和指令集。这并不意味着相同的代码可以在所有80x86 CPU上工作(或者甚至是不同模式下的相同CPU)。有几种模式(主要是16位,32位和64位)需要不同的代码,然后有几个扩展(3DNow,MMX,SSE,AVX),可以添加额外的寄存器,可能存在也可能不存在。还有一部分CPU(例如性能监控)是“特定型号”。

+0

PC的引导代码以16位实模式运行,但在指令上使用前缀根据需要获取32位操作数。几年前,BIOS要求磁盘I/O扩展为使用64位地址作为扇区地址,但它仍然处于16位模式,所以必须在前1 MB内存中读取数据。有一个BIOS调用切换到保护模式,该模式需要指向X86特定的表来执行此操作,这将切换到32位或64位保护模式。 – rcgldr

+0

@rcgldr:没有人使用过这个BIOS功能(你自己更容易做模式切换),它永远不会支持64位(这需要分页)。具有UEFI的PC的启动代码通常是64位代码(但对于较早的32位UEFI系统,则需要32位代码)。 BIOS目前已被弃用;但即使对于BIOS,通常您也会在BIOS功能中使用“thunking wrapper”,这样您就可以在大多数启动代码中使用32位保护模式。 – Brendan

+0

“BIOS目前已被弃用” - 当前操作系统可能不使用BIOS功能切换到保护模式,但我不知道SATA,USB软盘或网络设备的标准编程接口,所以如何是在启动时为这些设备执行的I/O而不使用BIOS? – rcgldr