譯文基于ARM的嵌入式Linux關鍵技術研究_第1頁
譯文基于ARM的嵌入式Linux關鍵技術研究_第2頁
譯文基于ARM的嵌入式Linux關鍵技術研究_第3頁
譯文基于ARM的嵌入式Linux關鍵技術研究_第4頁
譯文基于ARM的嵌入式Linux關鍵技術研究_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、附件C:譯文基于ARM的嵌入式Linux關鍵技術研究摘要:目前,嵌入式Linux已經成為嵌入式系統領域研究的重點。在本文中,我們著重對Linux內核進行分析。在分析的基礎上研究和探討嵌入式Linux的關鍵技術,如基于ARM的Linux的移植方法,Linux實時性的提升,Linux設備驅動的開發技術等。通過關鍵技術的研究,我們建立自己的體系,為Linux應用開發的打下一個良好的基礎。關鍵詞:嵌入式Linux;關鍵技術;移植;實時性;設備驅動。I. 引言近年來,隨著信息技術的發展,嵌入式系統已被廣泛應用于社會生活的各個方面,如移動計算設備,網絡設備,家電,儀器等。在各種嵌入式操作系統中,Linux

2、憑借其獨特的優勢,在嵌入式領域占據著巨大份額,并已成為世界上第二大操作系統。Linux擁有開源和豐富的軟件資源,支持多線程,多用戶,多進程,具有良好的可移植性,功能強大而穩定。它支持許多的微處理器架構,硬件設備,圖形支持和通信協議等1。Linux作為可以修改的底層操作系統,能滿足特定應用的不同要求。Linux在嵌入式領域有很大的潛力,深受許多企業和科研單位的青睞。在嵌入式領域,Linux的研究涉及諸多關鍵技術,如Linux內核的分析和修改,Linux在不同的微處理器上的移植。由于Linux本身的特點,它的實時性是不夠的,但在很多嵌入式領域,實時性能的要求都非常高,這就需要對Linux的實時性進

3、行提升,所以實時技術是一種實用且意義重大研究課題。此外,還有嵌入式Linux設備驅動程序開發技術。Linux的這些技術的成熟直接影響有關領域的具體應用,因此,嵌入式Linux技術的研究具有很好的價值和實際意義。II. Linux的內核架構Linux內架結構主要包括五個子系統,進程調度模塊,內存管理模塊,文件系統模塊,進程間通信模塊,網絡接口模塊,如圖1所示。圖1. Linux內核模塊和關系圖圖1描述了各子系統之間的關系2。由于每個子系統需要依靠進程調度來掛起或恢復進程,所以進程調度在模塊的中心。 進程調度和內存管理之間的關系:進程調度和內存管理之間的相互依存,在多道程序設計環境,進程必須建立以

4、確保程序的運行,進程的創建需要首先將程序和數據裝入內存。 進程間通信和內存管理之間的關系:進程間通信子系統依賴內存管理子系統以支持內存共享通信機制,它允許兩個進程不僅有一個私有空間,還可以存取共同的內存區域。 虛擬文件系統和網絡接口之間的關系:虛擬文件系統使網絡接口支持網絡文件系統(NFS),使內存管理支持RAMDISK設備。 虛擬文件系統和內存管理之間的關系:內存管理使虛擬文件系統支持交換,交換進程被調度器周期性調度。當進程訪問的內存映像快要溢出時,內存管理將請求發送到文件系統,并掛起目前正在運行的進程。III. Linux內核的移植嵌入式Linux移植分以下步驟:獲得源代碼;建設交叉編譯環

5、境;移植的Linux引導程序(UBOOT或VIVI),然后配置和編譯內核,移植和加載嵌入式文件系統,開發和調試應用程序,下載程序;在本文中,主要介紹Linux內核的移植。A. 修改Makefile修改內核源代碼根目錄下的makefile文件,從而指定要為ARM架構編譯的目標代碼需,編譯使用的是ARM-LINUX交叉編譯器。在設計時,可以修改makefile文件,在其中添加以下兩行代碼。ARCH?=armCROSS COMPILE?= arm-linux-然后,設置PATH環境變量來尋找交叉編譯器工具鏈,然后將其添加/.bashrc。#Vi /.bashrcexport PATH =/bin:$

6、PATHB. 設置閃存分區閃存分區的支持是成功移植Linux內核的關鍵。我們需要修改如下三個文件:1) 添加以下內容到文件arc/arm/machs3c2410/devs.c中。#include<linuxlmtdlpartitions.h>#include <linuxlmtdlnand.h>#include <asmlarchlnand.h>建立NAND閃存的分區表,該表分為四個區域,分別存儲引導程序,內核,rootfs和用戶文件系統;添加NAND閃存分區,并同時建立NAND閃存芯片的支持,最后,NAND閃存芯片添加完成并支持了NAND閃存驅動。另外,還

7、要修改arch/arm/machs3c2410/devs.C文件中的s3c_device_nand結構體變量,同時添加對dev成員的賦值。2) 指定啟動時初始化內核啟動時,可以依據對分區的設置進行初始配置,然后修改arch/am4mach-s3c2410/machsmdk2410.e文件下的smdk2410_devices,指明初始化時包括在前面所設置的flash分區信息,并添加如下語句:&s3c_device_nand。3) 禁止Flash ECC校驗內核一般都是通過UBOOT寫到Nand Flash的。UBOOT則通過軟件ECC算法來產生ECC校驗碼,這與內核校驗的ECC碼不一樣,

8、內核中的ECC碼是由S3C2410中Nand Flash控制器產生的。所以這里選擇禁止內核ECC校驗。修改drivers/mtd/nand/s3c2410.c下的s3c2410_nand_init_chip()函數,可在該函數體最后加上如下一條語句:chip->eccmode=NAND_ECC_NONE;C. 配置內核配置內核時,配置必要的功能和移除不必要的模塊1) 添加devfs配置當內核啟動時,為了使內核支持devfs,且在/sbin/init運行之前能自動掛載/dev為devfs文件系統,應修改fs/Keonfig文件,找到menu"Pseudo filesystems&

9、quot;并添加如下語句:config DEVFS_FSbool " Idev file system support (OBSOLETE)"default yconfig DEVFS_MOUNTbool "Automatically mount at boot"default ydepends on DEVFS_FS2) 內核配置選項配置Linux內核有好幾種方法,比如:make config, make menuconfig, make xconfig. 在本文中,我們采取“make menuconfig”來配置內核。配置時,選擇的原則是編譯很少使用

10、的功能代碼成可裝載模塊,以減少內核的長度和內存消耗。經常使用和與內核密切相關的函數代碼可以直接編譯進內核。運行“make menuconfig命令”,我們在smdk2410_defconfig的基礎之上配置內核。S3C2410開發板,有幾個關鍵的配置,如配置可加載模塊,配置MTD子系統,配置文件系統等3。D. 內核的編譯和下載1) 內核編譯內核配置好后,就可以編譯內核了。在編譯內核之前,我們可以使用命令“make clean”,以清除以前編譯的殘留文件,例如目標文件,模塊文件和臨時文件,然后使用命令“make dep”,該命令為Linux搜索并輸出源代碼的依賴,從而生成依賴文件,然后使用命令“

11、make zImage”編譯內核。# make zImage編譯完成后,兩個內核映像文件“Image”和“zImage”將在arch/arm/boot目錄生成,Image是正常大小的映像文件,zImage是壓縮后的映像文件。2) 內核下載下載內核之前,確保引導程序已被下載到ARM開發板。我們使用USB方式下載,用DNW啟動目標板。輸入的命令“vivi>loadflash kernel u”,然后選擇zImage,就可以完成下載過程。IV. 實時性的改進A Linux的實時性問題一般的Linux不是實時操作系統,應用程序缺乏實時性會是一個嚴重的問題。約束Linux操作系統實時性的因素,主要

12、包括以下幾點(4, 5)。1) 非搶占的內核搶占可描述為以下過程,當出現一個別比目前系統中正在運行進程更高優先級的進程時,系統會立即中斷正在運行的進程,并切換到高優先級的進程。2) 進程同步和互斥Linux使用信號的方法來確保進程同步與互斥。由于頻繁的鎖定和解鎖信號的操作會影響系統的整體性能,因此Linux采用粗糙的時鐘粒度的策略。信號的鎖定和解鎖操作會造成一個更長的時間間隔,所以系統往往不能滿足許多所需的硬實時應用。3) 優先級反轉Linux操作系統不提供優先級繼承策略,所以優先級反轉現象會使得高優先級的實時進程被低優先級的進程阻塞,從而導致執行時間的不確定性。4) 時鐘粒度粗糙時鐘管理是操

13、作系統的脈搏,Linux任務調度器的時間精度不能滿足一些對時間精度要求嚴格的實時應用。Linux的時鐘頻率是100Hz,時鐘周期為10ms,時鐘精度粗糙,這些都不能滿足實時性要求。5) 中斷處理在系統調用過程中,Linux經常關閉中斷很長一段時間,以保護關鍵資源。這將增加中斷的延遲時間,阻塞要立即處理的高優先級進程,導致實時任務不能按計劃及時的執行。總之,Linux是作為一個分時操作系統,必須修改才后才能滿足實時性。B Linux內核實時性的改進目前,許多方法被用來實現Linux的實時性。在本文中,通過兩個方面改進Linux的實時性:增加內核的實時調度策略5。1) 雙內核的方法在這種方法中,我

14、們采用兩個內核,它們可以一起工作在相同的硬件平臺上,即,在硬件和普通Linux內核之間添加一個小的實時內核,它可以管理中斷,并提供一些必要的功能,比如建立低級別的任務,中斷服務程序等。如圖2所示。圖2. Linux實時性支持的雙內核結構實時內核層負責硬件管理,并提供實時任務管理,普通Linux內核則作為實時內核調度的最低優先級任務(即空閑任務)6。實時任務直接運行在實時內核上。沒有實時任務運行時,調度普通Linux內核。作為實時內核,它并不總是關閉硬件中斷或接收中斷信號。當需要處理的中斷信號時,實時進程將搶占Linux內核。如果需要通過普通的Linux內核處理中斷信號,那么實時內核將通過狀態標

15、志位和中斷標志捕獲中斷,然后傳遞中斷信號給普通Linux內核。根據雙內核結構,Linux內核的修改主要包括幾個方面。添加控制點到內核的實時性受影響的位置,從而Linux內核可以被搶占且內核搶占延遲減少。分解系統需要執行較長時間,從而使實時任務隨時中斷非實時任務。2) 實時任務的調度策略針對不同的應用程序采取不同的實時調度策略。因此,RTOS的調度類型直接關系到其應用范圍。下面是普片的實時調度算法(5,6)。PD:基于優先級的調度算法。TD:基于時間的進程調度算法。SD:基于比例共享調度算法。基于優先級的調度算法(PD):調度器在優先級的基礎上尋找下一個需要執行的任務,調度算法可以劃分成以下兩種

16、類型:靜態優先級調度算法和動態優先級調度算法。靜態優先級調度算法:這種算法給那些系統中得到運行的所有進程都靜態地分配一個優先級。靜態優先級的分配可以根據應用的屬性來進行,比如任務的周期,用戶優先級,或者其它的預先確定的策略。動態優先級調度算法:這種算法根據任務的資源需求來動態地分配任務的優先級。EDF算法(最早截止期限優先)是一種典型的動態優先級調度算法,該算法根據就緒隊列中的各個任務的截止期限來分配優先級,具有最近的截止期限的任務具有最高的優先級。基于時間的進程調度算法(TD):這種調度算法本質上是一種設計時就確定下來的離線的靜態調度方法。在系統設計階段,每一項任務的開始,切換以及結束時間等

17、,都必須事先做出明確的安排和設計。基于比例的共享調度算法(SD):SD的基本思想可以描述如下:按照一定的權重(使用的CPU比例)調度一組需要調度的任務,讓它們的執行時間與它們的權重成正比。我們可以通過兩種方法實現基于比例的共享調度算法:當各種就緒進程出現在當前調度隊列時,我們規范隊列的第一個頻率,并調度隊列中的進程執行。先后調度就緒隊列中的各個進程以使其運行,并根據每個進程權重的分配指定運行時間片。三種調度策略的綜合算法。現在我們同時采用三種算法:基于優先級的調度算法,基于時間的進程調度算法和基于比例的共享調度算法。添加幾個任務調度屬性到每個任務,如任務的優先級別,任務的開始和完成時間,我們采

18、取這些屬性作為進程調度的基礎5,再實現一個普通的調度框架,它支持各種調度算法,如圖3所示。圖3. 調度結構從圖3我們可以看到,調整這些屬性的值,并且依據某種優先級使用這些屬性值,調度器以其各自的優勢來運用這些類型的調度算法。這三種調度算法可以無縫集成在一起,首先為每個實時任務定義四個調度屬性,如優先級,開始時間,結束時間和預算,不同的屬性對應不同的調度策略。整個結構分兩個模塊,調度屬性模塊和調度選項模塊6。屬性調度模塊分配多個屬性值給每個實時任務,并通過這幾個屬性的值決定屬性優先級,然后根據優先級別選擇不同的調度策略去執行任務。V. 設備驅動程序開發技術A. Linux設備驅動程序的分類和通用

19、性1) Linux設備驅動程序的分類Linux支持三種類型的硬件設備:字符設備,塊設備和網絡設備7。字符設備通常直接傳輸來自用戶進程的不帶緩存的數據。塊設備的讀寫則以塊為單位,塊可以被隨機訪問。網絡設備在Linux中有著特殊的處理,它沒有被映射到文件系統的設備節點,但要通過套接字接口獲取。字符設備和塊設備的主要不同在于,當發送讀/寫請求給字符設備時,實際硬件I/O的操作立即發生;塊設備使用一個系統內存作為操作實際I/O的緩沖存儲。2) Linux設備驅動程序的通用性實際上,所有的嵌入式Linux設備驅動程序都有一些共同特征。主要包括以下幾點7。讀/寫。幾乎所有的設備都有數據輸入和輸出。每個驅動

20、必須負責讀/寫操作,而讀/寫由驅動程序完成。OS定義讀/寫接口后,驅動程序就能完成特定的功能。當驅動需要實現時,接口的讀/寫功能需要注冊到OS。中斷。操作系統必須提供響應驅動中斷的能力。首先我們必須注冊中斷處理到系統,在硬件中斷發生后,操作系統將調用驅動的處理程序。時鐘。在開發設備驅動時,經常用到時鐘,操作系統必須為驅動提供計時機制,經過預訂時間后,已注冊的時鐘函數將被調用。B. 嵌入式Linux設備驅動的元素驅動程序的開發是Linux內核的開發。在完成一個設備驅動后,用戶可以動態加載或不加載設備驅動到內核8。1) 模塊初始化函數:Init_module()。該函數是一個默認函數,在各個內核模

21、塊加載后會首先調用,它是模塊的一個入口點。Init_module()的作用是為稍后調用模塊函數作準備。一般來說,設備的注冊在此函數內完成,模塊加載后,內核會知道設備的存在。2) 模塊卸載函數Cleanup_module()。該函數在模塊從內核卸載時會調用,它將卸載之前注冊的函數。Cleanup_module()必須完全卸載內核里注冊的功能函數,此函數會撤銷所有init_module()的完成的事件。否則,當下次調用這個模塊時,會造成重復函數名稱的錯誤。3) 設備驅動接口:file_operations。操作系統使用file_operations 結構體來訪問設備驅動函數,控制硬件。于各個設備操

22、作,設備驅動包含本身對應的函數入口。結構體file_operations 主要包含幾個功能諸如打開、讀、寫、釋放以及其他功能成員。C. 設備驅動的框架和開發流程1) 設備驅動框架在Linux設備驅動和內核之間的接口可以分為三個部分:系統的啟動代碼,設備接口和內核接口。如圖4所示。圖4. 設備驅動框架根據圖4(8,9),我們可以看出驅動與內核之間的接口通過數據結構“file_operations” 實現的;驅動與系統啟動之間的接口使用驅動來初始化各種設備;設備接口描述了驅動與設備之間如何交互。驅動程序有用一個數據結構“file_operations”,其中包含的多數指針指向驅動。在啟動系統時,內

23、核調用每個驅動的初始化函數來傳輸驅動的主要設備號和內核程序中的地址結構體指針。然后內核通過主要的設備驅動號索引和訪問驅動的子程序,完成open(),read(),write()或其他操作。2) 嵌入式Linux設備驅動程序的開發流程。通常使用以下的開發流程。定義主設備號和次設備號,也可以動態得到它們。執行驅動程序的初始化和刪除功能,如果驅動程序使用模塊的風格,它會執行模塊初始化和刪除功能。設計需要實現的文件操作,定義文件操作結構。執行所需的文件操作調用,如讀,寫等。執行中斷服務,把“equest_irq”注冊到內核。編譯驅動程序到內核中且使用命令“insmod”加載。生成設備節點文件。VI.

24、結論Linux操作系統已經被成功地應用于嵌入式領域,憑借著其強大的功能,開源等優點,成為嵌入式領域中的熱點。本文已經深入分析了Linux內核,討論了基于ARM平臺的內核移植技術。根據Linux的實時性的一些問題,我們提出了一些項目的改進;此外,還討論了Linux設備驅動程序的通用性和開發流程。參考文獻1 Chen Lijun,"Understanding Linux kernel source code deeply"M,Beijing: Posts & Telecom Press. 2002.2 KAMAL R,"Embedded Systems Arc

25、hitecture,Programming andDesign" M,The McGraw2HiIl Companies.2006.3 Yang shuiqing,"Embedded Linux System Development for ARM"M,Publishing House of Electronics industry.2009.4 David Kalinsky,"Basic Concepts of Real-Time Operating Systems",D.Kalinsky Associates.2003.11.5 RED-Linux:for Real-Time and Embe

溫馨提示

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

最新文檔

評論

0/150

提交評論