Android-VirtualBox跨界編譯及動態遷移云平臺系統研發_第1頁
Android-VirtualBox跨界編譯及動態遷移云平臺系統研發_第2頁
Android-VirtualBox跨界編譯及動態遷移云平臺系統研發_第3頁
Android-VirtualBox跨界編譯及動態遷移云平臺系統研發_第4頁
Android-VirtualBox跨界編譯及動態遷移云平臺系統研發_第5頁
已閱讀5頁,還剩32頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

MACROBUTTONMTEditEquationSection2SEQMTEqn\r\hSEQMTSec\r1\hSEQMTChap\r2\h題目:Android/VirtualBox跨界編譯及動態遷移云平臺系統研發學院電子與信息學院專業信息工程摘要Contiki微操作系統作為一種小型的,開源的,極易移植的微操作系統,在物聯網日益發展的今天,因為它多平臺特定設備工作實現6LoWPAN功能,它的RFC兼容TCP/IP堆棧功能,提供支持給6LoWPAN和很多關聯標準,因此被廣泛地用于無線網絡傳感器。本文主要詳細地介紹了Contiki微操作系統在Android/Linux跨界編譯的原理及過程,并且開發出Contiki系統在不同的Android/Linux虛擬機之間遷移的調度程序,這對于Contiki系統的多平臺運行有重要的意義。本文首先簡要介紹了Contiki操作系統、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等跨界編譯和調度的基礎,并對Contiki系統架構、源代碼和進程調度做了研究分析,通過建立交叉編譯鏈,實現Contiki操作系統在Android/Linux的跨界編譯。接著介紹了RSA_AES加密算法的原理和加密步驟,在此基礎上實現Contiki系統在不同Linux虛擬機之間、Linux和Android之間的動態遷移。從實驗結果以及截圖可知實現了Contiki系統在Linux和Android虛擬機的跨平臺編譯,并且實現了Contiki系統在不同Linux虛擬機之間、Linux和Android之間的動態遷移,一定程度上解決了題目的要求。關鍵詞:Contiki微操作系統;Linux;安卓虛擬機;跨平臺編譯;遷移AbstractMicroContikioperatingsystemisasmall,open-source,easy-to-transplantmicrooperatingsystem,ingrowingthingstoday,becauseitismoreworktoachieveaspecificdeviceplatform6LoWPANfunctionality,andithasaRFC-compliantTCP/IPstackfunctionsprovidesupportfor6LoWPANandmanyrelatedstandards,whichiswidelyusedinwirelesssensornetworks.ThispaperdescribesindetailtheprincipleandprocessofthemicroContikioperatingsystemtocompileinAndroid/Linuxplatform.AnditalsodevelopsthetransplantationprogrambetweendifferentAndroid/LinuxvirtualmachinesforContikisystem,whichisveryimportantforContikitoruninmulti-platformsystems.Thispaperfirstbrieflyintroducessomebasicknowledgeofcrosscompilationandscheduling,suchasContikioperatingsystem,GCCcompilation,crosscompilation,TCP/IPcommunicationandsoon.NexttheContikisystemarchitecture,sourcecodeandprocessschedulingarestudiedandanalyzed,usingtheestablishmentofcrosscompilechain,thecrosscompilingofContikioperatingsysteminAndroid/Linuxisrealized.ThenitintroducestheRSA,AESencryptionalgorithmandencryptionstep,finallythetransplantationprogrambetweendifferentAndroid/LinuxvirtualmachinesforContikisystemsucceeded.TheexperimentalresultsandthescreenshotshowthatContikioperatingsystemcompilesinAndroid/Linuxplatform,andthetransplantationprogrambetweendifferentAndroid/LinuxvirtualmachinesforContikisystemalsosucceeded.Allisacertainextenttosolvetherequirementsofthesubject.Keyword:MicroContikioperatingsystem;Linux;Androidvirtualmachine;crosscompilation;transplantation目錄緒論1.1課題背景和意義隨著網絡通信技術的發展和趨于成熟,人類社會正向全面的信息化時代邁進,跟隨著時代的步伐,物聯網技術也慢慢發展起來。所謂物聯網,即物物連接的互聯網,它是利用局部網絡或互聯網等通信技術把傳感器、控制器、機器、人員和物等通過新的方式聯在一起,形成人與物、物與物相聯,實現信息化、遠程管理控制和智能化的網絡,通過物聯網,人類可以實現無處不在的計算機和網絡連接,對人類社會的發展產生重大貢獻,而Contiki就是專門為物聯網開發的開源操作系統。Contiki是一個小型的,開源的,極易移植的多任務電腦操作系統。它專門設計以適用于一系列的內存有限的網絡系統,包括從8位電腦到微型控制器的嵌入系統,適用于聯網嵌入式系統和無線傳感器網絡。Contiki只需幾KB的代碼和幾百字節的內存就能提供多任務環境和內建TCP/IP支持。Contiki完全C語言開發、易于移植、支持大量的硬件平臺和開發工具、事件驅動機制占用內存小、集成了多種無線傳感器網絡協議、無專利和版權費、集成仿真工具等特點和優勢,已經成為無線傳感器網絡學術研究和產品開發的理想平臺,在歐洲已經得到廣泛應用,并逐漸得到其它地區開發人員的支持。隨著物聯網、無線傳感器網絡的發展,IP地址將耗盡,骨干網絡必將升級到IPv6,因此6Lowpan標準被越來越多的標準化組織所采納,研發6lowpan的人員將越來越多,這將使得Contiki很可能成為嵌入系統中的Linux,在物聯網領域得到廣泛應用,發揮重要作用。1.2課題的國內外發展現狀目前,隨著物聯網的發展,基于IPv6的無線傳感器網絡的可行得到了一系列的標準,比如6LoWPAN,是一種基于IPv6的低耗無線個人區域網絡規格。Contiki嵌入式操作系統是一個重要的開源系統,多平臺特定設備工作實現6LoWPAN功能。它的RFC兼容TCP/IP堆棧功能,提供支持6LoWPAN和很多關聯標準。同時,uIP堆棧被整合進Contiki移植操作系統,也增強支持IPv6(uIPv6)。另外,Contiki操作系統包含了一個RPL路由協議的實現,相當于成熟的6LoWPAN支持(IPv6數據包解壓和壓縮)。Contiki已經被設計的以輕便為主,成功地用于多種硬件平臺。Contiki成為無線傳感器網絡學術研究和產品開發的理想平臺,在歐洲已經得到廣泛應用,并逐漸得到其它地區開發人員的支持。隨著物聯網、無線傳感器網絡的發展,IP地址將耗盡,骨干網絡必將升級到IPv6,因此6LoWPAN標準被越來越多的標準化組織所采納,研發6LoWPAN的人員將越來越多,這將使得Contiki很可能成為嵌入系統中的Linux,在物聯網領域得到廣泛應用,發揮重要作用。1.3課題研究主要目標及工作本課題研究的主要任務是在云平臺服務器上安裝部署一種稱為“方舟”的Linux+GCC系統的虛擬機,能夠對C語言編寫的Cell(計算機細胞)進行Android虛擬機VirtualBox虛擬機平臺的交叉編譯;并且用C語言開發一套自動遷移程序,能夠把Cell的源代碼在“方舟”之間加密傳輸,并且自動編譯運行。其中,Cell(計算機細胞)就是指在Contiki操作系統。要實現以上目標,需要進行如下研究工作:了解Contiki操作系統、Android/VirtualBox跨界交叉編譯、操作系統進程調度的概念。安裝兩個VirtualBox虛擬機,在此基礎上分別配置Linux和Androidforx86。在上述安裝的Linux平臺中,手工編譯Contiki操作系統。在Linux虛擬機上編譯出Android上運行的可執行代碼(交叉編譯),然后手工復制可執行代碼到Android平臺上運行。Linux虛擬機之間的Contiki編譯與遷移自動化實現Linux到Android平臺的可執行代碼自動遷移和運行。1.4論文內容安排本文主要研究了Contiki微操作系統在Android/VirtualBox的跨界編譯及動態遷移,第一章緒論主要對Contiki微操作系統以及關于Contiki微操作系統的發展現狀做簡單的介紹,第二章介紹了Contiki操作系統、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等跨界編譯和調度的基礎知識,第三章介紹了交叉編譯鏈建立的過程,實現Contiki微操作系統在Android/Linux的跨界編譯,第四章介紹了RSA_AES加密算法的原理和加密步驟,并詳細介紹了Contiki系統在不同Linux虛擬機之間、Linux和Android之間動態遷移的實現過程,最后為總結結論,對課題的展望等。系統框架簡介2.1系統架構課題的系統框圖如圖2-SEQ圖\*ARABIC\s11所示。圖2-SEQ圖\*ARABIC\s11Android/VirtualBox跨界編譯及動態遷移云平臺系統框圖系統包括Linux虛擬機、Android虛擬機和虛擬網關三大模塊。根據課題目標,制定如下實現方案:Linux虛擬機在windows平臺下,采用VirtualBox虛擬機軟件安裝Linux操作系統,目標使用Ubuntu版本,為以Android為目標機的Contiki源碼提供編譯環境。VirtualBox是免費虛擬機軟件,它不僅具有豐富的特色,而且性能也很優異。它簡單易用,可虛擬的系統包括Windows、MacOSX、Linux、OpenBSD、Solaris、IBMOS2甚至Android4.0系統等操作系統!使用者可以在VirtualBox上安裝并且運行上述的這些操作系統!與同性質的VMware及VirtualPC比較下,VirtualBox獨到之處包括遠端桌面協定(RDP)、iSCSI及USB的支持。Ubuntu是一個以桌面應用為主的Linux操作系統,十分契合英特爾的超極本定位,支持x86、64位和ppc架構全面支持網頁瀏覽器WPS。Ubuntu對GNU/Linux的普及特別是桌面普及作出了巨大貢獻,由此使更多人共享開源的成果與精彩。在本系統中,我們使該虛擬機具備虛擬網卡,可與多臺android虛擬機及Linux虛擬機通過虛擬網關,通過網絡拓撲連接進行網絡通信,以便完成整個系統實驗。編譯環境搭建及編譯Linux虛擬機之間的系統遷移,我們只需編寫源碼Makefile文件,使用系統自帶的GCC編譯器實現Contiki的編譯。但是為了實現跨平臺系統遷移,我們還需要實現Contiki在Android環境下的編譯,并編寫源碼Makefile文件,交叉編譯Contiki源碼,生成Android目標機的編譯文件。最初考慮一下兩種方案:方案一是做安卓下的NDK編譯,方案二是建立LINUX-ARM交叉編譯鏈,在底層實現跨界編譯。下面就這兩種方案進行討論。方案一:NDK是安卓開發的一個工具集,集成了Android的交叉編譯環境,并提供了一套比較方便的Makefile,可以幫助開發者快速開發C或是C++的動態庫,并自動的將so和

\t"/html/201207/_blank"java

程序打包成apk,在Android上運行。但是由于Contiki本身沒有安卓版本,編譯不通過,故該方案失敗。方案二:建立LINUX-ARM交叉編譯鏈,將目標程序編譯成Androidforx86能運行的可執行代碼,從而實現Contiki在Android環境下的編譯,此過程即是Android/VirtualBox跨界編譯。文件遷移及自動加載Linux集成了uIP協議棧,包含IPv4和IPv6兩種協議棧版本,支持TCP、UDP、ICMP等協議,并有一套完整的uIPAPI。本程序采用TCP通信模式,編寫核心C程序,通過TCP/IP用RSA+AES加密傳輸Contiki編譯文件到另一臺Linux虛擬機,虛擬機間通過虛擬網關進行數據傳輸。由于Android底層仍為Linux內核,故該傳輸方法在Android上同樣可用。相應虛擬機接收程序接收到Contiki編譯文件后,我們將自動加載Contiki虛擬機進程,執行相應應用程序。2.2系統設計2.2.1Contiki系統說明Contiki操作系統工作原理Contiki操作系統是基于事件驅動(Event-driven)內核的操作系統,在此內核上,應用程序可以在運行時動態加載,非常靈活。在事件驅動內核基礎上,Contiki實現了一種輕量級的名為protothread的線程模型,來實現線性的、類似于線程的編程風格。該模型類似于Linux和windows中線程的概念,多個線程共享同一個任務棧,從而減少RAM占用。Contiki還提供一種可選的任務搶占機制、基于事件和消息傳遞的進程間通信機制。Contiki中還包括一個可選的GUI子系統,可以提供對本地串口終端、基于VNC的網絡化虛擬顯示或者Telnet的圖形化支持。Contiki系統內部集成了兩種類型的無線傳感器網絡協議棧:uIP和Rime。uIP是一個小型的符合RFC規范的TCP/IP協議棧,使得Contiki可以直接和Internet通信。uIP包含了IPv4和IPv6兩種協議棧版本,支持TCP、UDP、ICMP等協議,但是編譯時只能二選一,不可以同時使用。Rime是一個輕量級為低功耗無線傳感器網絡設計的協議棧,該協議棧提供了大量的通信原語,能夠實現從簡單的一跳廣播通信,到復雜的可靠多跳數據傳輸等通信功能。2)Contiki操作系統的特點Contiki完全C語言開發、易于移植、支持大量的硬件平臺和開發工具、事件驅動機制占用內存小、集成了多種無線傳感器網絡協議、無專利和版權費、集成仿真工具等特點和優勢,已經成為無線傳感器網絡學術研究和產品開發的理想平臺,在歐洲已經得到廣泛應用,并逐漸得到其它地區開發人員的支持。2.2.2Linux下GCC編譯GCC工作原理Linux系統下的GCC(GNUCCompiler)是GNU推出的功能強大、性能優越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。

GCC編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的后綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過后綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。

.c為后綴的文件,C語言源代碼文件;

.a為后綴的文件,是由目標文件構成的檔案庫文件;

.C,.cc或.cxx為后綴的文件,是C++源代碼文件;

.h為后綴的文件,是程序所包含的頭文件;

.i為后綴的文件,是已經預處理過的C源代碼文件;

.ii為后綴的文件,是已經預處理過的C++源代碼文件;

.m為后綴的文件,是Objective-C源代碼文件;

.o為后綴的文件,是編譯后的目標文件;

.s為后綴的文件,是匯編語言源代碼文件;

.S為后綴的文件,是經過預編譯的匯編語言源代碼文件。2)GCC執行過程預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。3)GCC基本用法GCC最基本的用法是∶gcc[options][filenames]

其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。

-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。

-ooutput_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。

-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。

-O,對程序進行優化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。

-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。

-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。2.2.3交叉編譯的介紹所謂交叉編譯就是在一個平臺上生成可以再另一個平臺上執行的代碼,編譯的最主要的工作就是在將程序轉化成運行該程序的CPU所能識別的機器代碼,由于不同的體系結構有不同的指令系統。因此,不同的CPU需要有相應的編譯器,而交叉編譯就如同翻譯一樣,把相同的的程序代碼翻譯成不同CPU的對應可執行二進制文件。要注意的是,編譯器本身也是程序,也要在與之對應的某一個CPU平臺上運行。一般將交叉編譯的主機稱為宿主機,也就是普通的通用PC,而將程序實際的運行環境稱為目標機,也就是嵌入式系統環境。由于一般通用計算機擁有分層豐富的系統資源、使用方便的集成開發環境和調試工具等,而嵌入式系統的系統資源非常緊缺,無法在其上運行相關的編譯工具,因此,嵌入式系統的開發需要借助宿主機(通用計算機)來編譯出目標機的可執行代碼,交叉編譯的過程如圖2-2所示。圖2-2交叉編譯的過程本文移植所用的宿主機環境是virtualbox虛擬機搭建的linux系統,要實現移植需要建立交叉編譯工具鏈,將目標程序編譯成Androidforarm能運行的可執行代碼。2.2.4TCP/IP簡介TCP/IP指傳輸控制協議/網際協議(Transmission

Control

Protocol/InternetProtocol),它是供已連接因特網的計算機進行通信的通信協議,

定義了電子設備(比如計算機)如何連入因特網,以及數據如何在它們之間傳輸的標準。TCP和IP在一起協同工作。其中,TCP負責應用軟件(比如你的瀏覽器)和網絡軟件之間的通信,它將數據分割并裝入IP包,然后在它們到達的時候重新組合它們。當應用程序希望通過TCP與另一個應用程序通信時,它會發送一個通信請求。這個請求必須被送到一個確切的地址。在雙方“握手”之后,TCP將在兩個應用程序之間建立一個全雙工(full-duplex)的通信。這個全雙工的通信將占用兩個計算機之間的通信線路,直到它被一方或雙方關閉為止。而IP負責計算機之間的通信,它將包發送至接受者。通過IP,消息(或者其他數據)被分割為小的獨立的包,并通過因特網在計算機之間傳送。在TCP/IP中包含一系列用于處理數據通信的協議:TCP(傳輸控制協議)-應用程序之間通信UDP(用戶數據包協議)-應用程序之間的簡單通信IP(網際協議)-計算機之間的通信ICMP(因特網消息控制協議)-針對錯誤和狀態DHCP(動態主機配置協議)-針對動態尋址2.2.5信息加密簡介信息安全是非常重要的,與人們的工作、生活有著密切的關系.信息加密技術主要分為傳榆加密和存儲加密兩方面,而信息傳輸加密常用有鏈路加密、節點加密和端到端加密這三種主要方式,信息加密算法是網絡傳輸中最常用的算法,目的是對傳輸中的數據流加密,以防止通信線路上的竊聽、泄漏、篡改和破壞.加密技術分為對稱加密和非對稱加密兩類。1)對稱加密技術在對稱加密技術中,對信息的加密和解密都使用相同的鑰(通常稱之為“Session

Key

”)。這種加密方法可簡化加密處理過程,信息交換雙方都不必彼此研究和交換專用的加密算法。常用的算法包括:DES(DataEncryptionStandard):數據加密標準,速度較快,適用于加密大量數據的場合。3DES(TripleDES):是基于DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。AES(AdvancedEncryptionStandard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高;2)非對稱加密技術

非對稱加密體系中,密鑰被分解為一對(即公鑰和私鑰)。公鑰用于加密,私有密鑰用于解密,私鑰只能由生成密鑰的交換方掌握,公開密鑰可廣泛公布,但它只對應于生成密鑰的交換方。非對稱加密方式可以使通信雙方無須事先交換密鑰就可以建立安全通信,廣泛應用于身份認證、數字簽名等信息交換領域。常見的算法如下:RSA:由RSA公司發明,是一個支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;DSA(DigitalSignatureAlgorithm):數字簽名算法,是一種標準的DSS(數字簽名標準);ECC(EllipticCurvesCryptography):橢圓曲線密碼編碼學。本文使用的加密算法主要是通過融合RSA和AES,結合對稱加密和非對稱加密的優點,使數據保密更加可靠。2.3本章小結本章首先介紹了本課題的系統框圖,對系統的每個模塊的功能和實現過程進行了簡要分析。由宿主Linux主機對Contiki進行GCC編譯后,加密傳輸到目的虛擬機執行相應應用程序。接著介紹了Contiki操作系統、GCC編譯、交叉編譯、TCP/IP通信和通信加密算法等方面的知識,為后續章節跨界編譯和動態遷移奠定理論基礎。 Contiki系統研究3.1Contiki源碼分析Contiki微操作系統架構為模塊化架構,內核基于事件驅動模型,對每個單獨的進程都提供可選的線程設施,每個應用程序都可以調用服務程序[2],Contiki的系統模塊化架構如圖3-1所示。圖3-1Contiki系統模塊化架構接下來對Contiki源代碼進行分析,本文研究的Contiki-2.7為例,打開Contiki源文件目錄,可以看到主要有apps、core、cpu、doc、examples、platform、tools等目錄。下面將分別對各個目錄進行介紹。Core:core目錄下是Contiki的核心源代碼,包括網絡(net)、文件系統(cfs)、外部設備(dev)、鏈接庫(lib)等等,并且包含了時鐘、I/O、ELF裝載器、網絡驅動等的抽象。

Cpu:cpu目錄下是Contiki目前支持的微處理器,例如arm、avr、msp430等等。如果需要支持新的微處理器,可以在這里添加相應的源代碼。

Platform:platform目錄下是Contiki支持的硬件平臺,例如mx231cc、micaz、sky、win32等等。Contiki的平臺移植主要在這個目錄下完成。這一部分的代碼與相應的硬件平臺相關。

Apps:apps目錄下是一些應用程序,例如ftp、shell、webserver等等,在項目程序開發過程中可以直接使用。使用這些應用程序的方式為,在項目的Makefile中,定義APPS=[應用程序名稱]。在以后的示例中會具體看到如何使用apps。

Examples:examples目錄下是針對不同平臺的示例程序。Smeshlink的示例程序也在其中。

Doc:doc目錄是Contiki幫助文檔目錄,對Contiki應用程序開發很有參考價值。使用前需要先用Doxygen進行編譯。

Tools:tools目錄下是開發過程中常用的一些工具,例如CFS相關的makefsdata、網絡相關的tunslip、模擬器cooja和mspsim等等。3.2Contiki進程觸發示例進程無疑是一個系統最重要的概述。Contiki的進程機制是基于protothreads線程模型。為確保高優先級任務盡快得到響應,Contiki采用兩級進程調度。3.2.1ProtothreadsContiki使用Protothreads輕量級線程模型,在Protothreads基礎上進行封裝。傳統的桌面操作系統甚至服務器操作系統,每個進程都擁有自己的棧,在進行進程切換時,將進程相關信息(包括局部變量、斷點、寄存器值)存儲在棧中。然而,對于嵌入式系統,尤其是內存受限的傳感器節點幾乎不現實,基于這點考慮,Protothreads巧妙地讓所有進程共用一個棧,傳統的進程與Protothreads對比示意圖如圖3-2所示。圖3-2傳統進程與Protothreads對比示意圖從圖可以看出,原本需要3個棧的Thread機制,在Protothreads只需要一個棧。當進程在、數量很多的時候,由棧空間省下來的內存是相當可觀的。保存程序斷點在傳統的Thread機制很簡單,只需要保存私有的棧,然而Protothreads不能將斷點保存在公有棧中。Protothreads很巧妙地解決了這個問題,即用一個兩字節靜態變量存儲被中斷的行,因為靜態變量不從棧上分配空間,所以即使有任務切換也不會影響到該變量,從而達到保存短點的目的。下一次該進程獲得執行權的時候,進入函數體后就通過switch語句跳轉到上一次被中斷的地方。1)保存斷點保存斷點是通過保存行數來完成的。在被中斷的地方插入編譯器關鍵字_LINE_,編譯器便自動記錄所中斷的行數。展開那些具有中斷功能的宏,可以發現最后保存行數是宏LC_SET,取宏PROCESS_WAIT_EVENT()為例,將其展開得到如下代碼:#definePROCESS_WAIT_EVENT()PROCESS_YIELD()#definePROCESS_WAIT_EVENT()PROCESS_YIELD()#definePROCESS_YIELD()PT_YIELD(process_pt)#definePT_YIELD(pt)do{PT_YIELD_FLAG=0;LC_SET((pt)->lc);if(PT_YIELD_FLAG==0){returnPT_YIELDED;}while(0)值得一提的是,宏LC_SET展開包含語句case_LINE_,用于下次恢復斷點,即下次通過switch語句便可跳轉到case的下一語句。2)恢復斷點被中斷程序再次獲得執行權時,便從該進程的函數的執行體進入,按照Contiki的進程替換,函數體的第一條語句便是PROCESS_BEGIN宏,該宏包含一條switch語句。用于上一次被中斷的行,從而恢復執行,使PROCESS_BEGIN展開的源代碼如下:#definePROCESS_BEGIN()PT_BEGIN(process_pt)#definePROCESS_BEGIN()PT_BEGIN(process_pt)#definePT_BEGIN(pt){charPT_YIELD_FLAG=1;LC_RESUME((pt)->lc)#defineLC_RESUME(s)switch(s){case0;//switch語言跳轉到被中斷的行3.2.2進程控制模塊正如Linux一樣。Contiki也用一個結構來描述整個過程的細節,所不同的是,Contiki進程控制塊要簡單得多。使用鏈表將系統所有進程組織起來,如圖3-3所示:圖3-3Contiki進程控制塊Contiki系統定義了一個全局變量process_list作為進程鏈表的頭,還定義了一個全局變量process_current用于指向當前進程。成員變量next指向下一個進程,最后一進程的next指向空。Name是進程的名稱,可將系統配置(定義變量PROCESS_CONF_NO_PROCESS_NAMES為0)成沒有進程名稱,此時name為空字符串。變量state表示進程的狀態,共3種,即PROCESS_STATE_RUNNING、PROCESS_STATE_CALLED、PROCESS_STATE_NONE。變量needspoll標識進程優先級,只有兩個值0和1,needspoll為1意味著進程具有更高的優先級。1)進程變量thread進程的執行體,即進程執行實際上是運行該函數。在實際的進程結構體代碼中,該變量由宏PT_THREAD封裝,展開即為一個函數指針,關鍵代碼如下:PT_THREAD((*thread)(structpt*,process_event_t,process_data_t));PT_THREAD((*thread)(structpt*,process_event_t,process_data_t));#definePT_THREAD(name_args)charname_args/***宏展開***/char(*thread)(structpt*,process_event_t,process_data_t);2)成員變量ptContiki的進程是基于Protothreads,所以進程控制模塊需要有變量記錄被中斷的行數。結構體pt只有一個成員變量lc(無符號短整型),可以將pt簡單理解成保存行數的,相關源代碼如下:structptstructpt{lc_tlc;};typedefunsignedshortlc_t;3.2.3進程調度Contiki只有兩種優先級,用進程控制塊中變量needspoll標識,默認情況是0,即普通優先級。想要將某進程設為更高優先級,可以在創建之初指定其needspoll為1,或者運行過程中通過設置該變量動態提升其優先級。在實際的調度中,會先運行有高優先級的進程,而后再去處理一個事件,隨后又運行所有高優先級的進程。通過遍歷整個進程鏈表,將needspoll為1的進程投入運行,關鍵代碼如下:/***do_poll()關鍵代碼,由process_run調用***//***do_poll()關鍵代碼,由process_run調用***/for(p=process_list;p!=NULL;p=p->next)//遍歷進程鏈表{if(p->needspoll){p->state=PROCESS_STATE_RUNNING;p->needspoll=0;Call_process(p,PROCESS_EVENT_POLL,NULL);//將進程投入運行}}以上是進程的總體調度,具體到單個進程,成員變量state標識著進程的狀態,共有三個狀態PROCESS_STATE_RUNNING、PROCESS_STATE_CALLED、PROCESS_STATE_NONE。Contiki的進程狀態轉換如圖3-4所示。圖3-4Contiki進程狀態轉換圖創建進程(還未投入運行)以及進程退出(但此時還沒有從進程列表刪除),進程狀態都為PROCESS_STATE_NONE。通過進程啟動函數process_start將新創建的進程投入運行隊列(但未必有執行權),真正獲得執行權的進程狀態為PROCESS_STATE_CALLED,處在運行隊列的進程(包括正在運行和等待運行)可以調用exit_process退出。1)進程初始化系統啟動后需要先將進程初始化,通常在主函數調用,進程初始化主要完成事件隊列和進程鏈表初始化。將進程鏈表頭指向為空,當前進程也設為空。Process_int源代碼如下:voidprocess_init(void)voidprocess_init(void){/***初始化事件隊列***/lastevent=PROCESS_EVENT_MAX;nevents=fevent=0;process_maxevent=0;/***初始化進程鏈表***/process_current=process_list=NULL;}2)創建進程創建進程實際上是定義一個進程控制塊和定義進程執行體的函數。宏PROCESS的功能包括定義一個結構體,聲明進程執行體函數,關鍵源代碼如下:PROCESS(hello_world_process,PROCESS(hello_world_process,”Helloworld”);/***PROCESS宏展開***/PROCESS_THREAD(name,ev,data);structprocessname={NULL,strname,process_thread_##name}/***PROCESS_THREAD宏展開***/staticPT_THREAD(process_thread_##name(structpt*process_pt,process_event_tev,process_data_tdata))#definePT_THREAD(name_args)charname_args/***將參數代入,PROCESS宏最后展開結果***/staticcharprocess_thread_hello_world_process(structpt*process_pt,process_event_tev,process_data_tdata);structprocesshello_world_process={NULL,”Helloworld”,process_thread_hello_world_process}這里假設進程名稱為Helloworld??梢?,PROCESS宏實際上是聲明一個函數并定義一個進程控制模塊,新創建的進程next指針指向空,進程名稱為“Helloworld”,進程執行體函數指針為process_thread_hello_world_process,保存行數的pt為0,狀態為0(即PROCESS_STATE_NONE),優先級標記位needspoll也為0(即普通優先級)。PROCESS定義了結構體并聲明了函數,還需要實現該函數。通過宏PROCESS_THREAD實現。值得注意的是,盡管PROCESS宏展開包含了宏PROCESS_THREAD,用于聲明函數,而這里是定義函數,區別在于前者宏展開后前加了個分號。定義函數框架代碼如下:PROCESS_THREAD(hello_world_process,ev,data)PROCESS_THREAD(hello_world_process,ev,data)//staticcharprocess_thread_hello_world_process(structpt*process_pt,process_event_tev,process_data_tdata){PROCESS_BAGIN();//函數開頭必須有/***代碼放這***/PROCESS_BAGIN();//函數末尾必須有}欲實現的代碼必須放在宏PROCESS_BEGIN和PROCESS_END之間,這是因為這兩個宏用于輔助保存斷點信息(即行數),宏PROCESS_BEGIN包含switch(process_pt->lc)語句,這樣被中斷的進程再次獲利執行便可通過switch語句跳轉到相應的case,即被中斷的行。3)啟動進程函數process_start用于啟動一個進程,首先進行參數驗證,即判斷進程是否已經在進程鏈表中而后將進程加到鏈表,給該進程發一個初始化事件PROCESS_EVENT_INIT。函數process_start流程圖如圖3-5所示。圖3-5process_start流程圖process_start將進程狀態設為PROCESS_STATE_RUNNING,并調用PT_INIT宏將保存斷點的變量設為0(即行數為0)。調用process_post_synch給進程觸發一個同步事件,事件為PROCESS_EVENT_INIT??紤]到進程運行過程中可能被中斷,在進程運行前將當前進程指針保存起來,執行完再恢復。進程運行是由call_process函數實現。函數call_process流程圖如圖3-6所示。圖3-6call_process流程圖call_process首先進行參數驗證,即進程處于運行狀態(退出尚未刪除的進程狀態為PROCESS_STATE_NONE)并且進程的函數體不為空,接著講進程狀態設為PROCESS_STATE_CALLED,表示該進程擁有執行權。接下來,運行進程函數體,根據返回值判斷進程是否結束(主動的)或者退出(被動的),若是調用EXIT_PROCESS將進程退出,否則將進程狀態設為PROCESS_STATE_RUNNING,繼續放在進程鏈表。4)進程退出進程運行完或者收到退出的事件都會導致進程退出。根據Contiki編程規劃,進程函數體最后一條語句是PROCESS_END(),該宏包含語句returnPT_ENDED,表示進程運行完畢。系統處理事件時(事件綁定過程,事實上執行進程函數體),倘若該進程恰好收到退出事件,thread便返回PT_EXITED,進程被動退出。還有就是給該進程傳遞退出事件PROCESS_EVENT_EXIT也會導致進程退出。進程退出的函數exit_process流程圖如圖3-7所示。圖3-7exit_process流程圖進程退出函數exit_process首先對傳進來的進程p進行參數驗證,確保該進程在進程鏈表中并且進程狀態為PROCESS_STATE_CALLED/RUNNING(即不能是NONE),接著將進程狀態設置為NONE。隨后,向進程鏈表的所有其他進程觸發退出事件PROCESS_EVENT_EXIT,此時其他進程依次執行處理該事件,其中很重要一部分是取消與該進程的關聯。進程執行函數體thread進行善后工作,最后將進程從進程鏈表刪除。3.3本章小結本章主要介紹了Contiki微操作系統的系統結構及源碼架構,了解Contiki系統的進程觸發機制及主要函數的代碼結構和執行流程。從實驗結果可以看出,Contiki的進程機制是基于protothreads線程模型,通過進程初始化、創建進程、啟動進程和進程退出四個主要步驟來實現進程出發。本章研究的幾個主要進程調度函數,在后續研究中被廣泛使用。第四章Linux與Android編譯研究4.1Contiki在linux下的編譯4.1.1Linux環境下的編譯1)進程調度新建文件夾src放置Contiki在Linux平臺運行所需依賴文件,各目錄所含文件如表4-1所示。/srcautostart.c,clock.c,etimer.c,main.c,process.c,procinit.c,timer.c/coreContiki.h/core/sysautostart.h,clock.h,etimer.h,process.h,procinit.h.time.h/platform/nativeContiki-conf.h表4-1Contiki在Linux試運行所需源文件前面提到,Contiki是進程驅動型的系統,所以對其編譯的關鍵就是需要編寫一個進程來啟動系統調度。新建一個文件Main.c,Main.c中的相關代碼如下:#include<stdint.h>#include<stdio.h>#include"Contiki.h"#include<sys/process.h>#include<sys/autostart.h>PROCESS(blink_process,"Blink");PROCESS_THREAD(blink_process,ev,data){PROCESS_BEGIN();printf("HelloWorld!\r\n");PROCESS_END();}intmain(){inti=0;printf("Initialising\n");process_init();process_start(&blink_process,NULL);printf("Processesrunning\n");}其中,PROCESS_THREAD是我們系統的進程函數,在這個函數中定義該進程的名稱為“Blink”,代號為blinkproess,主要的工作任務,這里我們只是簡單的讓其打印一句“HelloWorld”。在main函數中,用到了兩個函數:process_init()初始化進程process_start(&blink_process,NULL)。啟動進程這樣,我們通過開啟一條進程,激活了Contiki操作系統,它便開始進行系統調度。由于這里只開一條進程,所以看不出所以然,我們也可以設置多條進程并啟動:PROCESS_THREAD(blink_process,ev,data){PROCESS_BEGIN();printf("HelloWorld!\r\n");PROCESS_END();}PROCESS_THREAD(blink2_process,ev,data){PROCESS_BEGIN();printf("HelloWorldtoo!\r\n");PROCESS_END();}intmain(){inti=0;printf("Initialising\n");process_init();process_start(&blink_process,NULL);process_start(&blink2_process,NULL);printf("Processesrunning\n");}2)Makefile的編寫Makefile是一個編譯文件。我們知道一個工程中的文件可能非常多,并按類型、功能、模塊分別放在若干個目錄中,如果我們使用Gcc一個文件一個文件去編譯的話,無疑工作量是巨大的,所以這個時候我們需要用到Makefile。Makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,因為Makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。當我們編寫完Makefile的時候,我們只需要執行make一下,便可以自動將我們需要的文件全部按照我們的要求編譯并生成可執行文件。在本系統中,我們先通過編譯Contiki系統在Linux平臺可運行程序,為在linux虛擬機間的遷移做準備。我們的Makefile文件如下:VPATH=srcCFLAGS=-static-Wall-O2-Wno-strict-aliasing-IContiki-2.7/core/-IContiki-2.7/platform/native/-IContiki-2.7/cpu/native/CC =gccINSTALL =installTARGET =Contikiobjs =main.oautostart.oprocess.oall:$(TARGET)Contiki:$(objs) $(CC)$(CFLAGS)-o$(TARGET)$(objs)main.o:main.cautostart.o:autostart.cprocess.o:process.cinstall:$(TARGET) $(INSTALL)$^/binclean: rm-rf*.oclean-all: rm-rf*.o$(TARGET)----------------------------------------------------------------------------.PHONY:$(PHONY)installcleandistclean在這個文件中,我們主要關注幾個點:CFLAGS,這個參數指明了編譯的條件,-static表示靜態編譯,-Wall表示編譯中忽略所有警告等等。CC,這個參數指明使用的編譯器是什么,這里我們寫的程序是C程序,所所以用的是GCC。c.TARGET,這個參數指明編譯后要生成的目標文件是什么,默認是a.out,這里我們定義為Contiki。Objs,這個參數表示我們編譯后每個文件自己生成的可執行文件。在Makefile下面,我們可以指定我們要編譯的文件有哪些,這里我們只需編譯三個文件,即main.c、autostart.c、process.c。再往下,我們定義了clean操作,目的是為了在編譯之后我們可以通過執行這個操作把一些中間文件刪除掉。3)編譯過程命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為后綴的目標文件。當所有的目標文件都生成之后,gcc就調用ld來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方,從而生成目標可執行文件Contiki,在Linux上運行,如圖4-1(a)(b)(c)所示。圖4-1(a)Contiki在Linux手工編譯過程圖4-1(b)Contiki在Linux手工編譯過程圖4-1(c)Contiki在Linux手工編譯過程4)自動編譯自動編譯,將命令行集成一個自動執行腳本,不需要一步步手工輸入命令行,實現automake。相關代碼如下:voidmain(void){ char*argv[3]; argv[0]="up_client"; argv[1]=""; argv[2]=ADDRESS; if(!access("Contiki",0)) { //此處做遷移函數 } else { if(access("Makefile",0))printf("herehasnoMakefileexist,pleasehaveacheck\n"); else { system("make"); system("makeclean"); while(access("Contiki",0)); //此處做遷移函數 } printf("Successful!!!!\n"); }}這里,我們用到了linux的系統函數system()。這個函數可以通過字符串的形式調用一些系統命令,例如我們這里通過字符串“make”調用了系統make命令,進而對Makefile進行編譯。整個程序的大體目的是先查找Contiki目標文件是否存在,如果存在則進行系統遷移(這個在后續章節會講到),如果不存在則執行系統命令make進行編譯,然后等待Contiki目標文件生成后則進行系統遷移。4.2Contiki在Android環境下的編譯4.2.1交叉編譯工具鏈的建立訪問codesourcery官方網站下載最新的ARM交叉編譯工具鏈,下載最新版本:/a/17516.htm

/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2解壓到當前目錄,使用以下命令:$tar-jxvfarm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2移動到/usr目錄里面,使用以下命令:mvarm-2009q3/usr/設置環境變量,使用以下命令:$sudosu#vim/etc/bash.bashrc在最后加上:exportPATH=$PATH:/usr/arm-2009q3/binexportPATH5)啟動環境變量設置:#source/root/.bashrc6)檢查是否設置成功:#echo$PATH結果如果是:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/arm-2009q3/bin

則說明設置成功!7)檢查安裝是否成功:使用命令:$arm-linux-gcc-v結果如果是:Usingbuilt-inspecs.

Target:arm-none-linux-gnueabi

...

gccversion4.4.1(SourceryG++Lite2009q3-67)

則說明安裝成功!交叉編譯工具鏈的建立過程如圖4-2所示。圖4-2交叉編譯工具鏈的建立過程4.2.2Makefile文件編寫Android與Linux的Makefile唯一的差別在于CC參數,之前是gcc,而這里改成了arm-linux-gcc。這也是交叉編譯鏈建立的結果。Makefile文件如下所示:VPATH=srcCFLAGS=-static-Wall-O2-Wno-strict-aliasing-IContiki-2.7/core/-IContiki-2.7/platform/native/-IContiki-2.7/cpu/native/CC =arm-linux-gccINSTALL =installTARGET =Contikiobjs =main.oautostart.oprocess.oall:$(TARGET)Contiki:$(objs) $(CC)$(CFLAGS)-o$(TARGET)$(objs)main.o:main.cautostart.o:autostart.cprocess.o:process.cinstall:$(TARGET) $(INSTALL)$^/binclean: rm-rf*.oclean-all: rm-rf*.o$(TARGET)----------------------------------------------------------------------------.PHONY:$(PHONY)installcleandistclean4.2.3編譯過程與Linux自動編譯過程相似,同樣編寫自動執行腳本,編譯結果如圖4-3所示。圖4-3Contiki在Android環境下的編譯過程編譯譯生成目標可執行文件Contiki,只能在Android上運行,不能在Linux上運行。如圖4-4所示。圖4-4Android編譯文件在Linux上運行效果4.2.3自動編譯自動編譯過程和linux方法一致,這里就不贅述了。關鍵要注意在最后編譯的時候是使用交叉編譯鏈編譯而不是gcc。綜上,Contiki的Android/VirtualBox跨界編譯成功實現。4.3本章小結本章主要介紹了Contiki微操作系統的系統結構及源碼架構,了解Contiki系統的進程觸發機制及主要函數的代碼結構和執行流程。從實驗結果可以看出,Contiki的進程機制是基于protothreads線程模型,通過進程初始化、創建進程、啟動進程和進程退出四個主要步驟來實現進程出發。本章研究的幾個主要進程調度函數,在后續研究中被廣泛使用。系統動態遷移研究網絡傳輸研究5.1.1TCP協議傳輸控制協議(TransportControlProtocol)是一種面向連接的,可靠的傳輸層協議。面向連接是指一次正常的TCP傳輸需要通過在TCP客戶端和TCP服務端建立特定的虛電路連接來完成,該過程通常被稱為“三次握手”。可靠性可以通過很多種方法來提供保證,在這里我們關心的是數據序列和確認。TCP通過數據分段(Segment)中的序列號保證所有傳輸的數據可以在遠端按照正常的次序進行重組,而且通過確認保證數據傳輸的完整性。用三次握手建立TCP連接的過程如下:另外,每一條TCP連接唯一地被投降兩端的兩個斷點(即兩個套接字)所確定。5.1.2Socket套接字在網絡上,兩個程序間的數據的交換可以通過一個雙向的通信連接實現,這個連接的一端稱為一個socket,也稱作套接字。Socket用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。(1)服務器監聽:是服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態。(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。在本系統中,我們將使用Socket套接字使用TCP協議來對編譯后的系統目標文件進行網絡傳輸,實現系統遷移。RSA_AES加密算法研究RSA加密算法研究RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。RSA加解密的算法完全相同,設

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論