标题：SkyEye
简介
SkyEye是一个指令级模拟器，可以模拟多种嵌入式开发板，可支持多种CPU指令集，在SkyEye上运行的操作系统意识不到它是在一个虚拟的环 境中运行，而且开发人员可以通过SkyEye调试操作系统和系统软件。由于SkyEye的目标不是验证硬件逻辑，而是协助开发、调试和学习系统软件，所以 在实现上SkyEye与真实的硬件环境相比还是有一定差别的。SkyEye在时钟节拍的时序上不保证与硬件完全相同，对软件透明的一些硬件仿真进行了一定 的简化。这样带来的好处是SkyEye的执行效率更高。[1]
发展历程
背景如果你看过电影"黑客帝国"（又称"matrix"），相信电影描述的虚幻世界会深深地吸引你，至少它是我们看过最有想象力的科幻电影之一。也许我们可以把SkyEye看作一个"matrix "，把运行在SkyEye上的各种程序看成是这个"matrix"中的芸芸众生。我们创造SkyEye和编写运行在SkyEye上运行的程序就是为了洞悉计算机的奥秘，尝尝当"造物主"的感觉。当看到各种软件Linux、μCLinux、μC/OS-II...在SkyEye上"愉快"地运行时，那种感觉真是太奇妙了。 对于那些想进行嵌入式系统软件开发和学习，或者想研究嵌入式Linux等操作系统和一些底层系统软件（如TCP/IP等）的研究和开发人员来说，可能存在如下几方面的问题：
（1）经常苦于经费不足，缺少足够的硬件开发板和完善的软件开发环境，相关的书籍对一些最新软件的分析还不够全面，无法深入研究和开发嵌入式软件。
（2）高层次的软件设计和开发一般不用太考虑底层硬件的实现细节，如果直接处于一个具体的硬件环境下，在开发和研究中可能会陷入硬件的具体细节中不能自拔，而不能把精力放到高层次的软件设计和开发上。
（3）如果硬件开发环境不太稳定（这种情况经常见到），且对具体的硬件不是很了解，则可能在排除问题上花费大量的不必要的时间。
（4）如果你想自己尝试设计一个操作系统，则先在一个提供源码级调试的软件仿真器上进行开发，可能会大大提高你的开发进度。
对于想了解、学习一般操作系统的实现原理，Linux/μCLinux操作系统或TCP/IP等系统级软件的实现的人员，目前一般采用的方法是看书和读源代码，这是一种静态的学习方法，效率较低，比较枯燥，缺少亲自实践的感觉。要想深入分析和开发软件，就要动手编程，不能只是看看书，读读代码，只有通过亲手实践才能够掌握软件设计的核心内容。上面所指出的问题和需求促使SkyEye项目的诞生。
起源和发展2002年11月，一个偶然的机会，一群操作系统的爱好者在网上进行聊天，成立了一个TM－Linux兴趣小组，希望要做一些感兴趣的事情。当时在清华大学计算机系做博士后的陈渝提出做一个用软件实现的嵌入式开发板硬件模拟器，可以在模拟器上运行各种操作系统，这样就可以在没有开发板的情况下学习和研究操作系统。一开始就陈渝一人做，首先他了解了当前国际上的一些类似的项目，发现著名的μCLinux组织实现了一个armulator模拟器软件（在Linux系统上运行），可以模拟Ateml AT91（基于ARM7TDMI CPU）开发板，μCLinux可以armulator上运行。于是陈渝以此为基点，借鉴armulator的实现，提出了SkyEye项目，其目标是让SkyEye仿真多种主流的嵌入式开发板和外设，实现一个可扩展的硬件模拟框架，让更多的嵌入式操作系统可以在SkyEye上运行。SkyEye项目于2002年12月1日正式建立后，陈渝完成的第一件工作是把armulator移植到了cygwin/windows环境下，其成果被μCLinux组织接收。接下来清华大学计算机系硕士生李明加入到SkyEye的开发中，8天后，SkyEye的第一个版本推出，再过了4天，μC/OS-II for SkyEye推出。在这期间，SkyEye的网站也建立起来了。紧接着，杨晔、王利明、尹首一等在校学生也加入到SkyEye的开发中，给SkyEye带来了新的活力，SkyEye进入了新的发展阶段，目前通过访问SkyEye的网站和在linux公社上的SkyEye论坛可以了解到SkyEye的最新进展并对有关嵌入式系统开发方面的问题进行交流，还可以下载最新的SkyEye相关软件和文档。
目标和意义
纯软件的模拟器有许多种，如模拟一个芯片时序逻辑的模拟器、只模拟CPU指令的模拟器、模拟整个硬件开发板的模拟器、模拟一个PDA的模拟器等。存在一些纯软件的仿真器或模拟器，如Stanford大学的SimOS模拟器，它仿真的是MIPS系列CPU和相关外设，可以在其上运行SGI公司的Irix操作系统和软件，目前基本上停止了进一步的开发；PSIM是一个仿真PowerPC指令集的模拟器，目前只支持简单的命令行应用程序；xcopilot是一个PDA模拟器，它是由Greg Hewgill出于个人喜好编写的，它仿真的是M68K CPU，通过它可以给基于PalmOS的软件开发者提供一个模拟开发环境。Bochs是一个仿真x86 CPU的开源项目，目前还支持AMD64 CPU，在它上面可以运行Linux操作系统。其它一些商业的仿真软件如vmware和virtualPC可以仿真一个真实的x86计算机，而Virtutech Simics仿真器可以仿真多种CPU和硬件，功能强大，可用于硬件和系统软件的评测。
SkyEye的推出具有下面三方面的意义：
(1) 通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境和软件开发环境的用户来说，它将是一个非常有效的学习工具和开发手段，因为SkyEye的整个软件系统都是Open Source的，且基于GPL协议（μCOS-II除外）。因此，如果要学习Linux操作系统或者进行嵌入式系统开发，但苦于没有硬件支持，SkyEye仿真环境软件是一个很好的选择！ 
(2) 如果想研究与具体硬件无关的系统软件（如TCP/IP协议栈等），采用SkyEye可以有效地提高工作效率，因为你可以直接在μCOS-II和μCLinux for SkyEye上进行开发和调试，而与具体硬件打交道的各种driver已经存在，且有源码级调试环境，只需关心高层的逻辑设计和实现就可以了。 
(3) SkyEye本身作为一个开放式的项目体系，可以划分为多个独立的子项目系统。通过参与SkyEye的各个子项目，与大家共同交流、协作，可以进一步学习、分析、精通Linux内核，掌握ARM嵌入式CPU编程。 
在32位嵌入式CPU领域中，ARM系列CPU所占比重很大，而ARM7TDMI是其中最广泛的一种ARM CPU核，因此SkyEye首先选择了ARM7TDMI作为仿真的目标CPU核，当然将来SkyEye会支持更多种类的CPU。目前在SkyEye上可运行并进行源码级调试ARM Linux、μCLinux、μC/OS-II操作系统和LwIP（一个著名的嵌入式TCP/IP实现）、MiniGUI（一个著名的嵌入式GUI系统）等系统软件。SkyEye可用于学习，分析，开发这些系统软件的实现，了解ARM嵌入式CPU编程。而这一切都可在一个纯软件的环境中完成。通过分析SkyEye本身实现，系统软件开发人员对ARM，8019as（NE2000兼容）以太网络芯片等硬件的了解也会更深入。
SkyEye并不能取代开发板等硬件的功能，但通过它可以比较容易进入到嵌入式软件的广阔天地中。由于SkyEye建立在GDB基础之上，使用者可以方便地使用GDB提供的各种调试手段对SkyEye仿真系统上的软件进行源码级的调试，还可以进行各种分析，如执行热点分析、程序执行覆盖度分析等。由于SkyEye提供了源代码和相关文档，有经验的用户完全可以修改和扩充SkyEye来满足自己的需求。[1]
模拟硬件
目前SkyEye模拟了大量的硬件，包括CPU内核、存储器、存储器管理单元、缓存单元、串口、网络芯片、时钟等。下面做一简单介绍。
CPU和开发板系列目前SkyEye可以模拟的CPU主要是基于ARM内核的CPU，包括ARM7TDMI，ARM720T，ARM9TDMI，ARM9xx，ARM10xx，StrongARM，XScale等。ARM7/9/10TDMI是ARM系列CPU的基本核心部分，它们不支持MMU/CACHE和一些扩展指令，是ARM CPU基本核。ARM720T、ARM920T、ARM10xx、StrongARM、Xscale是建立在以上ARM CPU核上，并扩展了MMU/CACHE和其它功能。各硬件开发公司可以根据它们的需求在上述CPU核上加上特定的扩展，形成基于各种ARM基本核心的特定CPU，如Atmel91X40和 ep7312，分别扩展了ARM7TDMI和ARM720T的内存控制和各种I/O控制器，简化了开发板的逻辑设计，大大增强了开发板的功能。
目前SkyEye模拟的开发板包括基于Atmel 91X40/AT91RM92 CPU的开发板，基于Crirus Logic ep7312的开发板、基于StrongARM CPU的ADSBITSY开发板，基于XScale PXA250 CPU的LUBBOCK开发板、基于SAMSUNG S3C4510B/S3C44B0 CPU的开发板、基于SHARP LH7A400 CPU的开发板、基于Philip LPC22xx CPU的开发板等。主要模拟了对应各个开发板的串口、时钟、RAM、ROM、LCD、网络芯片等硬件外设。
存储器管理单元和缓存单元MMU（Memory Management Unit）即存储器管理单元，是用来管理虚拟内存系统的硬件。MMU的两个主要功能是：将虚地址转换成物理地址；控制存储器的存取权限。MMU关掉时，虚地址直接输出到物理地址总线。MMU本身有少量存储空间存放从虚拟地址到物理地址的匹配表，此表称作TLB(Translation Lookaside Buffers)。TLB表中保存的是虚址及其对应的物理地址，权限，域和映射类型。当CPU对一虚拟地址进行存取时，首先搜索TLB表以查找对应的物理地址等信息，如果没有查到，则进行查找translation table，称为Translation Table Walk（简称TTW）。经过TTW过程后，将查到的信息保存到TLB。然后根据TLB表项的物理地址进行读写。CACHE是缓存单元，主要用于缓存内存中的数据，其读写速度远快于内存的读写速度，所以可以提高CPU的内存数据的访问效率。
write/read buffer硬件单元的作用与CACHE的作用类似。MMU、CACHE、write/read buffer一般是高性能CPU的重要组成部分，且不同类型CPU的MMU、CACHE、write/read buffer的逻辑行为也有一定的差异。为了支持模拟多种类型CPU的MMU/CACHE，SkyEye包含了一个通用的MMU/CACHE模拟实现。通过对一些参数的调整可以支持模拟多种类型的MMU/CACHE物理结构和逻辑行为。
网络芯片目前SkyEye模拟了网络芯片8019AS，其特点是：NE2000兼容，内建 16KRAM缓冲区，10MB传输速率。虽然目前模拟的开发板上不一定有网络芯片8019AS，但我们可以在我们模拟的开发板上加上网络芯片8019AS的模拟。这样再加上在不同操作系统上的8019AS驱动程序，就可以方便地完成各种网络应用的开发和设计。目前已经在在基于Atmel91X40 CPU的开发板上实现了网络芯片8019AS扩展，并增加了μC/OS-II和μClinux的网络驱动程序，已经支持大量的网络应用程序，如LwIP （一个TCP/IP协议栈实现）、nfs server/clinet、http server/client、telnet server/client、ftp server/client等。
设计实现
设计原则SkyEye软件的核心在目标模拟模块。为了提高模拟效率，且能够模拟更多的CPU、开发板和各种外设，方便开发人员进行开发和学习，SkyEye遵循如下的设计原则：
（1） 用C语言编程，采用面向对象的方式定义各种要模拟的硬件； 
（2）定义抽象模拟硬件对象，最大化重用代码； 
（3） 定义硬件配置脚本，使得不用改动SkyEye代码就可以灵活地调整各种硬件配置； 
（4）保持与GDB上层接口的一致性，这样可充分利用GDB强大的源代码级调试功能。
总体结构SkyEye基于GDB/ARMulator(目前由David McCullough 维护)，并进行了全面的改变和扩展。SkyEye建立在GNU GDB的底层，可以模仿多种完整的嵌入式计算机系统，目前模拟的硬件包括CPU、内存、I/O寄存器、时钟、UART、网络芯片、MMU、CACHE，将来还会模拟 LCD、USB等各种硬件。在SkyEye上运行的操作系统和各种系统软件"意识"不到它们是在一个虚拟的计算机系统上运行。 
SkyEye从总体上分为四个层次：
（1）用户接口模块：包括命令行用户界面和图形用户界面，完成处理用户的输入命令，并把相关调试数据输出给用户的任务。这一部分基本上直接利用了GDB的用户接口模块，并在此基础上有一定的扩充。 
（2）符号处理模块：主要处理执行文件的头信息，解释执行文件中内嵌的debuger调试信息，对符号表的管理，对源代码表达式的解析，定位源代码中的语句位置和机器码的位置关系等。这一部分也是直接利用了GDB的符号处理模块，也正是有了这个模块的支持，SkyEye可以支持源码级调试。 
（3）目标控制模块：主要完成执行控制（如中断程序的执行，设置中断条件等），程序栈结构分析，对具体目标硬件的控制（如本地调试、远程调试和模拟调试的控制）。这一部分完成对SkyEye上运行的软件的控制，提供了多种调试手段。 
（4）目标模拟模块：这一部分是SkyEye的核心。它的功能是模仿计算机系统中的主要硬件（包括CPU、内存和各种硬件外设等）的执行，对执行文件的机器指令进行解释，并模拟执行每一条机器指令，产生相应的硬件响应等。