Hello China操作系统移植指南
首先说明一下,为了适应更多的文化背景,对Hello China操作系统的名字做了修改,修改为“Hello X”,或者连接在一起,写为“HelloX“。其中X是不固定的,可以根据具体应用的国家,甚至城市,进行定制化。比如在中国,我仍然会叫做”Hello China“,但是如果有人在美国使用了,则可以叫做”Hello USA“,在香港使用了,可以叫做”Hello Hongkong“,等等。但这些都是HelloX的分支,必须明确说明。这样做,主要目的是为了Hello China操作系统的全球化推广,后续将作为开源项目托管到github上,届时任何国家和地区的人都可以参与开发。
经过一段时间的尝试,现在已经成功把Hello China V1.76版的内核代码,移植到STM32芯片上。本文就对这个移植过程进行详细说明。在正式介绍移植步骤之前,先说明一下移植原理。
STM32移植原理
STM32芯片是ST公司开发的基于Cortex-M3 CPU(ARM系列)的SoC,在各行各业中得到了广泛的应用。往STM32上移植,本质上就是向Cortex-M3 CPU上的移植,移植后的内核,可以很容易的再移植到其它基于Cortex-M3 CPU的芯片上。关于STM32更多的背景及特性等,这里就不多说了。为了更好的理解下面的内容,建议读者先了解一下Cortex-M3 CPU的一些基础机制,这样阅读起来更加容易。
如果您一直在x86系列CPU上做开发,那么当接触到ARM系列CPU的时候,您会发现非常容易。ARM CPU非常简洁,逻辑比x86简单得多。根据我个人的经验,x86CPU的保护模式编程,比实模式编程要简单,而ARM CPU的编程,则比x86的保护模式更简单。虽然模型简单了,但由于指令系统不同,对中断/异常的处理机制也不一样,导致移植过程并不是很容易。主要集中在下列几个方面:
中断机制的移植
首先是中断处理机制的移植,这是任何操作系统向不同CPU上的移植,都需要涉及到的问题。x86 CPU采用中断描述表的方式,每个中断占用一个表项,表里面记录了处理中断的中断向量(函数)。一旦中断发生,CPU会调用对应中断号的中断向量。Cortex-M3CPU的中断机制与此基本类似,但是其中断向量表却简单得多,不像x86一样,内嵌了很多的控制信息。而且Cortex-M3的中断向量表的位置是固定的,就是在物理内存的起始处。Hello China在设计的时候,为了兼容多种CPU,其中断机制采用了“统一入口”的形式。即针对CPU的所有中断向量表,都填写一个唯一的入口-GeneralIntHandler,这个入口由Hello China操作系统实现。然后GeneralIntHandler再根据实际的中断向量号,调用具体的中断处理程序。这样的机制,可以适应大多数CPU的需求。因为有的CPU只有一个中断向量表,不像x86那样,每个中断都有向量表对应。因此在把中断处理机制移植到Cortex-M3的时候,必须要把每个中断向量跟GeneralIntHandler链接起来。下面是Cortex-M3的典型中断向量表结构:
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Han