为ARM处理器编写OS

时间:2016-09-17 03:50:44

标签: x86 operating-system raspberry-pi arm

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

我想问一下x86的ARM指令集有多么不同?

甚至在ARM主板上还有BIOS吗?如果没有,还有其他方法可以在屏幕或视频内存上打印输出吗?

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

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

2 个答案:

答案 0 :(得分:4)

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

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

使显示器工作可能包括启用LCD控制器外设,写入有效行数,列数和时钟分频器值以匹配显示器支持的模式,然后写入帧缓冲器。如果您不介意撕裂,可能会有中断处理,或者您可以在没有它们的情况下处理。在PC上,BIOS会在ARM上写入一些有效值,在您的代码中执行此操作之前,显示控制器可能都没有启用。

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

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

使用BeagleBone(带有TI OMAP处理器)等其他套件可能会更好运,其中可以公开获取文档。

答案 1 :(得分:0)

首先,“ARM”表示许多不同的处理器 - 它们彼此不同,首先是8088和最新的“Pentium”-s。

ARM-s指令集非常与x86指令集不同。 ARM可能有两个不同的指令集(Thumb和ARM本机,许多只有Thumb),如果两者都实现,跳转到奇数地址会导致执行Thumb,而跳转到偶数地址会导致执行ARM设置。它具有选择性多寄存器“push”,“pop”,“load”和“store”(例如“push {R0,R4-R11}” - x86推送一个或所有寄存器)和条件执行常用指令(需要前缀) ),但它没有像“循环”,“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然后执行),或者作为运行OS的存储器(直接,不复制) - BIOS查看其内容并以这两种方式之一使用它,或者通过USB(借助在另一台机器上运行的程序并将LPC-Link2连接为USB设备)。许多其他芯片具有FLASH存储器(芯片内部)并从中启动或运行OS。通常它们有一个可用于调试的串行接口(它有两个协议,其中一个在芯片复位时被选中)。

相关问题