【问题标题】:Writing OS for ARM Processors为 ARM 处理器编写操作系统
【发布时间】:2017-01-25 08:13:55
【问题描述】:
我最近为 x86 架构开发了一个非常简单的操作系统。但后来我意识到要为 ARM 板(如 RPi)构建更小规模的。
我想问一下,ARM指令集和x86有什么不同?
ARM 板上是否有任何 BIOS?如果没有,还有其他方法可以在屏幕或视频内存上打印输出吗?
在 Raspberry Pi 上对操作系统进行编程需要做哪些更改?
了解一下我所知道的 - 我创建了一个简单的操作系统,它可以在屏幕上打印文字、从磁盘读取并将内核加载到内存中并切换到 32 位模式。
【问题讨论】:
标签:
x86
operating-system
raspberry-pi
arm
【解决方案1】:
没有与执行硬件抽象的 PC BIOS 等效的层,您需要为处理器中存在的每个特定外围设备/控制器实现驱动程序。
在 ARM 中,大多数外设访问都是内存映射的。没有单独的 I/O 空间的概念,也没有像传统上使用的 x86 那样的单独的 IN 和 OUT 指令(尽管 PC 外围设备也越来越多地使用内存映射访问)。
让显示器工作可能包括启用 LCD 控制器外设、写入有效的行数、列数和时钟分频器值以匹配您的显示器支持的模式,然后写入帧缓冲区。可能会有中断需要处理,或者如果你不介意撕裂,你可以不用它们。在 PC 上,BIOS 会写入一些有效值,在 ARM 上,很可能在您在代码中执行之前,甚至不会启用显示控制器。
您的处理器芯片的编程指南中将有一整章专门用于显示外围设备。此外,您可能会发现已经为 u-Boot 等引导加载程序编写了代码,在这种情况下,您可以编写操作系统以启动引导加载程序配置的任何状态。
从嵌入式工程师的角度来看,Raspberry Pi 的不幸之处在于其编程指南的大部分内容(与 VideoCore 相关的所有内容)只能通过签署 NDA 获得。
如果使用其他套件之一,例如 BeagleBone(带有 TI OMAP 处理器),您可能会更幸运,因为该套件的文档是公开的。
【解决方案2】:
首先,“ARM”表示许多不同的处理器 - 它们彼此之间的差异更大,然后是 8088 和最新的“Pentium”-s。
ARM-s 指令集与 x86 的指令集非常不同。 ARM 可能有两个不同的指令集(Thumb 和 ARM 本机,许多只有 Thumb),如果两者都实现,跳转到奇数地址会导致执行 Thumb,而跳转到偶数地址会导致执行手臂套装。它具有选择性的多寄存器“push”、“pop”、“load”和“store”(例如“push {R0,R4-R11}” - x86 推送一个或所有寄存器)和条件执行通常的指令(需要前缀),但它没有“循环”、“movsb”、段寄存器、专用索引寄存器、专用 I/O 指令之类的东西...
ARM 处理器相当复杂 - 例如。 ARMv7-M 架构的文档有超过 900 页(Intel 80386 - 126 页;嗯,64 位 Intel 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 设备连接)。许多其他芯片具有闪存(芯片内部)并从中启动或运行操作系统。通常它们有一个可用于调试的串行接口(它有例如 2 个协议,其中一个在芯片复位时被选择)。