?
|
|
級別: 初級
陳渝
(yuchen@tsinghua.edu.cn)清華大學(xué)
2004 年 9 月 01 日
?
一.SkyEye介紹
1.SkyEye的起源和發(fā)展
2002年11月,一個偶然的機(jī)會,一群操作系統(tǒng)的愛好者在網(wǎng)上進(jìn)行聊天,成立了一個TM-Linux興趣小組,希望要做一些感興趣的事情。當(dāng)時在清華大學(xué)計(jì)算機(jī)系做博士后的陳渝提出做一個用軟件實(shí)現(xiàn)的嵌入式開發(fā)板硬件模擬器,可以在模擬器上運(yùn)行各種操作系統(tǒng),這樣就可以在沒有開發(fā)板的情況下學(xué)習(xí)和研究操作系統(tǒng)。一開始就陳渝一人做,首先他了解了當(dāng)前國際上的一些類似的項(xiàng)目,發(fā)現(xiàn)著名的μCLinux組織實(shí)現(xiàn)了一個armulator模擬器軟件(在Linux系統(tǒng)上運(yùn)行),可以模擬Ateml AT91(基于ARM7TDMI CPU)開發(fā)板,μCLinux可以在armulator(其網(wǎng)址為http://www.uclinux.org/pub/uCLinux/utilities/armulator/)上運(yùn)行。于是陳渝以此為基點(diǎn),借鑒armulator的實(shí)現(xiàn),提出了SkyEye項(xiàng)目,其目標(biāo)是讓SkyEye仿真多種主流的嵌入式開發(fā)板和外設(shè),實(shí)現(xiàn)一個可擴(kuò)展的硬件模擬框架,讓更多的嵌入式操作系統(tǒng)可以在SkyEye上運(yùn)行。SkyEye項(xiàng)目于2002年12月1日正式建立后,陳渝完成的第一件工作是把a(bǔ)rmulator移植到了cygwin/windows環(huán)境下,其成果被μCLinux組織接收。接下來清華大學(xué)計(jì)算機(jī)系碩士生李明加入到SkyEye的開發(fā)中,8天后,SkyEye的第一個版本推出,再過了4天,μC/OS-II for SkyEye推出。在這期間,SkyEye的網(wǎng)站也建立起來了。緊接著,楊曄、王利明、尹首一等在校學(xué)生也加入到SkyEye的開發(fā)中,給SkyEye帶來了新的活力,SkyEye進(jìn)入了新的發(fā)展階段,目前通過訪問SkyEye的網(wǎng)站(http://www.skyeye.org/)和在linux公社上的SkyEye論壇( http://www.linuxfans.org)可以了解到SkyEye的最新進(jìn)展并對有關(guān)嵌入式系統(tǒng)開發(fā)方面的問題進(jìn)行交流,還可以到 http://gro.clinux.org/projects/skyeye/ 下載最新的SkyEye相關(guān)軟件和文檔。
2.SkyEye的背景
如果你看過電影"黑客帝國"(又稱"matrix"),相信電影描述的虛幻世界會深深地吸引你,至少它是我們看過最有想象力的科幻電影之一。也許我們可以把SkyEye看作一個"matrix ",把運(yùn)行在SkyEye上的各種程序看成是這個"matrix"中的蕓蕓眾生。我們創(chuàng)造SkyEye和編寫運(yùn)行在SkyEye上運(yùn)行的程序就是為了洞悉計(jì)算機(jī)的奧秘,嘗嘗當(dāng)"造物主"的感覺。當(dāng)看到各種軟件Linux、μCLinux、μC/OS-II...在SkyEye上"愉快"地運(yùn)行時,那種感覺真是太奇妙了。
對于那些想進(jìn)行嵌入式系統(tǒng)軟件開發(fā)和學(xué)習(xí),或者想研究嵌入式Linux等操作系統(tǒng)和一些底層系統(tǒng)軟件(如TCP/IP等)的研究和開發(fā)人員來說,可能存在如下幾方面的問題:(1)經(jīng)常苦于經(jīng)費(fèi)不足,缺少足夠的硬件開發(fā)板和完善的軟件開發(fā)環(huán)境,相關(guān)的書籍對一些最新軟件的分析還不夠全面,無法深入研究和開發(fā)嵌入式軟件。(2)高層次的軟件設(shè)計(jì)和開發(fā)一般不用太考慮底層硬件的實(shí)現(xiàn)細(xì)節(jié),如果直接處于一個具體的硬件環(huán)境下,在開發(fā)和研究中可能會陷入硬件的具體細(xì)節(jié)中不能自拔,而不能把精力放到高層次的軟件設(shè)計(jì)和開發(fā)上。(3)如果硬件開發(fā)環(huán)境不太穩(wěn)定(這種情況經(jīng)常見到),且對具體的硬件不是很了解,則可能在排除問題上花費(fèi)大量的不必要的時間。(4)如果你想自己嘗試設(shè)計(jì)一個操作系統(tǒng),則先在一個提供源碼級調(diào)試的軟件仿真器上進(jìn)行開發(fā),可能會大大提高你的開發(fā)進(jìn)度。
對于想了解、學(xué)習(xí)一般操作系統(tǒng)的實(shí)現(xiàn)原理,Linux/μCLinux操作系統(tǒng)或TCP/IP等系統(tǒng)級軟件的實(shí)現(xiàn)的人員,目前一般采用的方法是看書和讀源代碼,這是一種靜態(tài)的學(xué)習(xí)方法,效率較低,比較枯燥,缺少親自實(shí)踐的感覺。要想深入分析和開發(fā)軟件,就要動手編程,不能只是看看書,讀讀代碼,只有通過親手實(shí)踐才能夠掌握軟件設(shè)計(jì)的核心內(nèi)容。上面所指出的問題和需求促使SkyEye項(xiàng)目的誕生。
3.SkyEye的目標(biāo)和意義
SkyEye是一個開源軟件(OpenSource Software)項(xiàng)目,中文名字是"天目"。SkyEye的目標(biāo)是在通用的Linux和Windows平臺上實(shí)現(xiàn)一個純軟件集成開發(fā)環(huán)境,模擬常見的嵌入式計(jì)算機(jī)系統(tǒng)(這里假定"仿真"和"模擬"的意思基本相同);可在SkyEye上運(yùn)行μCLinux以及μC/OS-II等多種嵌入式操作系統(tǒng)和各種系統(tǒng)軟件(如TCP/IP,圖形子系統(tǒng),文件子系統(tǒng)等),并可對它們進(jìn)行源碼級的分析和測試。
純軟件的模擬器有許多種,如模擬一個芯片時序邏輯的模擬器、只模擬CPU指令的模擬器、模擬整個硬件開發(fā)板的模擬器、模擬一個PDA的模擬器等。存在一些純軟件的仿真器或模擬器,如Stanford大學(xué)的SimOS模擬器,它仿真的是MIPS系列CPU和相關(guān)外設(shè),可以在其上運(yùn)行SGI公司的Irix操作系統(tǒng)和軟件,目前基本上停止了進(jìn)一步的開發(fā);PSIM是一個仿真PowerPC指令集的模擬器,目前只支持簡單的命令行應(yīng)用程序;xcopilot是一個PDA模擬器,它是由Greg Hewgill出于個人喜好編寫的,它仿真的是M68K CPU,通過它可以給基于PalmOS的軟件開發(fā)者提供一個模擬開發(fā)環(huán)境。Bochs是一個仿真x86 CPU的開源項(xiàng)目,目前還支持AMD64 CPU,在它上面可以運(yùn)行Linux操作系統(tǒng)。其它一些商業(yè)的仿真軟件如vmware和virtualPC可以仿真一個真實(shí)的x86計(jì)算機(jī),而Virtutech Simics仿真器可以仿真多種CPU和硬件,功能強(qiáng)大,可用于硬件和系統(tǒng)軟件的評測。
SkyEye是一個指令級模擬器,可以模擬多種嵌入式開發(fā)板,可支持多種CPU指令集,在SkyEye上運(yùn)行的操作系統(tǒng)意識不到它是在一個虛擬的環(huán)境中運(yùn)行,而且開發(fā)人員可以通過SkyEye調(diào)試操作系統(tǒng)和系統(tǒng)軟件。由于SkyEye的目標(biāo)不是驗(yàn)證硬件邏輯,而是協(xié)助開發(fā)、調(diào)試和學(xué)習(xí)系統(tǒng)軟件,所以在實(shí)現(xiàn)上SkyEye與真實(shí)的硬件環(huán)境相比還是有一定差別的。SkyEye在時鐘節(jié)拍的時序上不保證與硬件完全相同,對軟件透明的一些硬件仿真進(jìn)行了一定的簡化。這樣帶來的好處是SkyEye的執(zhí)行效率更高。SkyEye的推出具有下面三方面的意義:
- 通過SkyEye仿真集成環(huán)境可以很方便地進(jìn)入到嵌入式系統(tǒng)軟件學(xué)習(xí)和開發(fā)的廣闊天地中。尤其對于缺少嵌入式硬件開發(fā)環(huán)境和軟件開發(fā)環(huán)境的用戶來說,它將是一個非常有效的學(xué)習(xí)工具和開發(fā)手段,因?yàn)镾kyEye的整個軟件系統(tǒng)都是Open Source的,且基于GPL協(xié)議(μCOS-II除外)。因此,如果要學(xué)習(xí)Linux操作系統(tǒng)或者進(jìn)行嵌入式系統(tǒng)開發(fā),但苦于沒有硬件支持,SkyEye仿真環(huán)境軟件是一個很好的選擇!
- 如果想研究與具體硬件無關(guān)的系統(tǒng)軟件(如TCP/IP協(xié)議棧等),采用SkyEye可以有效地提高工作效率,因?yàn)槟憧梢灾苯釉讦藽OS-II和μCLinux for SkyEye上進(jìn)行開發(fā)和調(diào)試,而與具體硬件打交道的各種driver已經(jīng)存在,且有源碼級調(diào)試環(huán)境,只需關(guān)心高層的邏輯設(shè)計(jì)和實(shí)現(xiàn)就可以了。
- SkyEye本身作為一個開放式的項(xiàng)目體系,可以劃分為多個獨(dú)立的子項(xiàng)目系統(tǒng)。通過參與SkyEye的各個子項(xiàng)目,與大家共同交流、協(xié)作,可以進(jìn)一步學(xué)習(xí)、分析、精通Linux內(nèi)核,掌握ARM嵌入式CPU編程。
在32位嵌入式CPU領(lǐng)域中,ARM系列CPU所占比重很大,而ARM7TDMI是其中最廣泛的一種ARM CPU核,因此SkyEye首先選擇了ARM7TDMI作為仿真的目標(biāo)CPU核,當(dāng)然將來SkyEye會支持更多種類的CPU。目前在SkyEye上可運(yùn)行并進(jìn)行源碼級調(diào)試ARM Linux、μCLinux、μC/OS-II操作系統(tǒng)和LwIP(一個著名的嵌入式TCP/IP實(shí)現(xiàn))、MiniGUI(一個著名的嵌入式GUI系統(tǒng))等系統(tǒng)軟件。SkyEye可用于學(xué)習(xí),分析,開發(fā)這些系統(tǒng)軟件的實(shí)現(xiàn),了解ARM嵌入式CPU編程。而這一切都可在一個純軟件的環(huán)境中完成。通過分析SkyEye本身實(shí)現(xiàn),系統(tǒng)軟件開發(fā)人員對ARM,8019as(NE2000兼容)以太網(wǎng)絡(luò)芯片等硬件的了解也會更深入。
SkyEye并不能取代開發(fā)板等硬件的功能,但通過它可以比較容易進(jìn)入到嵌入式軟件的廣闊天地中。由于SkyEye建立在GDB基礎(chǔ)之上,使用者可以方便地使用GDB提供的各種調(diào)試手段對SkyEye仿真系統(tǒng)上的軟件進(jìn)行源碼級的調(diào)試,還可以進(jìn)行各種分析,如執(zhí)行熱點(diǎn)分析、程序執(zhí)行覆蓋度分析等。由于SkyEye提供了源代碼和相關(guān)文檔,有經(jīng)驗(yàn)的用戶完全可以修改和擴(kuò)充SkyEye來滿足自己的需求。
二.SkyEye模擬硬件介紹
目前SkyEye模擬了大量的硬件,包括CPU內(nèi)核、存儲器、存儲器管理單元、緩存單元、串口、網(wǎng)絡(luò)芯片、時鐘等。下面做一簡單介紹。
1.CPU和開發(fā)板系列
目前SkyEye可以模擬的CPU主要是基于ARM內(nèi)核的CPU,包括ARM7TDMI,ARM720T,ARM9TDMI,ARM9xx,ARM10xx,StrongARM,XScale等。ARM7/9/10TDMI是ARM系列CPU的基本核心部分,它們不支持MMU/CACHE和一些擴(kuò)展指令,是ARM CPU基本核。ARM720T、ARM920T、ARM10xx、StrongARM、Xscale是建立在以上ARM CPU核上,并擴(kuò)展了MMU/CACHE和其它功能。各硬件開發(fā)公司可以根據(jù)它們的需求在上述CPU核上加上特定的擴(kuò)展,形成基于各種ARM基本核心的特定CPU,如Atmel91X40和 ep7312,分別擴(kuò)展了ARM7TDMI和ARM720T的內(nèi)存控制和各種I/O控制器,簡化了開發(fā)板的邏輯設(shè)計(jì),大大增強(qiáng)了開發(fā)板的功能。
目前SkyEye模擬的開發(fā)板包括基于Atmel 91X40/AT91RM92 CPU的開發(fā)板,基于Crirus Logic ep7312的開發(fā)板、基于StrongARM CPU的ADSBITSY開發(fā)板,基于XScale PXA250 CPU的LUBBOCK開發(fā)板、基于SAMSUNG S3C4510B/S3C44B0 CPU的開發(fā)板、基于SHARP LH7A400 CPU的開發(fā)板、基于Philip LPC22xx CPU的開發(fā)板等。主要模擬了對應(yīng)各個開發(fā)板的串口、時鐘、RAM、ROM、LCD、網(wǎng)絡(luò)芯片等硬件外設(shè)。
2.存儲器管理單元和緩存單元
MMU(Memory Management Unit)即存儲器管理單元,是用來管理虛擬內(nèi)存系統(tǒng)的硬件。MMU的兩個主要功能是:將虛地址轉(zhuǎn)換成物理地址;控制存儲器的存取權(quán)限。MMU關(guān)掉時,虛地址直接輸出到物理地址總線。MMU本身有少量存儲空間存放從虛擬地址到物理地址的匹配表,此表稱作TLB(Translation Lookaside Buffers)。TLB表中保存的是虛址及其對應(yīng)的物理地址,權(quán)限,域和映射類型。當(dāng)CPU對一虛擬地址進(jìn)行存取時,首先搜索TLB表以查找對應(yīng)的物理地址等信息,如果沒有查到,則進(jìn)行查找translation table,稱為Translation Table Walk(簡稱TTW)。經(jīng)過TTW過程后,將查到的信息保存到TLB。然后根據(jù)TLB表項(xiàng)的物理地址進(jìn)行讀寫。CACHE是緩存單元,主要用于緩存內(nèi)存中的數(shù)據(jù),其讀寫速度遠(yuǎn)快于內(nèi)存的讀寫速度,所以可以提高CPU的內(nèi)存數(shù)據(jù)的訪問效率。
write/read buffer硬件單元的作用與CACHE的作用類似。MMU、CACHE、write/read buffer一般是高性能CPU的重要組成部分,且不同類型CPU的MMU、CACHE、write/read buffer的邏輯行為也有一定的差異。為了支持模擬多種類型CPU的MMU/CACHE,SkyEye包含了一個通用的MMU/CACHE模擬實(shí)現(xiàn)。通過對一些參數(shù)的調(diào)整可以支持模擬多種類型的MMU/CACHE物理結(jié)構(gòu)和邏輯行為。
3.網(wǎng)絡(luò)芯片
目前SkyEye模擬了網(wǎng)絡(luò)芯片8019AS,其特點(diǎn)是:NE2000兼容,內(nèi)建 16KRAM緩沖區(qū),10MB傳輸速率。雖然目前模擬的開發(fā)板上不一定有網(wǎng)絡(luò)芯片8019AS,但我們可以在我們模擬的開發(fā)板上加上網(wǎng)絡(luò)芯片8019AS的模擬。這樣再加上在不同操作系統(tǒng)上的8019AS驅(qū)動程序,就可以方便地完成各種網(wǎng)絡(luò)應(yīng)用的開發(fā)和設(shè)計(jì)。目前已經(jīng)在在基于Atmel91X40 CPU的開發(fā)板上實(shí)現(xiàn)了網(wǎng)絡(luò)芯片8019AS擴(kuò)展,并增加了μC/OS-II和μClinux的網(wǎng)絡(luò)驅(qū)動程序,已經(jīng)支持大量的網(wǎng)絡(luò)應(yīng)用程序,如LwIP (一個TCP/IP協(xié)議棧實(shí)現(xiàn))、nfs server/clinet、http server/client、telnet server/client、ftp server/client等。
三.SkyEye的設(shè)計(jì)實(shí)現(xiàn)
1.SkyEye設(shè)計(jì)原則
SkyEye軟件的核心在目標(biāo)模擬模塊。為了提高模擬效率,且能夠模擬更多的CPU、開發(fā)板和各種外設(shè),方便開發(fā)人員進(jìn)行開發(fā)和學(xué)習(xí),SkyEye遵循如下的設(shè)計(jì)原則:
- 用C語言編程,采用面向?qū)ο蟮姆绞蕉x各種要模擬的硬件;
- 定義抽象模擬硬件對象,最大化重用代碼;
- 定義硬件配置腳本,使得不用改動SkyEye代碼就可以靈活地調(diào)整各種硬件配置;
保持與GDB上層接口的一致性,這樣可充分利用GDB強(qiáng)大的源代碼級調(diào)試功能。
2.SkyEye的總體結(jié)構(gòu)
SkyEye基于GDB/ARMulator(目前由David McCullough 維護(hù)),并進(jìn)行了全面的改變和擴(kuò)展。SkyEye建立在GNU GDB的底層,可以模仿多種完整的嵌入式計(jì)算機(jī)系統(tǒng),目前模擬的硬件包括CPU、內(nèi)存、I/O寄存器、時鐘、UART、網(wǎng)絡(luò)芯片、MMU、CACHE,將來還會模擬 LCD、USB等各種硬件。在SkyEye上運(yùn)行的操作系統(tǒng)和各種系統(tǒng)軟件"意識"不到它們是在一個虛擬的計(jì)算機(jī)系統(tǒng)上運(yùn)行。
SkyEye從總體上分為四個層次:
- 用戶接口模塊:包括命令行用戶界面和圖形用戶界面,完成處理用戶的輸入命令,并把相關(guān)調(diào)試數(shù)據(jù)輸出給用戶的任務(wù)。這一部分基本上直接利用了GDB的用戶接口模塊,并在此基礎(chǔ)上有一定的擴(kuò)充。
- 符號處理模塊:主要處理執(zhí)行文件的頭信息,解釋執(zhí)行文件中內(nèi)嵌的debuger調(diào)試信息,對符號表的管理,對源代碼表達(dá)式的解析,定位源代碼中的語句位置和機(jī)器碼的位置關(guān)系等。這一部分也是直接利用了GDB的符號處理模塊,也正是有了這個模塊的支持,SkyEye可以支持源碼級調(diào)試。
- 目標(biāo)控制模塊:主要完成執(zhí)行控制(如中斷程序的執(zhí)行,設(shè)置中斷條件等),程序棧結(jié)構(gòu)分析,對具體目標(biāo)硬件的控制(如本地調(diào)試、遠(yuǎn)程調(diào)試和模擬調(diào)試的控制)。這一部分完成對SkyEye上運(yùn)行的軟件的控制,提供了多種調(diào)試手段。
- 目標(biāo)模擬模塊:這一部分是SkyEye的核心。它的功能是模仿計(jì)算機(jī)系統(tǒng)中的主要硬件(包括CPU、內(nèi)存和各種硬件外設(shè)等)的執(zhí)行,對執(zhí)行文件的機(jī)器指令進(jìn)行解釋,并模擬執(zhí)行每一條機(jī)器指令,產(chǎn)生相應(yīng)的硬件響應(yīng)等。
四.小結(jié)
本文主要介紹了SkyEye硬件模擬平臺的起源、背景和發(fā)展?fàn)顩r。如果讀者能夠熟練掌握SkyEye的使用,則會提高開發(fā)、調(diào)試操作系統(tǒng)等的進(jìn)度,特別是對操作系統(tǒng)、驅(qū)動程序如何與嵌入式硬件系統(tǒng)進(jìn)行交互有更深刻的了解。SkyEye還在不斷地發(fā)展之中,對SkyEye感興趣的讀者需要跟蹤最新的SkyEye源碼和相關(guān)文檔,并可在SkyEye論壇上與SkyEye開發(fā)人員進(jìn)行實(shí)時交流。
參考資料
關(guān)于作者