嵌入式Linux開(kāi)發(fā)課件_第1頁(yè)
嵌入式Linux開(kāi)發(fā)課件_第2頁(yè)
嵌入式Linux開(kāi)發(fā)課件_第3頁(yè)
嵌入式Linux開(kāi)發(fā)課件_第4頁(yè)
嵌入式Linux開(kāi)發(fā)課件_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章 嵌入式Linux開(kāi)發(fā) 主講:李巖 現(xiàn)在 Linux 廣泛用于各類(lèi)計(jì)算應(yīng)用,不僅包括 IBM 的微型 Linux 腕表、手持設(shè)備(PDA 和蜂窩電話(huà))、因特網(wǎng)裝置、瘦客戶(hù)機(jī)、防火墻、工業(yè)機(jī)器人和電話(huà)基礎(chǔ)設(shè)施設(shè)備,甚至還包括了基于集群的超級(jí)計(jì)算機(jī)。本章主要介紹了:怎樣應(yīng)用Linux來(lái)進(jìn)行嵌入式系統(tǒng)的開(kāi)發(fā)。選用Linux操作系統(tǒng)的優(yōu)勢(shì)。Linux的簡(jiǎn)化版本uClinux相關(guān)知識(shí)。如內(nèi)存管理、進(jìn)程管理、啟動(dòng)過(guò)程等。開(kāi)發(fā)工具Hittool的具體應(yīng)用。6.1 嵌入式Linux概況Linux操作系統(tǒng)開(kāi)放源代碼,可以裁剪內(nèi)核,并已在x86、Alpha、Sparc、MIPS、PPC、Motorola、N

2、EC和ARM等硬件平臺(tái)上穩(wěn)定、高效地運(yùn)行。Linux操作系統(tǒng)作為一種多任務(wù)、穩(wěn)定可靠、內(nèi)核可裁剪的系統(tǒng),是開(kāi)發(fā)嵌入式軟硬件產(chǎn)品的優(yōu)秀軟件平臺(tái)。嵌入式Linux是一種開(kāi)放源碼、軟實(shí)時(shí)、多任務(wù)的嵌入式操作系統(tǒng)。6.1.1 嵌入式Linux在嵌入式開(kāi)發(fā)中,隨著微處理器的產(chǎn)生,價(jià)格低廉、結(jié)構(gòu)小巧的CPU和外設(shè)接口提供了穩(wěn)定可靠的硬件架構(gòu)。高端嵌入式系統(tǒng)要求許多高級(jí)的功能,如圖形用戶(hù)界面和網(wǎng)絡(luò)支持。許多高端RTOS供應(yīng)商已經(jīng)提供了這些功能,但其價(jià)格也很高,一般人難以接受。Linux為嵌入式操作系統(tǒng)提供了一個(gè)極有吸引力的選擇,它是一個(gè)類(lèi)UNIX的、以?xún)?nèi)核為基礎(chǔ)的、有完備內(nèi)存保護(hù)機(jī)制的、多任務(wù)多進(jìn)程的操作系

3、統(tǒng)。由于Linux具有開(kāi)放性,所以許多人認(rèn)為L(zhǎng)inux非常適合多數(shù)Intemet設(shè)備。他們認(rèn)為L(zhǎng)inux可以支持不同的設(shè)備,支持不同的配置。6.1.1 嵌入式Linux1. 可運(yùn)行于多種硬件平臺(tái)Linux符合IEEE POSIX.1標(biāo)準(zhǔn),使應(yīng)用程序具有較好的可移植性。Linux內(nèi)核已經(jīng)被移植到多種硬件平臺(tái)上,這對(duì)受開(kāi)銷(xiāo)、時(shí)間限制的研究與開(kāi)發(fā)項(xiàng)目是很有吸引力的。2. 可裁剪,性能優(yōu)異,應(yīng)用軟件豐富Linux的動(dòng)態(tài)模塊加載使Linux的裁剪極為方便,高度模塊化的部件使添加非常容易。Linux是一個(gè)全面的多任務(wù)和真正的32位操作系統(tǒng)。系統(tǒng)運(yùn)行穩(wěn)定,功能強(qiáng)大,支持多種硬件平臺(tái),應(yīng)用工具多。3. 使用成

4、本低 Linux是免費(fèi)軟件,只要遵守GPL(GNU General Public License)的規(guī)定,就可以免費(fèi)獲得拷貝,并進(jìn)行開(kāi)發(fā)和商業(yè)發(fā)行。6.1.1 嵌入式Linux4. 強(qiáng)大的網(wǎng)絡(luò)功能Linux操作系統(tǒng)最突出的是網(wǎng)絡(luò)部分,基本上所有的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)接口都可以在Linux上找到。Linux內(nèi)核對(duì)網(wǎng)絡(luò)協(xié)議棧的設(shè)計(jì)是從簡(jiǎn)捷實(shí)用的角度出發(fā)的,它有一整套的網(wǎng)絡(luò)協(xié)議模塊。Linux的網(wǎng)絡(luò)功能十分強(qiáng)大,更重要的是, Linux的網(wǎng)絡(luò)功能和協(xié)議是以?xún)?nèi)核可選的模塊方式提供的,它允許用戶(hù)自由地裁剪和優(yōu)化。5. GUI開(kāi)發(fā)支持Linux本身有性能優(yōu)秀的X Window系統(tǒng),在X Window系統(tǒng)的支持下

5、,能方便地進(jìn)行圖形用戶(hù)界面的開(kāi)發(fā)。6.1.1 嵌入式LinuxX Window是一個(gè)在大多數(shù)UNIX工作站上使用的圖形用戶(hù)界面。X Window系統(tǒng)應(yīng)用于嵌入式系統(tǒng)時(shí),要考慮嵌入式系統(tǒng)的特殊條件。6. 豐富的開(kāi)發(fā)技術(shù)資源Linux在這幾年中不斷成熟,越來(lái)越多的人加入了Linux的行列。這意味著對(duì)新硬件的Linux驅(qū)動(dòng)程序甚至比用于其他UNIX系統(tǒng)(如Solaris的驅(qū)動(dòng)程序)還來(lái)得及時(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)核,為嵌入式

6、應(yīng)用提供一個(gè)軟件環(huán)境,為應(yīng)用程序完成基本的底層的資源管理工作;初始化過(guò)程,完成基本的初始化。為使這個(gè)最小嵌入式系統(tǒng)具有一定的實(shí)用性,還需加上硬件的驅(qū)動(dòng)程序及個(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移植以滿(mǎn)足實(shí)時(shí)要求的實(shí)時(shí)操作系統(tǒng),應(yīng)用于一些關(guān)鍵的控制場(chǎng)合,如Fsmlabs公司的RT Linux,Monta Vista的Hard Hat Linux。盡可能保留Linux的強(qiáng)大功能,盡可能地減少其體積,以滿(mǎn)足許多嵌

7、入式系統(tǒng)對(duì)體積的要求,如uClinux。針對(duì)特定嵌入式領(lǐng)域采用整合方案,如Lineo,TimeSys,合肥華恒等。接下來(lái),簡(jiǎn)要介紹常用的兩個(gè)嵌入式Linux操作系統(tǒng)。6.1.3 嵌入式Linux的版本實(shí)時(shí)Linux(RT Linux)RT Linux是美國(guó)新墨西哥州大學(xué)計(jì)算機(jī)系研制開(kāi)發(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)度方法和用戶(hù)實(shí)時(shí)任務(wù)的工作是通過(guò)Linux的可導(dǎo)入模塊的方式進(jìn)行的。2. uClinuxuClinux是一個(gè)GNU

8、的項(xiàng)目,代碼完全開(kāi)放。uClinux的英文解釋是Micro Control Linux,可理解為“微控制領(lǐng)域中的Linux系統(tǒng)”。它專(zhuān)門(mén)應(yīng)用于沒(méi)有MMU的CPU,并專(zhuān)為嵌入式系統(tǒng)做了許多小型化的工作,已支持的微處理器包括Motorola MC68000,MCF5206和MCF5207ColdFire等。6.2 uCLinux開(kāi)發(fā)介紹目前,uClinux往往基于兩個(gè)Linux內(nèi)核版本,2.0.38 是一個(gè)比較成熟的版本,2.4.x是最新的版本Hitool 套件同時(shí)提供了對(duì)他們的支持。一般uClinux的內(nèi)核大小在500k左右,如果加上一些基本的應(yīng)用,也就在900k左右.非常適合于嵌入式系統(tǒng)。uC

9、linux架構(gòu)如圖6-1所示(下頁(yè)) ,一些重要的模塊在下面描述。6.2.1 啟動(dòng)過(guò)程(Bootstrap)啟動(dòng)模塊Bootstrap負(fù)責(zé)用來(lái)起動(dòng)Linux內(nèi)核,包括Chip Selector初始化,系統(tǒng)堆棧的初始化,把壓縮的Linux映像從Flash中解壓到RAM中,并把控制權(quán)交給內(nèi)核的初始化例程。這部分工作是與你的硬件高度相關(guān)的,所以這部分的代碼要盡量精簡(jiǎn)。6.2.2 內(nèi)核初始化(Kernel Initialization)內(nèi)核初始化的入口地址是: start_kernel(在init/main.c中)。 它初始化內(nèi)核的其它部分,包括異常(trap)、中斷(IRQ)、內(nèi)存頁(yè)(Page)、調(diào)

10、度(Scheduling)、驅(qū)動(dòng)程序等等。并啟動(dòng)“init”進(jìn)程進(jìn)入多任務(wù)環(huán)境。6.2.3 系統(tǒng)調(diào)用處理/異常處理當(dāng)“init”程序運(yùn)行后,內(nèi)核對(duì)整個(gè)系統(tǒng)的運(yùn)行不再進(jìn)行直接控制,而是通過(guò)系統(tǒng)調(diào)用給應(yīng)用程序提供服務(wù)和響應(yīng)外部及內(nèi)部的異步事件,例如:程序錯(cuò)誤,硬件中斷等。在ARM中,系統(tǒng)調(diào)用采用swi指令所產(chǎn)生的軟件異常來(lái)實(shí)現(xiàn),如例所示:swi 0 x900004(其中0 x900004表示這個(gè)系統(tǒng)調(diào)用為sys_write)。00002550 :2550: ef900004 swi 0 x009000042554: e3700a01 cmn r0, #4096 ; 0 x10002558: 2af

11、ff6b0 bcs 20 _syscall_error255c: e1a0f00e mov pc, lr6.2.4 驅(qū)動(dòng)程序(Device Driver)驅(qū)動(dòng)程序是整個(gè)Linux內(nèi)核的主要組成部分,它們控制著操作系統(tǒng)和外部設(shè)備的交互。Linux的驅(qū)動(dòng)程序是可選的,但是典型的系統(tǒng)應(yīng)該包括一個(gè)控制臺(tái)(Console),一個(gè)通用串口驅(qū)動(dòng)程序,一個(gè)塊設(shè)備 (用來(lái)存放根文件系統(tǒng)) 驅(qū)動(dòng)程序。當(dāng)Linux內(nèi)核起動(dòng)的時(shí)候,需要一個(gè)輸出調(diào)試信息的設(shè)備。這個(gè)設(shè)備往往通過(guò)串口來(lái)實(shí)現(xiàn)。這個(gè)調(diào)試終端可以通過(guò)register-console 這個(gè)函數(shù)來(lái)創(chuàng)建。而所有的調(diào)試信息都通過(guò)Printk例程通過(guò)這個(gè)調(diào)試終端來(lái)輸出。

12、6.2.5 文件系統(tǒng)(File System)支持多種文件系統(tǒng)是Linux一個(gè)重要的特性,uClinux同樣把這一特性帶進(jìn)了嵌入式系統(tǒng)中,并針對(duì)嵌入式系統(tǒng)作了一些取舍。在Hitool for uClinux包括了romfs, Ext2 FS, RAM FS, NFS 。 其中,romfs 是最簡(jiǎn)單的只讀文件系統(tǒng),所占用的空間最少,我們用它來(lái)做根文件系統(tǒng)(root file system)。根文件系統(tǒng)里存放Linux啟動(dòng)時(shí)要用到的設(shè)備文件,配置文件和應(yīng)用程序。例如:/dev/tty0, /etc/rc , /bin/init ,/bin/sh, 等等。6.2.6 內(nèi)存管理 uClinux不能使用

13、處理器的虛擬內(nèi)存管理技術(shù)但仍然采用存儲(chǔ)器的分頁(yè)管理,系統(tǒng)在啟動(dòng)時(shí)把實(shí)際存儲(chǔ)器進(jìn)行分頁(yè)。在加載應(yīng)用程序時(shí)程序分頁(yè)加載。但是由于沒(méi)有MMU管理,所以實(shí)際上uClinux采用實(shí)存儲(chǔ)器管理策略(物理內(nèi)存)。uClinux系統(tǒng)對(duì)于內(nèi)存的訪(fǎng)問(wèn)是直接的,(它對(duì)地址的訪(fǎng)問(wèn)不需要經(jīng)過(guò)MMU,而是直接送到地址線(xiàn)上輸出),所有程序中訪(fǎng)問(wèn)的地址都是實(shí)際的物理地址。由于應(yīng)用程序加載時(shí)必須分配連續(xù)的地址空間,所以開(kāi)發(fā)人員在開(kāi)發(fā)應(yīng)用程序時(shí)必須考慮內(nèi)存的分配情況并關(guān)注應(yīng)用程序需要運(yùn)行空間的大小。從內(nèi)存的訪(fǎng)問(wèn)角度來(lái)看,開(kāi)發(fā)人員的權(quán)利增大了(開(kāi)發(fā)人員在編程時(shí)可以訪(fǎng)問(wèn)任意的地址空間),但與此同時(shí)系統(tǒng)的安全性也大為下降。6.2.7

14、進(jìn)程管理uClinux 和Linux之間最大的區(qū)別在于平面存儲(chǔ)器模型。沒(méi)有虛擬存儲(chǔ)器可以提供非常有效的fork 系統(tǒng)調(diào)用。由于在使用fork時(shí),內(nèi)核會(huì)將父進(jìn)程拷貝一份給子進(jìn)程,但是這樣的做法相當(dāng)浪費(fèi)時(shí)間,因?yàn)榇蠖鄶?shù)的情形都是程序在調(diào)用fork后就立即調(diào)用exec,這樣剛拷貝來(lái)的進(jìn)程區(qū)域又立即被新的數(shù)據(jù)覆蓋掉。 因此Linux系統(tǒng)提供一個(gè)系統(tǒng)調(diào)用vfork,vfork假定系統(tǒng)在調(diào)用完成vfork后會(huì)馬上執(zhí)行exec,因此vfork不拷貝父進(jìn)程的頁(yè)面,只是初始化私有的數(shù)據(jù)結(jié)構(gòu)與準(zhǔn)備足夠的分頁(yè)表。這樣實(shí)際在vfork調(diào)用完成后父子進(jìn)程事實(shí)上共享同一塊存儲(chǔ)器(在子進(jìn)程調(diào)用exec或是exit之前),因

15、此子進(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)程的存儲(chǔ)區(qū)域, 這樣將產(chǎn)生寫(xiě)保護(hù)錯(cuò)誤(do_wp_page)(這個(gè)時(shí)候子進(jìn)程寫(xiě)的實(shí)際上是父進(jìn)程的存儲(chǔ)區(qū)域)。這個(gè)錯(cuò)誤導(dǎo)致內(nèi)核為子進(jìn)程重新分配存儲(chǔ)空間。當(dāng)子進(jìn)程正確開(kāi)始執(zhí)行后,將喚醒父進(jìn)程,使得父進(jìn)程繼續(xù)往后執(zhí)行。所以,在uClinux中,想讓父子進(jìn)程同時(shí)運(yùn)行同一個(gè)程序是不可以的。6.2.8 運(yùn)行時(shí)間庫(kù)及應(yīng)用程序運(yùn)行時(shí)間庫(kù)提供了用戶(hù)程序和內(nèi)核程

16、序的接口。1. 程序的入口代碼用戶(hù)自己寫(xiě)程序一般從main開(kāi)始,其實(shí)程序在運(yùn)行時(shí)真正的進(jìn)入點(diǎn)是C運(yùn)行庫(kù)的一部分。這部分代碼執(zhí)行初始靜態(tài)數(shù)據(jù),例如錯(cuò)誤號(hào)(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ù)出來(lái),并調(diào)用_uClibc_main。在_uClibc_main中再調(diào)用用

17、戶(hù)程序的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, #0ldr r1,sp, #4ldr r2,sp, #8/* 運(yùn)行 uClibc的 main() 函數(shù)不應(yīng)返回 */bl_uClibc_main6.2.8 運(yùn)行時(shí)間庫(kù)及應(yīng)用程序 2. 堆(heap)分配用戶(hù)程序通過(guò)調(diào)用malloc從堆中分配內(nèi)存。在

18、有虛擬存儲(chǔ)器的系統(tǒng)中,堆可以使用sbrk調(diào)用來(lái)擴(kuò)大。因?yàn)樘摂M存儲(chǔ)器支持分段存儲(chǔ),所以可以在堆的最高端到堆棧的最底部之間留有很大的虛擬空間來(lái)做擴(kuò)展之用。但在平面存儲(chǔ)器系統(tǒng)中,沒(méi)有這個(gè)空間。所以,堆空間改用mmap調(diào)用來(lái)分配。在uClibc中,內(nèi)存分配的算法非常簡(jiǎn)單直接,存儲(chǔ)器的管理完全依靠?jī)?nèi)核的頁(yè)機(jī)制來(lái)完成。見(jiàn)圖6-2。6.2.8 運(yùn)行時(shí)間庫(kù)及應(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)存允許堆和堆棧之間留有足夠大的空間來(lái)讓他們擴(kuò)展。 系統(tǒng)可以監(jiān)控頁(yè)的使用情況,防止堆棧溢出。但在uCl

19、inux中要預(yù)留這樣大的物理空間是不可能的。另外,因?yàn)樵趗Clinux中沒(méi)有內(nèi)存保護(hù)機(jī)制來(lái)防止堆棧溢出,在程序鏈接時(shí)要特別小心設(shè)定堆棧的大小。6.2.8 運(yùn)行時(shí)間庫(kù)及應(yīng)用程序4. 執(zhí)行文件格式(Flat binary format)uClinux系統(tǒng)使用flat可執(zhí)行文件格式,可以使用elf2flt工具把ELF格式的可執(zhí)行文件轉(zhuǎn)化為flat文件。當(dāng)用戶(hù)執(zhí)行一個(gè)應(yīng)用時(shí),內(nèi)核的執(zhí)行文件加載器(fs/binfmt_flat.c)將對(duì)flat文件進(jìn)行進(jìn)一步處理,主要是對(duì)代碼段和數(shù)據(jù)段進(jìn)行修正。為什么要修正呢?因?yàn)閼?yīng)用程序在連接時(shí)并不知道它要在系統(tǒng)的那一段地址上面運(yùn)行,這樣就要求程序在任何地址上都要能運(yùn)

20、行,也就是說(shuō)與地址無(wú)關(guān)(PICposition independent code)。 這個(gè)特性由針對(duì)uClinux的編譯器和連接器來(lái)提供。在ARM中有一條相對(duì)跳轉(zhuǎn)指令: ebxxxxxx bl xxxxx;可以用來(lái)實(shí)現(xiàn)地址無(wú)關(guān)的跳轉(zhuǎn)。 6.3 uCLinux啟動(dòng)過(guò)程uClinux系統(tǒng)的啟動(dòng)可以分為兩個(gè)步驟: 1. 運(yùn)行bootloader初始化程序SRAM 、SDRAM等存儲(chǔ)設(shè)備屬于揮發(fā)性的存儲(chǔ)器,掉電以后其中的內(nèi)容就會(huì)全部丟失,所以必須把操作系統(tǒng)的內(nèi)核鏡像存放在Flash等不揮發(fā)性存儲(chǔ)介質(zhì)上。從本質(zhì)上來(lái)講,bootloader不屬于操作系統(tǒng)內(nèi)核。它采用匯編語(yǔ)言編寫(xiě),因此針對(duì)不同的CPU體系結(jié)

21、構(gòu),這一部分代碼不具有可移植性。在移植操作系統(tǒng)時(shí),這部分代碼必須加以改寫(xiě)。6.3 uCLinux啟動(dòng)過(guò)程具體來(lái)講,bootloader在系統(tǒng)啟動(dòng)時(shí)主要完 成以下幾項(xiàng)工作:將操作系統(tǒng)內(nèi)核從Flash拷貝到SDRAM中,如果是壓縮格式的內(nèi)核,還要將之解壓縮。 改寫(xiě)系統(tǒng)的memory map,原先f(wàn)lash起始地址映射為0地址,這時(shí)需要將RAM的起始地址映射為0。設(shè)置堆棧指針并將bss段清零。將來(lái)執(zhí)行C語(yǔ)言程序和調(diào)用子函數(shù)時(shí)要用到。改變pc值,使得CPU開(kāi)始執(zhí)行真正的操作系統(tǒng)內(nèi)核。 6.3 uCLinux啟動(dòng)過(guò)程2. 運(yùn)行操作系統(tǒng)內(nèi)核bootloader程序執(zhí)行完上述的各項(xiàng)工作后,通過(guò)一條跳轉(zhuǎn)指令,

22、轉(zhuǎn)而執(zhí)行init目錄下C語(yǔ)言源文件main.c中的函數(shù)start_kernel( )。因?yàn)樵诖酥癰ootloader已經(jīng)創(chuàng)建好一個(gè)初始化環(huán)境,C函數(shù)可以開(kāi)始執(zhí)行了。 整個(gè)操作系統(tǒng)內(nèi)核的初始化工作從這里才算是真正開(kāi)始。這個(gè)函數(shù)的長(zhǎng)度比較短,代碼如下: void _init start_kernel(void) char * command_line; unsigned long mempages; extern char saved_command_line; /* * Interrupts are still disabled. Do necessary setups, then * ena

23、ble them */ lock_kernel(); printk(linux_banner); setup_arch(&command_line); printk(Kernel command line: %sn, saved_command_line); parse_options(command_line); trap_init(); init_IRQ(); sched_init(); softirq_init(); time_init(); /* * HACK ALERT! This is early. Were enabling the console before * weve d

24、one 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) &_etext - (unsigned long

25、) &_stext; prof_len = prof_shift; size = prof_len * sizeof(unsigned int) + PAGE_SIZE-1; prof_buffer = (unsigned int *) alloc_bootmem(size); kmem_cache_init(); sti(); calibrate_delay(); #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start & !initrd_below_start_ok & initrd_start min_low_pfn PAGE_SHIFT) print

26、k(KERN_CRIT initrd overwritten (0 x%08lx 0 x%08lx) - disabling it.n,initrd_start,min_low_pfn binary 200 Type set to I6.4.3 調(diào)試方法注意:在用FTP進(jìn)行文件傳輸?shù)臅r(shí)候,一定要選好文件傳輸?shù)哪J?,F(xiàn)TP默認(rèn)模式為二進(jìn)制模式,但是為了保險(xiǎn)起見(jiàn),還是手動(dòng)把傳輸模式顯式改寫(xiě)為二進(jìn)制模式。通常的txt、html和絕大多數(shù)PS文件都是文本格式的,而其他的可執(zhí)行文件、壓縮文件都是二進(jìn)制格式。兩種格式之間要用ascii和binary命令切換,兩者都可以適當(dāng)縮寫(xiě)。6.4.3 調(diào)試方法(6)傳

27、輸已編譯好的可執(zhí)行文件(如lednxy)到目標(biāo)系統(tǒng)并退出FTP服務(wù),鍵入命令: ftpget lednxy ftpquit (7)此時(shí),可執(zhí)行文件lednxy已傳輸至目錄/var或/tmp下,但文件的可執(zhí)行屬性未被設(shè)置,添加文件的可執(zhí)行屬性,鍵入命令: chmod 755 lednxychmod是一個(gè)文件權(quán)限修改的命令,在文件創(chuàng)建的時(shí)候會(huì)自動(dòng)設(shè)置存取權(quán)限,若是這些默認(rèn)權(quán)限無(wú)法適合企業(yè)環(huán)境的需求,就可以利用chmod命令來(lái)修改存取權(quán)限。通常在權(quán)限修改的時(shí)候可以用兩種方式表示權(quán)限類(lèi),數(shù)字表示法和文字表示法。6.4.3 調(diào)試方法這里我們采用的是數(shù)字表示法。就是說(shuō)將讀取(r)、寫(xiě)入(w)和執(zhí)行(x)分

28、別以4、2、1來(lái)代表,沒(méi)有授予權(quán)限的部分就表示值為0,然后再把所授予的權(quán)限相加而成。表6-1為讀者列出了幾個(gè)例子。表6-1 存取權(quán)限范例6.4.3 調(diào)試方法 表中每三位字符為一組,這樣權(quán)限可以被分為三組:第一組表示此文件擁有者的存取權(quán)限第二組表示該文件擁有者所屬組成員的存取權(quán)限最后一組表示該文件擁有者所屬組之外的用戶(hù)存取權(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)程,來(lái)控制它們的運(yùn)行。(1)單應(yīng)用程序MDB調(diào)試方法如

29、下: 要使用MDB協(xié)議,先要在Startup Configuration里進(jìn)行設(shè)定如下:選擇protocol 為MDB 選擇Port 為Ethernet,如果你板子上的網(wǎng)口不可以用來(lái)做調(diào)試,請(qǐng)選擇COM1或COM2,并寫(xiě)上相應(yīng)的IP地址或波特率(9600-57600之間)。在TgtSvr框中,填入運(yùn)行TargetServer的PC的IP地址,缺省為本地。圖6-5 MDB 配置對(duì)話(huà)框6.4.3 調(diào)試方法 然后讓uClinux在開(kāi)發(fā)板上運(yùn)行起來(lái),以root身份進(jìn)入,密碼uClinux 。在控制臺(tái)上打入MDB :9999 (用網(wǎng)絡(luò)連接,9999是port)或MDB /dev/ttySx (用串口連接

30、,x為1或2)如果控制臺(tái)與調(diào)試使用同一個(gè)串口,請(qǐng)把控制臺(tái)中斷。 運(yùn)行TargetServer。 啟動(dòng)Hitool, 選擇Project|Init Debugger 命令。 現(xiàn)在,可以下載需要調(diào)試的文件了。 6-6 uClinux控制臺(tái)6.4.3 調(diào)試方法(2) 如果要同時(shí)調(diào)試多個(gè)程序,請(qǐng)打開(kāi)多個(gè)Hitool, 一個(gè)Hitool只能調(diào)試一個(gè)程序。你可以用下列命令來(lái)開(kāi)始一個(gè)調(diào)試過(guò)程。 Load image下載一個(gè)uClinux可執(zhí)行文件(flat binary file,*.exe)到目標(biāo)板。 fork運(yùn)行一個(gè)程序,并把相應(yīng)的符號(hào)文件(*.exe.elf)加到符號(hào)表中,使程序停在main函數(shù)上。

31、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 開(kāi)發(fā)工具介紹6.5.1 配置內(nèi)核 啟動(dòng)Hitool for uClinux 后,會(huì)有一個(gè)叫做“Linux Kernel”的工具欄出現(xiàn)在屏幕上(如圖6-7所示)。圖6-7 Linux 工具條6.5.1 配置內(nèi)核 請(qǐng)按“Setting”按鈕設(shè)置Linux相關(guān)的源文件路徑,內(nèi)核版本,以及運(yùn)行時(shí)間庫(kù)的版本。例如,如果你的Linux源結(jié)構(gòu)為:C:uclinuxuClinux-distuserC:uclinuxuClinux-distlinu

32、x-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 Setti

33、ngs”, 會(huì)依次出現(xiàn)圖6-11和圖6-12窗口。 圖6-9 uClinux配置主窗口圖6-10 目標(biāo)配置主窗口圖6-11 內(nèi)核配置窗口圖6-12 開(kāi)發(fā)板配置窗口6.5.1 配置內(nèi)核 你可以根據(jù)開(kāi)發(fā)板的參數(shù)填入相應(yīng)的值。 所有的預(yù)設(shè)值都是為所帶的評(píng)估板而設(shè)定的。 其他配置窗口不再一一贅述。 當(dāng)配置完成之后,會(huì)自動(dòng)作依賴(lài)關(guān)系設(shè)定。這會(huì)需要一段時(shí)間。在整個(gè)過(guò)程中,如果你希望終止至,可以按”stop”按鈕。6.5.2 編譯內(nèi)核第一步是編譯user目錄下的一些應(yīng)用程序,例如 init.exe ,agetty.exe ,sh.exe,mount.exe 等等第二步是把第一步編好的程序考到romfs目錄下

34、,并調(diào)用genromfs 命令來(lái)生成根文件系統(tǒng)的映像romfs.img。第三步才是編譯內(nèi)核, 并把romfs.img 連接進(jìn)去, 產(chǎn)生linux.elf。第四步是把linux.elf 去掉條是信息,轉(zhuǎn)成linux.bin, 并把它與boot 目錄下的啟動(dòng)代碼連接在一起, 生成最終的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)核下載到開(kāi)發(fā)板的RA

35、M上。這樣,你可以調(diào)試Linux 內(nèi)核就像調(diào)試一個(gè)普通的嵌入式程序。Hitool會(huì)幫你處理掉很多和Linux 相關(guān)的細(xì)節(jié)。在Hitool for uClinux中,我們包括了一個(gè)預(yù)先編譯好的Linux 內(nèi)核,該內(nèi)核存儲(chǔ)于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)試符號(hào)窗口 在調(diào)試過(guò)程中,有幾個(gè)窗口會(huì)很有幫助,一個(gè)是項(xiàng)目窗口中的“Linux SRC” pane,這里會(huì)列出uClinux 的源代碼的文件結(jié)構(gòu)。另一個(gè)是”Symbol” Pane。 你可以通過(guò)他們?cè)趶?fù)雜的Linux源代碼中找到需要的信息,如圖6-13和如圖6-14所示。圖6-13 uClinux源代碼結(jié)構(gòu)和調(diào)試符號(hào)6.6.2 幾個(gè)調(diào)試窗口2調(diào)試源代碼窗口 圖6-14給出了uClinux調(diào)試源代碼窗口,行號(hào)前的圓點(diǎn)表示設(shè)置的斷點(diǎn)。圖6-14 uClinux調(diào)試源代碼窗口6.6.2 幾個(gè)調(diào)試窗口3uClinux任務(wù)信息窗口(1)uClinux 進(jìn)程窗口Hitool為開(kāi)發(fā)者提供了uClinux 中運(yùn)行的任務(wù)的詳細(xì)的信息。點(diǎn)擊工具菜單的Task Info,打開(kāi)uClinux 窗口,窗口信息如圖6-15所示。uCli

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論