我是这个主题的新手,请原谅我的无知?
我刚开始在我的linux系统上学习x86处理器的汇编。我写了一个简单的bootloader,它可以工作但是特定于x86。另外我理解寄存器等对于intel和amd或32位和64位是非常不同的。那么,如何同时为各种体系结构编写操作系统或应用程序。是应用程序是特定于操作系统的,但它们也不应该是特定于CPU的。就像将它们编译成机器代码一样,它们需要用于一种类型的处理器(因为寄存器等对于不同的架构是不同的)?那他们怎么做呢?
或者有可能所有x86都有公共寄存器和指令集,如athlon,pentium, i3,i5等只是x86和64位架构之间的区别?
答案 0 :(得分:0)
你在最后说的是正确的 - 所有x86都有一套共同的指令,尽管它在幕后所做的细节显然是非常不同的。例如,在Intel硬件上,您实际上有隐藏的寄存器,而x86汇编指令实际上无法访问这些寄存器。
以汇编语言编写的操作系统部分需要针对不同体系结构的不同汇编指令(x86与PPC对比ARM等...)
用c编写的操作系统部分也可能有一些差异,例如,当移动到x64时,您不能再认为指针是4个字节。为了处理C级别的这些差异,代码通常会使用大量#ifdef来处理差异。
这当然是一个非常大的主题,上面只是一个非常概括的概述。
答案 1 :(得分:0)
当您开始查看低级代码(例如启动代码,内核等)时,高级语言代码可移植的想法是无稽之谈。有很多东西,不同的CPU需要不同的代码,但没有高级语言支持。这包括切换CPU模式,设置分页,存储/加载任务状态(在任务切换期间)等。
要解决此问题,最终会使用非可移植代码(程序集)。对于内核代码,这通常意味着使用条件代码(例如#ifdef i386
)之类的东西,并将非可移植部分转换为特殊的(CPU /体系结构特定的)目录;这样大多数代码都是可移植的(但是每个不同的情况都需要重写一小部分)。
这同样适用于启动代码;但是这里有点麻烦,因为可能有几个不同的"预启动环境" (例如BIOS和UEFI)用于完全相同的CPU。我想每个人都以不同的方式处理这个问题。
请注意,80x86具有历史相关的"寄存器和指令集。这并不意味着相同的代码可以在所有80x86 CPU(甚至是不同模式下的相同CPU)上运行。有几种模式(主要是16位,32位和64位)需要不同的代码,然后有几个扩展(3DNow,MMX,SSE,AVX)添加额外的寄存器并可能或者可能不存在。还有部分CPU(例如性能监控),它们是特定型号的#34;。