X86 为ARM处理器编写操作系统

X86 为ARM处理器编写操作系统,x86,operating-system,raspberry-pi,arm,X86,Operating System,Raspberry Pi,Arm,我最近为x86体系结构开发了一个非常简单的操作系统。但后来我意识到要在更小的规模上为ARM板(如RPi)构建它 我想问一下ARM指令集与x86有什么不同 ARM板上有BIOS吗?如果没有,是否有其他方法在屏幕或视频存储器上打印输出 在Raspberry Pi上编程操作系统需要改变什么 为了了解我所知道的情况,我创建了一个简单的操作系统,它可以在屏幕上打印文字,从磁盘读取,将内核加载到内存中,并切换到32位模式。没有一个层可以与执行硬件抽象的PC BIOS相媲美,您需要为处理器中的每个特定外围设备

我最近为x86体系结构开发了一个非常简单的操作系统。但后来我意识到要在更小的规模上为ARM板(如RPi)构建它

我想问一下ARM指令集与x86有什么不同

ARM板上有BIOS吗?如果没有,是否有其他方法在屏幕或视频存储器上打印输出

在Raspberry Pi上编程操作系统需要改变什么


为了了解我所知道的情况,我创建了一个简单的操作系统,它可以在屏幕上打印文字,从磁盘读取,将内核加载到内存中,并切换到32位模式。

没有一个层可以与执行硬件抽象的PC BIOS相媲美,您需要为处理器中的每个特定外围设备/控制器实现一个驱动程序

在ARM中,大多数外围访问都是内存映射的。没有单独的I/O空间概念,也没有单独的
IN
OUT
指令,比如传统上使用的x86(尽管PC外围设备也越来越多地使用内存映射访问)

使显示器工作可能包括启用LCD控制器外围设备、写入有效的行计数、列计数和时钟分隔器值以匹配显示器支持的模式,然后写入帧缓冲区。可能会有中断需要处理,或者如果你不介意撕裂的话,你也可以不用它们。在PC机上,BIOS会写入一些有效值,在ARM上,很可能显示控制器甚至在代码中启用之前都没有启用

《编程指南》中会有一整章介绍专门用于显示外围设备的处理器芯片。此外,您可能会发现已经为引导加载程序(如u-Boot)编写了代码,在这种情况下,您可以编写操作系统,以引导加载程序配置的任何状态启动

从嵌入式工程师的角度来看,Raspberry Pi的不幸之处在于,它的大部分编程指南(和VideoCore有关的所有内容)只能通过签署NDA才能获得


如果使用其他工具包,如BeagleBone(带有TI OMAP处理器),您可能会更幸运,因为文档是公开的。

没有与PC BIOS等效的层来执行硬件抽象,您需要为处理器中的每个特定外设/控制器实现驱动程序

在ARM中,大多数外围访问都是内存映射的。没有单独的I/O空间概念,也没有单独的
IN
OUT
指令,比如传统上使用的x86(尽管PC外围设备也越来越多地使用内存映射访问)

使显示器工作可能包括启用LCD控制器外围设备、写入有效的行计数、列计数和时钟分隔器值以匹配显示器支持的模式,然后写入帧缓冲区。可能会有中断需要处理,或者如果你不介意撕裂的话,你也可以不用它们。在PC机上,BIOS会写入一些有效值,在ARM上,很可能显示控制器甚至在代码中启用之前都没有启用

《编程指南》中会有一整章介绍专门用于显示外围设备的处理器芯片。此外,您可能会发现已经为引导加载程序(如u-Boot)编写了代码,在这种情况下,您可以编写操作系统,以引导加载程序配置的任何状态启动

从嵌入式工程师的角度来看,Raspberry Pi的不幸之处在于,它的大部分编程指南(和VideoCore有关的所有内容)只能通过签署NDA才能获得

您可能会更幸运地使用其他工具包,如BeagleBone(带有TI OMAP处理器),其中的文档是公开的。

首先,“ARM”表示许多不同的处理器-它们彼此之间的差异更大,然后是8088和最新的“奔腾”-s

ARM-s指令集与x86指令集非常不同。ARM可能有两个不同的指令集(Thumb和ARM native,许多指令集只有Thumb),如果实现了这两个指令集,跳转到奇数地址会导致Thumb的执行,而跳转到偶数地址会导致ARM集的执行。它有选择性的多寄存器“push”、“pop”、“load”和“store”(例如“push{R0,R4-R11}”-x86推送一个或所有寄存器)和常规指令的条件执行(需要前缀),但它没有类似“loop”、“movsb”、段寄存器、专用索引寄存器、专用I/O指令

ARM处理器相当复杂-例如,ARMv7-M体系结构的文档超过900页(英特尔80386-126页;好吧,64位英特尔CPU“指令集参考”超过2K页,似乎任何文档都会增长,直到其大小超过预期读卡器的容量),另外一份描述片上外围设备的文档还有1500页——似乎单个芯片(不是每个芯片)的外围设备比普通PC多

就BIOS而言:我只是在探索包含LPC4370芯片的LPC-Link2(它有3个ARM CPU-s:Cortex-M4和2个Cortex-M0;只有第一个启动电源或重置,其他必须由第一个启动),它有一些BIOS-BIOS可以从“SPIFI”启动操作系统(它是一种EEPROM,1MB,位于LPC4370外部,但放在板上;SPIFI可以作为“引导设备”(代码复制到芯片的RAM中,然后执行),或者作为操作系统运行的内存(直接,不复制)-BIOS查看其内容并以这两种方式之一使用),或者通过USB(借助于在另一台机器上运行的程序,并将LPC-Link2连接为USB设备)。许多其他芯片具有闪存(芯片内部)并从中引导或运行操作系统。通常,它们有一个串行接口,可用于调试(例如,它有两个协议,在重新安装芯片时选择其中一个协议)