




已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章 嵌入式Linux開發(fā),主講:李巖,現(xiàn)在 Linux 廣泛用于各類計(jì)算應(yīng)用,不僅包括 IBM 的微型 Linux 腕表、手持設(shè)備(PDA 和蜂窩電話)、因特網(wǎng)裝置、瘦客戶機(jī)、防火墻、工業(yè)機(jī)器人和電話基礎(chǔ)設(shè)施設(shè)備,甚至還包括了基于集群的超級計(jì)算機(jī)。,本章主要介紹了: 怎樣應(yīng)用Linux來進(jìn)行嵌入式系統(tǒng)的開發(fā)。 選用Linux操作系統(tǒng)的優(yōu)勢。 Linux的簡化版本uClinux相關(guān)知識。如內(nèi)存管理、進(jìn)程管理、啟動過程等。 開發(fā)工具Hittool的具體應(yīng)用。,6.1 嵌入式Linux概況,Linux操作系統(tǒng)開放源代碼,可以裁剪內(nèi)核,并已在x86、Alpha、Sparc、MIPS、PPC、Motorola、NEC和ARM等硬件平臺上穩(wěn)定、高效地運(yùn)行。 Linux操作系統(tǒng)作為一種多任務(wù)、穩(wěn)定可靠、內(nèi)核可裁剪的系統(tǒng),是開發(fā)嵌入式軟硬件產(chǎn)品的優(yōu)秀軟件平臺。 嵌入式Linux是一種開放源碼、軟實(shí)時(shí)、多任務(wù)的嵌入式操作系統(tǒng)。,6.1.1 嵌入式Linux,在嵌入式開發(fā)中,隨著微處理器的產(chǎn)生,價(jià)格低廉、結(jié)構(gòu)小巧的CPU和外設(shè)接口提供了穩(wěn)定可靠的硬件架構(gòu)。 高端嵌入式系統(tǒng)要求許多高級的功能,如圖形用戶界面和網(wǎng)絡(luò)支持。許多高端RTOS供應(yīng)商已經(jīng)提供了這些功能,但其價(jià)格也很高,一般人難以接受。 Linux為嵌入式操作系統(tǒng)提供了一個(gè)極有吸引力的選擇,它是一個(gè)類UNIX的、以內(nèi)核為基礎(chǔ)的、有完備內(nèi)存保護(hù)機(jī)制的、多任務(wù)多進(jìn)程的操作系統(tǒng)。 由于Linux具有開放性,所以許多人認(rèn)為Linux非常適合多數(shù)Intemet設(shè)備。他們認(rèn)為Linux可以支持不同的設(shè)備,支持不同的配置。,6.1.1 嵌入式Linux,1. 可運(yùn)行于多種硬件平臺 Linux符合IEEE POSIX.1標(biāo)準(zhǔn),使應(yīng)用程序具有較好的可移植性。 Linux內(nèi)核已經(jīng)被移植到多種硬件平臺上,這對受開銷、時(shí)間限制的研究與開發(fā)項(xiàng)目是很有吸引力的。 2. 可裁剪,性能優(yōu)異,應(yīng)用軟件豐富 Linux的動態(tài)模塊加載使Linux的裁剪極為方便,高度模塊化的部件使添加非常容易。 Linux是一個(gè)全面的多任務(wù)和真正的32位操作系統(tǒng)。系統(tǒng)運(yùn)行穩(wěn)定,功能強(qiáng)大,支持多種硬件平臺,應(yīng)用工具多。 3. 使用成本低 Linux是免費(fèi)軟件,只要遵守GPL(GNU General Public License)的規(guī)定,就可以免費(fèi)獲得拷貝,并進(jìn)行開發(fā)和商業(yè)發(fā)行。,6.1.1 嵌入式Linux,4. 強(qiáng)大的網(wǎng)絡(luò)功能 Linux操作系統(tǒng)最突出的是網(wǎng)絡(luò)部分,基本上所有的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)接口都可以在Linux上找到。 Linux內(nèi)核對網(wǎng)絡(luò)協(xié)議棧的設(shè)計(jì)是從簡捷實(shí)用的角度出發(fā)的,它有一整套的網(wǎng)絡(luò)協(xié)議模塊。 Linux的網(wǎng)絡(luò)功能十分強(qiáng)大,更重要的是, Linux的網(wǎng)絡(luò)功能和協(xié)議是以內(nèi)核可選的模塊方式提供的,它允許用戶自由地裁剪和優(yōu)化。 5. GUI開發(fā)支持 Linux本身有性能優(yōu)秀的X Window系統(tǒng),在X Window系統(tǒng)的支持下,能方便地進(jìn)行圖形用戶界面的開發(fā)。,6.1.1 嵌入式Linux,X Window是一個(gè)在大多數(shù)UNIX工作站上使用的圖形用戶界面。 X Window系統(tǒng)應(yīng)用于嵌入式系統(tǒng)時(shí),要考慮嵌入式系統(tǒng)的特殊條件。 6. 豐富的開發(fā)技術(shù)資源 Linux在這幾年中不斷成熟,越來越多的人加入了Linux的行列。 這意味著對新硬件的Linux驅(qū)動程序甚至比用于其他UNIX系統(tǒng)(如Solaris的驅(qū)動程序)還來得及時(shí)。 Linux龐大的志愿者網(wǎng)絡(luò)在生產(chǎn)“補(bǔ)丁”程序方面反應(yīng)很快。,6.1.2 嵌入式Linux的組成,最基本的嵌入式Linux系統(tǒng)需要3個(gè)基本元素: 系統(tǒng)引導(dǎo)程序,用于完成機(jī)器加電后的系統(tǒng)定位引 Linux系統(tǒng)內(nèi)核,為嵌入式應(yīng)用提供一個(gè)軟件環(huán)境,為應(yīng)用程序完成基本的底層的資源管理工作; 初始化過程,完成基本的初始化。 為使這個(gè)最小嵌入式系統(tǒng)具有一定的實(shí)用性,還需加上硬件的驅(qū)動程序及個(gè)或幾個(gè)應(yīng)用進(jìn)程以提供必要的應(yīng)用功能支持。 如果應(yīng)用比較復(fù)雜,可能還需要添加一個(gè)可以在ROM或RAM中使用的文件系統(tǒng)、TCP/IP網(wǎng)絡(luò)協(xié)議棧等。 在PDA領(lǐng)域,還需要加上個(gè)GUl支持。,6.1.3 嵌入式Linux的版本,將Linux移植以滿足實(shí)時(shí)要求的實(shí)時(shí)操作系統(tǒng),應(yīng)用于一些關(guān)鍵的控制場合,如Fsmlabs公司的RT Linux,Monta Vista的Hard Hat Linux。 盡可能保留Linux的強(qiáng)大功能,盡可能地減少其體積,以滿足許多嵌入式系統(tǒng)對體積的要求,如uClinux。 針對特定嵌入式領(lǐng)域采用整合方案,如Lineo,TimeSys,合肥華恒等。接下來,簡要介紹常用的兩個(gè)嵌入式Linux操作系統(tǒng)。,6.1.3 嵌入式Linux的版本,實(shí)時(shí)Linux(RT Linux) RT Linux是美國新墨西哥州大學(xué)計(jì)算機(jī)系研制開發(fā)的。 RT Linux實(shí)現(xiàn)的內(nèi)核位于通常的Linux內(nèi)核之下,這個(gè)內(nèi)核是一個(gè)實(shí)時(shí)內(nèi)核,它只需要完成底層的任務(wù)創(chuàng)建、中斷服務(wù)程序,并為底層任務(wù)、ISR和Linux進(jìn)程之間進(jìn)行通信排隊(duì)。 RT Linux的調(diào)度方法和用戶實(shí)時(shí)任務(wù)的工作是通過Linux的可導(dǎo)入模塊的方式進(jìn)行的。 2. uClinux uClinux是一個(gè)GNU的項(xiàng)目,代碼完全開放。 uClinux的英文解釋是Micro Control Linux,可理解為“微控制領(lǐng)域中的Linux系統(tǒng)”。 它專門應(yīng)用于沒有MMU的CPU,并專為嵌入式系統(tǒng)做了許多小型化的工作,已支持的微處理器包括Motorola MC68000,MCF5206和MCF5207ColdFire等。,6.2 uCLinux開發(fā)介紹,目前,uClinux往往基于兩個(gè)Linux內(nèi)核版本,2.0.38 是一個(gè)比較成熟的版本,2.4.x是最新的版本 Hitool 套件同時(shí)提供了對他們的支持。 一般uClinux的內(nèi)核大小在500k左右,如果加上一些基本的應(yīng)用,也就在900k左右.非常適合于嵌入式系統(tǒng)。 uClinux架構(gòu)如圖6-1所示(下頁) ,一些重要的模塊在下面描述。,6.2.1 啟動過程(Bootstrap),啟動模塊Bootstrap負(fù)責(zé)用來起動Linux內(nèi)核,包括Chip Selector初始化,系統(tǒng)堆棧的初始化,把壓縮的Linux映像從Flash中解壓到RAM中,并把控制權(quán)交給內(nèi)核的初始化例程。 這部分工作是與你的硬件高度相關(guān)的,所以這部分的代碼要盡量精簡。,6.2.2 內(nèi)核初始化(Kernel Initialization),內(nèi)核初始化的入口地址是: start_kernel(在init/main.c中)。 它初始化內(nèi)核的其它部分,包括異常(trap)、中斷(IRQ)、內(nèi)存頁(Page)、調(diào)度(Scheduling)、驅(qū)動程序等等。并啟動“init”進(jìn)程進(jìn)入多任務(wù)環(huán)境。,6.2.3 系統(tǒng)調(diào)用處理/異常處理,當(dāng)“init”程序運(yùn)行后,內(nèi)核對整個(gè)系統(tǒng)的運(yùn)行不再進(jìn)行直接控制,而是通過系統(tǒng)調(diào)用給應(yīng)用程序提供服務(wù)和響應(yīng)外部及內(nèi)部的異步事件,例如:程序錯(cuò)誤,硬件中斷等。 在ARM中,系統(tǒng)調(diào)用采用swi指令所產(chǎn)生的軟件異常來實(shí)現(xiàn), 如例所示: swi 0x900004(其中0x900004表示這個(gè)系統(tǒng)調(diào)用為sys_write)。 00002550 : 2550: ef900004 swi 0x00900004 2554: e3700a01 cmn r0, #4096 ; 0x1000 2558: 2afff6b0 bcs 20 _syscall_error 255c: e1a0f00e mov pc, lr,6.2.4 驅(qū)動程序(Device Driver),驅(qū)動程序是整個(gè)Linux內(nèi)核的主要組成部分,它們控制著操作系統(tǒng)和外部設(shè)備的交互。 Linux的驅(qū)動程序是可選的,但是典型的系統(tǒng)應(yīng)該包括一個(gè)控制臺(Console),一個(gè)通用串口驅(qū)動程序,一個(gè)塊設(shè)備 (用來存放根文件系統(tǒng)) 驅(qū)動程序。 當(dāng)Linux內(nèi)核起動的時(shí)候,需要一個(gè)輸出調(diào)試信息的設(shè)備。這個(gè)設(shè)備往往通過串口來實(shí)現(xiàn)。 這個(gè)調(diào)試終端可以通過register-console 這個(gè)函數(shù)來創(chuàng)建。而所有的調(diào)試信息都通過Printk例程通過這個(gè)調(diào)試終端來輸出。,6.2.5 文件系統(tǒng)(File System),支持多種文件系統(tǒng)是Linux一個(gè)重要的特性,uClinux同樣把這一特性帶進(jìn)了嵌入式系統(tǒng)中,并針對嵌入式系統(tǒng)作了一些取舍。 在Hitool for uClinux包括了romfs, Ext2 FS, RAM FS, NFS 。 其中,romfs 是最簡單的只讀文件系統(tǒng),所占用的空間最少,我們用它來做根文件系統(tǒng)(root file system)。 根文件系統(tǒng)里存放Linux啟動時(shí)要用到的設(shè)備文件,配置文件和應(yīng)用程序。 例如:/dev/tty0, /etc/rc , /bin/init ,/bin/sh, 等等。,6.2.6 內(nèi)存管理,uClinux不能使用處理器的虛擬內(nèi)存管理技術(shù)但仍然采用存儲器的分頁管理,系統(tǒng)在啟動時(shí)把實(shí)際存儲器進(jìn)行分頁。在加載應(yīng)用程序時(shí)程序分頁加載。但是由于沒有MMU管理,所以實(shí)際上uClinux采用實(shí)存儲器管理策略(物理內(nèi)存)。 uClinux系統(tǒng)對于內(nèi)存的訪問是直接的,(它對地址的訪問不需要經(jīng)過MMU,而是直接送到地址線上輸出),所有程序中訪問的地址都是實(shí)際的物理地址。 由于應(yīng)用程序加載時(shí)必須分配連續(xù)的地址空間,所以開發(fā)人員在開發(fā)應(yīng)用程序時(shí)必須考慮內(nèi)存的分配情況并關(guān)注應(yīng)用程序需要運(yùn)行空間的大小。 從內(nèi)存的訪問角度來看,開發(fā)人員的權(quán)利增大了(開發(fā)人員在編程時(shí)可以訪問任意的地址空間),但與此同時(shí)系統(tǒng)的安全性也大為下降。,6.2.7 進(jìn)程管理,uClinux 和Linux之間最大的區(qū)別在于平面存儲器模型。沒有虛擬存儲器可以提供非常有效的fork 系統(tǒng)調(diào)用。 由于在使用fork時(shí),內(nèi)核會將父進(jìn)程拷貝一份給子進(jìn)程,但是這樣的做法相當(dāng)浪費(fèi)時(shí)間,因?yàn)榇蠖鄶?shù)的情形都是程序在調(diào)用fork后就立即調(diào)用exec,這樣剛拷貝來的進(jìn)程區(qū)域又立即被新的數(shù)據(jù)覆蓋掉。 因此Linux系統(tǒng)提供一個(gè)系統(tǒng)調(diào)用vfork,vfork假定系統(tǒng)在調(diào)用完成vfork后會馬上執(zhí)行exec,因此vfork不拷貝父進(jìn)程的頁面,只是初始化私有的數(shù)據(jù)結(jié)構(gòu)與準(zhǔn)備足夠的分頁表。 這樣實(shí)際在vfork調(diào)用完成后父子進(jìn)程事實(shí)上共享同一塊存儲器(在子進(jìn)程調(diào)用exec或是exit之前),因此子進(jìn)程可以更改父進(jìn)程的數(shù)據(jù)及堆棧信息, 因此vfork系統(tǒng)調(diào)用完成后,父進(jìn)程進(jìn)入睡眠,直到子進(jìn)程執(zhí)行exec。 并且在這段時(shí)間內(nèi),子進(jìn)程不能更改數(shù)據(jù)段和堆棧的內(nèi)容。,6.2.7 進(jìn)程管理,當(dāng)子進(jìn)程執(zhí)行exec時(shí),由于exec要使用被執(zhí)行程序的數(shù)據(jù),代碼覆蓋子進(jìn)程的存儲區(qū)域, 這樣將產(chǎn)生寫保護(hù)錯(cuò)誤(do_wp_page)(這個(gè)時(shí)候子進(jìn)程寫的實(shí)際上是父進(jìn)程的存儲區(qū)域)。這個(gè)錯(cuò)誤導(dǎo)致內(nèi)核為子進(jìn)程重新分配存儲空間。 當(dāng)子進(jìn)程正確開始執(zhí)行后,將喚醒父進(jìn)程,使得父進(jìn)程繼續(xù)往后執(zhí)行。 所以,在uClinux中,想讓父子進(jìn)程同時(shí)運(yùn)行同一個(gè)程序是不可以的。,6.2.8 運(yùn)行時(shí)間庫及應(yīng)用程序,運(yùn)行時(shí)間庫提供了用戶程序和內(nèi)核程序的接口。 1. 程序的入口代碼 用戶自己寫程序一般從main開始,其實(shí)程序在運(yùn)行時(shí)真正的進(jìn)入點(diǎn)是C運(yùn)行庫的一部分。這部分代碼執(zhí)行初始靜態(tài)數(shù)據(jù),例如錯(cuò)誤號(errno)以及環(huán)境指示符(environ),并且將參數(shù)argc 和argv傳輸?shù)絤ain。 參數(shù)和環(huán)境一般根據(jù)宏程序start_thread(定義在include/proc/processer.h) 的調(diào)用約定,放在寄存器或者堆棧上。execve 系統(tǒng)調(diào)用利用start_thread 建立一個(gè)虛擬環(huán)境,程序的入口代碼因此必須實(shí)現(xiàn)把start_thread 所建立的環(huán)境恢復(fù)出來,并調(diào)用_uClibc_main。在_uClibc_main中再調(diào)用用戶程序的main 。,.text .global _start .global _uClibc_main .type _start,%function .type _uClibc_main,%function .text _start: /* 清幀緩沖區(qū)指針 */ mov fp, #0 /* argc, argv 和 envp 出棧 */ ldr r0,sp, #0 ldr r1,sp, #4 ldr r2,sp, #8 /* 運(yùn)行 uClibc的 main() 函數(shù)不應(yīng)返回 */ bl_uClibc_main,6.2.8 運(yùn)行時(shí)間庫及應(yīng)用程序,2. 堆(heap)分配 用戶程序通過調(diào)用malloc從堆中分配內(nèi)存。在有虛擬存儲器的系統(tǒng)中,堆可以使用sbrk調(diào)用來擴(kuò)大。 因?yàn)樘摂M存儲器支持分段存儲,所以可以在堆的最高端到堆棧的最底部之間留有很大的虛擬空間來做擴(kuò)展之用。 但在平面存儲器系統(tǒng)中,沒有這個(gè)空間。所以,堆空間改用mmap調(diào)用來分配。在uClibc中,內(nèi)存分配的算法非常簡單直接,存儲器的管理完全依靠內(nèi)核的頁機(jī)制來完成。見圖6-2。,6.2.8 運(yùn)行時(shí)間庫及應(yīng)用程序,從圖6-2中,可以看出另一項(xiàng)區(qū)別,因?yàn)槲锢砩隙褩Ec靜態(tài)數(shù)據(jù)相連,所以,堆棧必須有足夠的空間,以防止覆蓋靜態(tài)數(shù)據(jù)和代碼。 在標(biāo)準(zhǔn)Linux程序中的虛擬內(nèi)存允許堆和堆棧之間留有足夠大的空間來讓他們擴(kuò)展。 系統(tǒng)可以監(jiān)控頁的使用情況,防止堆棧溢出。 但在uClinux中要預(yù)留這樣大的物理空間是不可能的。 另外,因?yàn)樵趗Clinux中沒有內(nèi)存保護(hù)機(jī)制來防止堆棧溢出,在程序鏈接時(shí)要特別小心設(shè)定堆棧的大小。,6.2.8 運(yùn)行時(shí)間庫及應(yīng)用程序,4. 執(zhí)行文件格式(Flat binary format) uClinux系統(tǒng)使用flat可執(zhí)行文件格式,可以使用elf2flt工具把ELF格式的可執(zhí)行文件轉(zhuǎn)化為flat文件。 當(dāng)用戶執(zhí)行一個(gè)應(yīng)用時(shí),內(nèi)核的執(zhí)行文件加載器(fs/binfmt_flat.c)將對flat文件進(jìn)行進(jìn)一步處理,主要是對代碼段和數(shù)據(jù)段進(jìn)行修正。 為什么要修正呢?因?yàn)閼?yīng)用程序在連接時(shí)并不知道它要在系統(tǒng)的那一段地址上面運(yùn)行,這樣就要求程序在任何地址上都要能運(yùn)行,也就是說與地址無關(guān)(PICposition independent code)。 這個(gè)特性由針對uClinux的編譯器和連接器來提供。在ARM中有一條相對跳轉(zhuǎn)指令: ebxxxxxx bl xxxxx; 可以用來實(shí)現(xiàn)地址無關(guān)的跳轉(zhuǎn)。,6.3 uCLinux啟動過程,uClinux系統(tǒng)的啟動可以分為兩個(gè)步驟: 1. 運(yùn)行bootloader初始化程序 SRAM 、SDRAM等存儲設(shè)備屬于揮發(fā)性的存儲器,掉電以后其中的內(nèi)容就會全部丟失,所以必須把操作系統(tǒng)的內(nèi)核鏡像存放在Flash等不揮發(fā)性存儲介質(zhì)上。 從本質(zhì)上來講,bootloader不屬于操作系統(tǒng)內(nèi)核。它采用匯編語言編寫,因此針對不同的CPU體系結(jié)構(gòu),這一部分代碼不具有可移植性。 在移植操作系統(tǒng)時(shí),這部分代碼必須加以改寫。,6.3 uCLinux啟動過程,具體來講,bootloader在系統(tǒng)啟動時(shí)主要完 成以下 幾項(xiàng)工作: 將操作系統(tǒng)內(nèi)核從Flash拷貝到SDRAM中,如果是壓縮格式的內(nèi)核,還要將之解壓縮。 改寫系統(tǒng)的memory map,原先flash起始地址映射為0地址,這時(shí)需要將RAM的起始地址映射為0。 設(shè)置堆棧指針并將bss段清零。將來執(zhí)行C語言程序和調(diào)用子函數(shù)時(shí)要用到。 改變pc值,使得CPU開始執(zhí)行真正的操作系統(tǒng)內(nèi)核。,6.3 uCLinux啟動過程,2. 運(yùn)行操作系統(tǒng)內(nèi)核 bootloader程序執(zhí)行完上述的各項(xiàng)工作后,通過一條跳轉(zhuǎn)指令,轉(zhuǎn)而執(zhí)行init目錄下C語言源文件main.c中的函數(shù)start_kernel( )。 因?yàn)樵诖酥癰ootloader已經(jīng)創(chuàng)建好一個(gè)初始化環(huán)境,C函數(shù)可以開始執(zhí)行了。 整個(gè)操作系統(tǒng)內(nèi)核的初始化工作從這里才算是真正開始。這個(gè)函數(shù)的長度比較短,代碼如下:,void _init start_kernel(void) char * command_line; unsigned long mempages; extern char saved_command_line; /* * Interrupts are still disabled. Do necessary setups, then * enable them */ lock_kernel(); printk(linux_banner); setup_arch(,/* * HACK ALERT! This is early. Were enabling the console before * weve done PCI setups etc, and console_init() must be aware of * this. But we do want output early, in case something goes wrong. */ console_init(); #ifdef CONFIG_MODULES init_modules(); #endif if (prof_shift) unsigned int size; /* only text is profiled */ prof_len = (unsigned long) ,kmem_cache_init(); sti(); calibrate_delay(); #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start ,vfs_caches_init(mempages); buffer_init(mempages); page_cache_init(mempages); #if defined(CONFIG_ARCH_S390) ccwcache_init(); #endif signals_init(); #ifdef CONFIG_PROC_FS proc_root_init(); #endif #if defined(CONFIG_SYSVIPC) ipc_init(); #endif check_bugs(); printk(“POSIX conformance testing by UNIFIXn“);,/* * We count on the initial thread going ok Like idlers init is an unlocked kernel thread,which will * make syscalls (and thus be locked). */ smp_init(); rest_init(); ,內(nèi)核啟動之后需要執(zhí)行的第一個(gè)函start_kernel()(在linux/init/main.c文件中)。start_kernel() 完成下面一系列初始化的工作。 printk(1inux_banner),顯示Linux內(nèi)核的版本信息。 setup_arch(&command_line),做與體系結(jié)構(gòu)相關(guān)的初始化工作。 parse_options(command_line),解釋系統(tǒng)參數(shù)。 trap_init(),設(shè)置系統(tǒng)異常的入口點(diǎn)。 init_IRQ(),初始化系統(tǒng)中斷服務(wù)。 sched_init(),系統(tǒng)調(diào)度器的初始化。 time_init(),時(shí)鐘、定時(shí)器初始化。 softirq_init(),系統(tǒng)軟中斷的初始化。 console_init(),控制臺初始化。 kmem_cache_init(),內(nèi)核cache的初始化。,calibrate_delay(),校準(zhǔn)時(shí)鐘。 mem_init(),內(nèi)存初始化。 kmem_cache_sizes_init(),創(chuàng)建及設(shè)置通用cache。 fork_init(mempages),建立uidcache,并且根據(jù)系統(tǒng)內(nèi)存大小來確定最大進(jìn)程數(shù)目。 buffer_init(mempages),塊設(shè)備緩沖區(qū)的初始化。初始化一系列的cache。 check_bugs(),檢查體系結(jié)構(gòu)漏洞。 kernel_thread(init NULL,CLONE_FS | CLONE_FILES | CLONE_SIGNAL),創(chuàng)建第一個(gè)核心進(jìn)程,啟動init進(jìn)程。 cpu_idle(),運(yùn)行idle進(jìn)程。,接下去做的工作由init()函數(shù)來完成。 init()首先要鎖定內(nèi)核,然后調(diào)用do_basic_setup( )來完成外部設(shè)備以及驅(qū)動程序的初始化。外設(shè)的初始化要根據(jù)內(nèi)核的配置來決定,一般需要做下面的初始化工作: PCI總線初始化。 網(wǎng)絡(luò)初始化。 一系列其他設(shè)備的初始化。 start_context_thread()創(chuàng)建事件管理核心進(jìn)程keventd。 通過do_initcalls()函數(shù)來啟動任何使用_initcall標(biāo)識的函數(shù)。 文件系統(tǒng)初始化。 加載文件系統(tǒng)。,6.4 開發(fā)工具介紹,針對沒有MMU的CPU架構(gòu),uClinux采用了一種平板式(Flat)的內(nèi)存模型來去除對MMU的依賴, 并且改變了用戶程序的加載方式,開發(fā)了運(yùn)用于uClinux的C函數(shù)庫-uCLibc. 由于這些變化,一般的Linux開發(fā)工具(例如GDB)在開發(fā)uClinux時(shí)會碰到一些困難,包括內(nèi)核的移植,驅(qū)動程序及應(yīng)用程序的調(diào)試。 針對這樣狀況,Hitool System公司開發(fā)了Hitool for uClinux開發(fā)套件,來幫助用戶開發(fā)基于uClinux的系統(tǒng)。,6.4 開發(fā)工具介紹,Hitool for uClinux與其它的Linux開發(fā)工具相比,有幾個(gè)優(yōu)點(diǎn): 整個(gè)開發(fā)過程只在Windows環(huán)境下完 成,包括內(nèi)核的配置、編譯,應(yīng)用程 序的編譯,文件系統(tǒng)的生成,內(nèi)核的 調(diào)試,用戶程序的調(diào)試。 可以采用多種調(diào)試方式,既可以采用JTAG方式來調(diào)試,也可通過網(wǎng)口用Hitool自己的監(jiān)控程序(MDB)來調(diào)試。 通過JTAG方式調(diào)試,可以調(diào)試內(nèi)核和驅(qū)動程序, 也同時(shí)可以調(diào)試應(yīng)用程序。 一般的開發(fā)工具做不到這一點(diǎn)。 對于那些只要調(diào)試應(yīng)用程序的客戶, 就可以采用MDB的方式。采用這種方式,你不但不需要仿真器,而且在調(diào)試一個(gè)應(yīng)用時(shí),不會影響別的應(yīng)用的運(yùn)行。 提供了一個(gè)內(nèi)核的追蹤工具(Trace)來幫助用戶分析整個(gè)系統(tǒng)。,6.4.1 安裝,安裝 Hitool for ARM supporting uClinux 的過程主要有三個(gè)步驟 : 1. 安裝 Cygwin : 你需要安裝的 cygwin 套件如下 : BASE : 全部 Devel : 全部 Interpreters: expect, gawk, m4, perl Libs: tcltk Shells: bash Text: less Utils: bzip2,6.4.1 安裝,2. 安裝 Hitool Debugger : (1) Hitool 安裝時(shí)會檢查Cygwin 是否己安裝, 若不使用 Win32 環(huán)境 Build linux image 則可略過 Cygwin 安裝。 (2) 因?yàn)?Hitool 可支持眾多 Target , 因此建議 在安裝時(shí)選擇不同的 uclinux 安裝目錄, 例如將 Atmel Target 開發(fā)環(huán)境安裝于 uclinux.atmel 而把 Samsung Target的uclinux kernel 安裝于 uclinux.Samsung 。 (3) Hitool 會安裝于指定安裝目錄之下的 Hitool 目錄。(如 uclinux.Samsunghitool),6.4.1 安裝,3. 安裝 armtools 及 uClinux 套件 : Hitool 安裝完成后,會將 uClinux 套件復(fù)制到 uclinux 安裝目錄下。 (1) 執(zhí)行Armtools 解壓縮與安裝 : $ sh unpack_armtools.sh (2)執(zhí)行uClinux 套件解壓縮與安裝 : $ sh unpack_uClinux.sh,6.4.2 開發(fā)環(huán)境的建立,建立uClinux的內(nèi)核開發(fā)環(huán)境,你需要一個(gè)JTAG 仿真器(PowerProbe 或JEDI),與開發(fā)板和宿主機(jī)相連。 再使宿主機(jī)的串口與開發(fā)板的串口相連,并在宿主機(jī)上啟動HyperTerm程序,設(shè)置波特率為9600。 如圖6-3所示:,6.4.2 開發(fā)環(huán)境的建立,其中HyperTerm用來作為uClinux的標(biāo)準(zhǔn)輸入輸出。網(wǎng)口可以作為MDB的調(diào)試界面,也可以通過它來使用網(wǎng)絡(luò)文件系統(tǒng)(NFS)。 當(dāng)所有連接都正確后,啟動Configuration of Hitool(只有在第一次使用時(shí)才需要)。 根據(jù)JTAG仿真器類型,選擇正確的JTAG 協(xié)議。具體配置可參照Hitool for ARM用戶手冊或者在線幫助。,6.4.3 調(diào)試方法,調(diào)試主要有三種方法:JTAG調(diào)試方法;MDB調(diào)試方法;FTP調(diào)試方法 1 JTAG調(diào)試方法 首先在uClinux的控制臺(PC上的HyperTerm )上執(zhí)行這個(gè)程序。 當(dāng)這個(gè)用戶程序被內(nèi)核加載時(shí),會有一個(gè)對話框跳出問你是否想要調(diào)試此程序。選擇No按鈕表示繼續(xù)此程序,不進(jìn)行調(diào)試。 如果你不希望下次運(yùn)行此程序時(shí)對話框再次跳出,只需選擇“Dont show this message again when this program launches”選項(xiàng)。 如果點(diǎn)擊Yes按鈕, 一個(gè)Add Symbol Table對話框?qū)⑻觯埬氵x擇下載合適的符號文件(*.elf)。,6.4.3 調(diào)試方法,在對話框最下面的三個(gè)編輯框顯示的是這個(gè)程序被加載后在RAM中各個(gè)段的位置,請不要改動它們,如圖6-4所示。,圖64 uClinux應(yīng)用程序調(diào)試對話框,6.4.3 調(diào)試方法,在符號文件下載以后,這個(gè)程序?qū)⒈粓?zhí)行到main函數(shù)后停止。 這是你可以像普通嵌入式程序一樣調(diào)試它。 而且你仍然可以在內(nèi)核上設(shè)置斷點(diǎn),當(dāng)程序用到系統(tǒng)調(diào)用或設(shè)備驅(qū)動程序時(shí),你可以設(shè)斷點(diǎn)直接執(zhí)行到斷點(diǎn)。,6.4.3 調(diào)試方法,2. FTP調(diào)試方法 關(guān)于JFFS/JFFS2文件系統(tǒng)的建立,請讀者參考相關(guān)技術(shù)資料。在此僅描述如何將用戶程序通過局域網(wǎng),從FTP服務(wù)器(運(yùn)行Linux宿主機(jī))上,傳輸?shù)竭\(yùn)行uClinux的目標(biāo)系統(tǒng)(FTP客戶機(jī))并執(zhí)行的過程: (1)將目標(biāo)系統(tǒng)與Linux宿主機(jī)連接在同一網(wǎng)段中,在宿主機(jī)的任意目錄下編寫應(yīng)用程序,并用交叉編譯工具生成flat格式的文件。 (2)啟動目標(biāo)系統(tǒng)的uClinux,通過超級終端,輸入下面的命令: ifconfig eth0 0 ifconfig命令用于配置目標(biāo)系統(tǒng)的IP地址其中,eth0代表目標(biāo)系統(tǒng)的網(wǎng)絡(luò)設(shè)備,IP地址0為目標(biāo)系統(tǒng)的IP地址,此時(shí)宿主機(jī)的IP地址為:192.1681.100.21。 執(zhí)行命令: ifconfig all 可以看到目標(biāo)系統(tǒng)的IP地址已被正確配置,6.4.3 調(diào)試方法,(3)測試一下與宿主機(jī)的連接,鍵入命令: ping 1 應(yīng)能得到宿主機(jī)的應(yīng)答信息。 (4)當(dāng)目標(biāo)系統(tǒng)與宿主機(jī)已正確建立連接后,進(jìn)入目標(biāo)系統(tǒng)的可寫目錄/var或/tmp,并登錄到宿主機(jī): cd var ftp 1 (5)輸入宿主機(jī)上的合法用戶名及密碼,便與宿主機(jī)建立了FTP連接。為傳輸二進(jìn)制文件,鍵入命令: ftpbinary 200 Type set to I,6.4.3 調(diào)試方法,注意:在用FTP進(jìn)行文件傳輸?shù)臅r(shí)候,一定要選好文件傳輸?shù)哪J剑現(xiàn)TP默認(rèn)模式為二進(jìn)制模式,但是為了保險(xiǎn)起見,還是手動把傳輸模式顯式改寫為二進(jìn)制模式。通常的txt、html和絕大多數(shù)PS文件都是文本格式的,而其他的可執(zhí)行文件、壓縮文件都是二進(jìn)制格式。兩種格式之間要用ascii和binary命令切換,兩者都可以適當(dāng)縮寫。,6.4.3 調(diào)試方法,(6)傳輸已編譯好的可執(zhí)行文件(如lednxy)到目標(biāo)系統(tǒng)并退出FTP服務(wù),鍵入命令: ftpget lednxy ftpquit (7)此時(shí),可執(zhí)行文件lednxy已傳輸至目錄/var或/tmp下,但文件的可執(zhí)行屬性未被設(shè)置,添加文件的可執(zhí)行屬性,鍵入命令: chmod 755 lednxy chmod是一個(gè)文件權(quán)限修改的命令,在文件創(chuàng)建的時(shí)候會自動設(shè)置存取權(quán)限,若是這些默認(rèn)權(quán)限無法適合企業(yè)環(huán)境的需求,就可以利用chmod命令來修改存取權(quán)限。 通常在權(quán)限修改的時(shí)候可以用兩種方式表示權(quán)限類,數(shù)字表示法和文字表示法。,6.4.3 調(diào)試方法,這里我們采用的是數(shù)字表示法。就是說將讀取(r)、寫入(w)和執(zhí)行(x)分別以4、2、1來代表,沒有授予權(quán)限的部分就表示值為0,然后再把所授予的權(quán)限相加而成。表6-1為讀者列出了幾個(gè)例子。,表6-1 存取權(quán)限范例,6.4.3 調(diào)試方法,表中每三位字符為一組,這樣權(quán)限可以被分為三組: 第一組表示此文件擁有者的存取權(quán)限 第二組表示該文件擁有者所屬組成員的存取權(quán)限 最后一組表示該文件擁有者所屬組之外的用戶存取權(quán)限。 (8)執(zhí)行程序lednxy,鍵入命令: ./lednxy,6.4.3 調(diào)試方法,3. MDB調(diào)試方法 MDB是一個(gè)Linux的任務(wù)調(diào)試監(jiān)控程序,它本身也是一個(gè)Linux的應(yīng)用程序,這個(gè)程序可以作為其他需要調(diào)試的程序的父進(jìn)程,來控制它們的運(yùn)行。 (1)單應(yīng)用程序MDB調(diào)試方法如下: 要使用MDB協(xié)議,先要在Startup Configuration里進(jìn)行設(shè)定如下: 選擇protocol 為MDB 選擇Port 為Ethernet,如果你板子上的網(wǎng)口不可以用來做調(diào)試,請選擇COM1或COM2,并寫上相應(yīng)的IP地址或波特率(9600-57600之間)。 在TgtSvr框中,填入運(yùn)行TargetServer的PC的IP地址,缺省為本地。,圖6-5 MDB 配置對話框,6.4.3 調(diào)試方法, 然后讓uClinux在開發(fā)板上運(yùn)行起來,以root 身份進(jìn)入,密碼uClinux 。在控制臺上打入MDB :9999 (用網(wǎng)絡(luò)連接,9999是port)或MDB /dev/ttySx (用串口連接,x為1或2)如果控制臺與調(diào)試使用同一個(gè)串口,請把控制臺中斷。 運(yùn)行TargetServer。 啟動Hitool, 選擇Project|Init Debugger 命令。 現(xiàn)在,可以下載需要調(diào)試的文件了。,6-6 uClinux控制臺,6.4.3 調(diào)試方法,(2) 如果要同時(shí)調(diào)試多個(gè)程序,請打開多個(gè)Hitool, 一個(gè)Hitool只能調(diào)試一個(gè)程序。你可以用下列命令來開始一個(gè)調(diào)試過程。 Load image 下載一個(gè)uClinux可執(zhí)行文件(flat binary file,*.exe)到目標(biāo)板。 fork 運(yùn)行一個(gè)程序,并把相應(yīng)的符號文件(*.exe.elf)加到符號表中,使程序停在main函數(shù)上。 load image then fork 順序執(zhí)行l(wèi)oad 和 fork。 kill 中止當(dāng)前被調(diào)試的進(jìn)程。 attach 截獲一個(gè)已經(jīng)在運(yùn)行的任務(wù), 并進(jìn)行調(diào)試。,6.4 開發(fā)工具介紹 6.5.1 配置內(nèi)核,啟動Hitool for uClinux 后,會有一個(gè)叫做“Linux Kernel”的工具欄出現(xiàn)在屏幕上(如圖6-7所示)。,圖6-7 Linux 工具條,6.5.1 配置內(nèi)核,請按“Setting”按鈕設(shè)置Linux相關(guān)的源文件路徑,內(nèi)核版本,以及運(yùn)行時(shí)間庫的版本。例如,如果你的Linux源結(jié)構(gòu)為: C:uclinuxuClinux-distuser C:uclinuxuClinux-distlinux-2.4.x C:uclinuxuClinux-distlib 如圖6-8所示 則設(shè)置源文件路徑為: C:uclinuxuClinux-dist 設(shè)置Kernel version為: linux-2.4.x 設(shè)置Library為: uClibc(use uC-libc for Samsung4510/44B0),圖6-8 uClinux環(huán)境設(shè)置,6.5.1 配置內(nèi)核,當(dāng)這些參數(shù)設(shè)定以后,按Config Kernel按鈕,就進(jìn)入了系統(tǒng)配置主窗口(如圖6-9所示)。 如果選擇yfor“Customize Kerenel Settings” or “Customize Vendor/User Settings”, 會依次出現(xiàn)圖6-11和圖6-12窗口。,圖6-9 uClinux配置主窗口,圖6-10 目標(biāo)配置主窗口,圖6-11 內(nèi)核配置窗口,圖6-12 開發(fā)板配置窗口,6.5.1 配置內(nèi)核,你可以根據(jù)開發(fā)板的參數(shù)填入相應(yīng)的值。 所有的預(yù)設(shè)值都是為所帶的評估板而設(shè)定的。 其他配置窗口不再一一贅述。 當(dāng)配置完成之后,會自動作依賴關(guān)系設(shè)定。這會需要一段時(shí)間。在整個(gè)過程中,如果你希望終止至,可以按”stop”按鈕。,6.5.2 編譯內(nèi)核,第一步是編譯user目錄下的一些應(yīng)用程序,例如 init.exe ,agetty.exe ,sh.exe,mount.exe 等等 第二步是把第一步編好的程序考到romfs目錄下,并調(diào)用genromfs 命令來生成根文件系統(tǒng)的映像romfs.img。 第三步才是編譯內(nèi)核, 并把romfs.img 連接進(jìn)去, 產(chǎn)生linux.elf。 第四步是把linux.elf 去掉條是信息,轉(zhuǎn)成linux.bin, 并把它與boot 目錄下的啟動代碼連接在一起, 生成最終的 Flash映像linux_bootrom.bin。,6.6 內(nèi)核的調(diào)試 6.6.1 下載 uClinx內(nèi)核,要進(jìn)行調(diào)試, 先執(zhí)行菜單命令Project | Init Debugger, 使 Hitool與仿真器連接。如果你將要調(diào)試的uClinux 內(nèi)核(linux.elf)已準(zhǔn)備好,點(diǎn)擊Load按鈕將內(nèi)核下載到開發(fā)板的RAM上。 這樣,你可以調(diào)試Linux 內(nèi)核就像調(diào)試一個(gè)普通的嵌入式程序。Hitool會幫你處理掉很多和Linux 相關(guān)的細(xì)節(jié)。 在Hitool for uClinux中,我們包括了一個(gè)預(yù)先編譯好的Linux 內(nèi)核,該內(nèi)核存儲于uClinux-dist/linux-2.0.x(for EV40 board) 或者 uClinux-dist/linux-2.4.x/( for 4510B board)中。,6.6.2 幾個(gè)調(diào)試窗口,1uClinux源代碼結(jié)構(gòu)窗口和調(diào)試符號窗口 在調(diào)試過程中,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地毯廠安全生產(chǎn)管理制度
- 天然氣公司全套管理制度
- 施工甲方現(xiàn)場管理制度
- 客運(yùn)公司標(biāo)準(zhǔn)化管理制度
- 專業(yè)醫(yī)院手術(shù)室管理制度
- 房產(chǎn)公司預(yù)決算管理制度
- 日間手術(shù)相關(guān)管理制度
- iqc檢驗(yàn)人員管理制度
- 星級酒店薪酬管理制度
- 幼兒園安全設(shè)備管理制度
- 河北省唐山市路南區(qū)2023年數(shù)學(xué)五年級第二學(xué)期期末經(jīng)典試題含解析
- 2023年廣東初中學(xué)業(yè)水平考試生物試卷真題(含答案)
- 奶茶店消防應(yīng)急預(yù)案
- 工程制圖及機(jī)械CAD基礎(chǔ)知到章節(jié)答案智慧樹2023年吉林大學(xué)
- 初級會計(jì)職稱考試教材《初級會計(jì)實(shí)務(wù)》
- 第二十二課-重屬和弦前方的共同和弦
- 碳酸飲料生產(chǎn)工藝流程圖
- 帶電跨越10kV線路施工方案
- 土壤肥料學(xué)野外教學(xué)實(shí)習(xí)分析
- GB/T 8012-2000鑄造錫鉛焊料
- GB/T 5169.5-2020電工電子產(chǎn)品著火危險(xiǎn)試驗(yàn)第5部分:試驗(yàn)火焰針焰試驗(yàn)方法裝置、確認(rèn)試驗(yàn)方法和導(dǎo)則
評論
0/150
提交評論