Linux如何运行于8位AVR微控制器?
更新记录2
太平洋夏令时(PDT),2012年4月3日凌晨1点:上传了新的源代码存档;使用内存的FPM(Fast Page Mode,快页模式)模式和修改后的i-cache(指令缓存)配置文件加快了仿真器频率(6.5KHz->10KHz);更新了移植指南,包括内核镜像、新的更小的ramdisk(虚拟磁盘)和新的完整镜像。
更新记录1
太平洋夏令时(PDT),2012年3月29日晚19点:上传了新的源代码存档;修改了Makefile,并且现在包含了一个移植指南,它可以帮助您将它移植到其他的开发板或CPU中。
简介
我们经常可以看到初学者在微控制器论坛中询问他们是否可以在他们微不足道的小的8位微机中运行Linux。这些问题的结果通常是带来笑声。我们也经常看到,在Linux论坛中,询问Linux运行的最低要求是什么。常见的答案是Linux需要一个32位架构和一个MMU(存储器管理单元),并至少1MB的RAM来满足内核的需求。本项旨在(并且成功)粉碎这些概念。下图中您所看到的开发板基于ATmega1284P。我还制作了一块基于ATmega644a的开发板,也同样获得了成功。该开发板没有使用其他处理器,启动Linux 2.6.34内核。事实上,它甚至可以运行一个完整的Ubuntu栈,包括X(如果你有时间等它启动)和gnome。
RAM(随即存取存储器)
是的,没错,完整的Linux安装需要数兆字节的RAM和32位带有MMU的CPU。本项目拥有这一切。首先,让我们访问RAM。正如您所看到的,在电路中有一块古董级的30引脚SIMM内存模块。这些是基于80286的PC曾经使用的。它通过接口和ATmega连接,我写代码来访问它并按照规格刷新它(SDRAM需要恒定速率刷新以避免丢失数据)。它到底有多快呢?刷新中断每62ms发生一次,占用时间1.5ms,因此占用3%以下的CPU。访问RAM,为了便于编程,一次访问一个字节。这样产生的最大带宽约为300KBps。
存储
对于RAM需要工作在休眠状态,我们有两件事要处理。存储并不是太难解决的问题。使用SPI可以十分容易的与SD卡交互,我的项目中做到了这一点。一个1GB的SD卡可以工作的很好,虽然512MB就已经满足这一特殊的文件系统(Ubuntu Jaunty)。ATmega拥有一个硬件SPI模块,但无论出于何种原因,它工作的不是十分顺畅,因此我将这个接口进行位拆裂。它仍然足够块——大约200KBps。这对项目来说还非常有意义——它能够在有足够管脚的任何微控制器上实现,而不用使用其他硬件模块。
CPU(中央处理单元)
所有剩下的就是那个32位CPU和MMU需求。不过AVR没有MMU,并且它是8位的。为了克服这一困难,我编写了一款ARM仿真器。ARM是我最熟悉的架构,并且它足够简单,可以让我很舒服的为它编写出一个仿真器。为什么要编写一个,而不是移植一个呢?好吧,移植别人的代码是没有乐趣的,再加上我看到没有将仿真器轻松移植到8位设备上的书面资料。原因之一:AVR编译器坚持16位处理整数将会给你带来麻烦,如简单的“(120)”,产生0。你需要用“1UL20”。不必要的说,困扰其他人的未知基本代码寻遍所有的地方,整数都被假定并将会失败,这将是一个灾难。另外,我想用这个机会编写一款很好的模块化ARM仿真器。所以我付诸行动。
其他功能
电路板通过一个串行端口和真实世界进行通信。目前,它通过串行端口连接到我PC运行的minicom上,但是它可测的替代连接是连接到电路上的一个键盘和一个字符LCD,可以使其完全独立。电路板上还有两个LED。它们指示SD卡的访问情况。一个代表读操作,一个代表写操作。电路板上还有一个按钮。当按下并按住1秒时它将使串行端口脱离仿真的CPU的当前有效速度。AVR的主频是24MHz(超过原有20MHz的轻微超频)。
它的速度有多快?
uARM肯定没有速率守护进程。它花了大约2个小时启动到BASH提示符("init=/bin/bash"内核命令行)。然后用4个多小时启动整个Ubuntu("exec init"然后登陆)。启动X将消耗更长时间。有效的仿真CPU速度约为6.5KHz,这与你期望的在一个可怜的8位微控制器上仿真一个32位CPU和MMU是同等的水平。奇怪的是,一旦启动,该系统是有些可用的。您可以输入一个命令,并在一分钟之内得到答复。也就是说实际上你是可以使用它的。比如,今天我还用它来格式化我的SD卡。这绝对不是最快的,但我觉得它可能是最便宜、最慢、最简单的手工组装、最低的部件数量以及最低端的Linux PC。电路板是使用导线手工焊接的,甚至没有使用印刷电路板(PCB)的必要。
仿真器的细节?
仿真器是相当模块化的,允许它随意扩展仿真其他SoC(片上系统)和硬件配置。仿真的CPU是ARMv5TE。前一段时间,我开始进行支持ARMv6的工
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)