版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第七章嵌入式Linux系統(tǒng)移植目錄7.1BootLoader基本概念與典型結(jié)構(gòu)7.2U-Boot7.3交叉開發(fā)環(huán)境的建立7.4交叉編譯工具鏈7.5嵌入式Linux系統(tǒng)移植過程7.6Gdb調(diào)試器7.7遠程調(diào)試7.8內(nèi)核調(diào)試第七章嵌入式Linux系統(tǒng)移植(1)BootLoader基本概念與操作模式/常見的BootLoader/U-Boot
(2)交叉開發(fā)環(huán)境交叉開發(fā)環(huán)境的建立/交叉編譯工具鏈/clang與LLVM(3)嵌入式Linux系統(tǒng)移植U-Boot的移植/內(nèi)核配置、編譯和移植BootLoader基本概念
一個嵌入式Linux系統(tǒng)通??梢苑譃橐韵聨讉€部分:(1)引導(dǎo)加載程序及其環(huán)境參數(shù)。這里通常是指BootLoader以及相關(guān)環(huán)境參數(shù)。(2)Linux內(nèi)核?;谔囟ㄇ度胧介_發(fā)板的定制內(nèi)核以及內(nèi)核的相關(guān)啟動參數(shù)。(3)文件系統(tǒng)。主要包括根文件系統(tǒng)和一般建立于Flash內(nèi)存設(shè)備之上文件系統(tǒng)。(4)用戶應(yīng)用程序?;谟脩舻膽?yīng)用程序。有時在用戶應(yīng)用程序和內(nèi)核層之間可能還會包括一個嵌入式圖形用戶界面程序(GUI)。常見的嵌入式GUI有QT和MiniGUI等。在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運行之前運行的一小段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個適合的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像通用計算機中BIOS那樣的固件程序,因此整個系統(tǒng)的加載啟動任務(wù)就完全由BootLoader來完成。BootLoader是嵌入式系統(tǒng)在加電后執(zhí)行的第一段代碼,在它完成CPU和相關(guān)硬件的初始化之后,再將操作系統(tǒng)映像或固化的嵌入式應(yīng)用程序裝載到內(nèi)存中然后跳轉(zhuǎn)到操作系統(tǒng)所在的空間,啟動操作系統(tǒng)運行。對于嵌入式系統(tǒng)而言,BootLoader是基于特定硬件平臺來實現(xiàn)的。因此,幾乎不可能為所有的嵌入式系統(tǒng)建立一個通用的BootLoader,不同的處理器架構(gòu)都有不同的BootLoader。BootLoader不僅依賴于CPU的體系結(jié)構(gòu),而且依賴于嵌入式系統(tǒng)板級設(shè)備的相關(guān)配置。7.1.2BootLoader的操作模式大多數(shù)BootLoader都包含兩種不同的操作模式:自啟動模式和交互模式。這種劃分僅僅對于開發(fā)人員才有意義。(1)自啟動模式自啟動模式也叫啟動加載模式。在這種模式下,BootLoader自動從目標機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式(2)交互模式交互模式也叫下載模式。在這種模式下,目標機上的BootLoader將通過串口或網(wǎng)絡(luò)等通信手段從開發(fā)主機上下載內(nèi)核映像、根文件系統(tǒng)到RAM中。然后再被BootLoader寫到目標機上的固態(tài)存儲媒質(zhì)(如FLASH)中,或者直接進入系統(tǒng)的引導(dǎo)。交互模式也可以通過接口(如串口)接收用戶的命令。這種模式在初次固化內(nèi)核、根文件系統(tǒng)時或者更新內(nèi)核及根文件系統(tǒng)時都會用到。7.1.3BootLoader的典型結(jié)構(gòu)BootLoader啟動大多數(shù)都分為兩個階段。第一階段主要包含依賴于CPU的體系結(jié)構(gòu)硬件初始化的代碼,通常都用匯編語言來實現(xiàn)。這個階段的任務(wù)有:基本的硬件設(shè)備初始化(屏蔽所有的中斷、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù)Cache等)。為第二階段準備RAM空間。如果是從某個固態(tài)存儲媒質(zhì)中,則復(fù)制BootLoader的第二階段代碼到RAM。設(shè)置堆棧。跳轉(zhuǎn)到第二階段的C程序入口點。第二階段通常用C語言完成,以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個階段的任務(wù)有:初始化本階段要使用到的硬件設(shè)備。檢測系統(tǒng)內(nèi)存映射。將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM。為內(nèi)核設(shè)置啟動參數(shù)。調(diào)用內(nèi)核。ARM:S5PV210的啟動流程S5PV210的啟動過程由BL0、BL1和BL2(BL為BootLoader的簡稱)3部分代碼實現(xiàn),其中BL0在出廠時已經(jīng)被固化到64KB的iROM中。RISC-V基于SiFive的JH7100核嵌入式Linux啟動流程常見的BootLoader
(1)RedbootRedboot(RedHatEmbeddedDebugandBootstrap)是RedHat公司開發(fā)的一個獨立運行在嵌入式系統(tǒng)上的BootLoader程序,是目前比較流行的一個功能、可移植性好的BootLoader。Redboot是一個采用eCos開發(fā)環(huán)境開發(fā)的應(yīng)用程序,并采用了eCos的硬件抽象層作為基礎(chǔ),但它完全可以擺脫eCos環(huán)境運行,可以用來引導(dǎo)任何其他的嵌入式操作系統(tǒng),如Linux、WindowsCE等。Redboot支持的處理器構(gòu)架有ARM,MIPS,MN10300,PowerPC,RenesasSHx,v850,x86等,是一個完善的嵌入式系統(tǒng)BootLoader。(2)U-BootU-Boot(UniversalBootLoader)于2002年12月17日發(fā)布第一個版本U-Boot-0.2.0。U-Boot自發(fā)布以后已更新多次,其支持具有持續(xù)性。U-Boot是在GPL下資源代碼最完整的一個通用BootLoader。(3)BlobBlob(BootLoaderObject)是由Jan-DerkBakker和ErikMouw發(fā)布的,是專門為StrongARM構(gòu)架下的LART設(shè)計的BootLoader。Blob的最后版本是blob-2.0.5。Blob功能比較齊全,代碼較少,比較適合做修改移植,用來引導(dǎo)Liunx,目前大部分S3C44B0板都用Blob修改移植后加載uClinux。(4)vivivivi是韓國mizi公司開發(fā)的BootLoader,適用于ARM9處理器,現(xiàn)在已經(jīng)停止開發(fā)了。它是三星官方板SMDK2410采用的BootLoader。Vivi最主要的特點就是代碼小巧,有利于移植新的處理器。同時vivi的軟件架構(gòu)和配置方法類似Linux風(fēng)格,對于有過編譯Linux內(nèi)核經(jīng)驗的用戶,vivi更容易上手。
U-BootPartTwo7.27.2.1U-Boot概述U-Boot,全稱UniversalBootLoader,是遵循GPL條款的開放源碼項目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進行簡化而形成的,尤其是一些設(shè)備的驅(qū)動程序。
U-Boot支持多種嵌入式操作系統(tǒng),主要有OpenBSD,NetBSD,FreeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,SCO,Dell,NCR,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS,android等。同時,U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。U-Boot的主要特點有:源碼開放,目前有些版本的未開源。支持多種嵌入式操作系統(tǒng)內(nèi)核和處理器架構(gòu)。可靠性和穩(wěn)定性均較好。功能設(shè)置高度靈活,適合調(diào)試、產(chǎn)品發(fā)布等;設(shè)備驅(qū)動源碼十分豐富,支持絕大多數(shù)常見硬件外設(shè);并將對于與硬件平臺相關(guān)的代碼定義成宏并保留在配置文件中,開發(fā)者往往只需要修改這些宏的值就能成功使用這些硬件資源,簡化了移植工作。U-Boot
arch/cpu目錄包含了特定cpu代碼,而board目錄則包含了特定目標板的代碼。因此主要的工作就可以集中在board相關(guān)的代碼,只要不是太新的cpu型號,因此可以直接復(fù)用這部分實現(xiàn),選擇正確的配置選項。在U-Boot的這些源文件中,以S5PV210為例幾個比較重要的源文件如下所示:(1)start.S(arch\arm\cpu\armv7\start.S)通常情況下start.S是U-Boot上電后執(zhí)行的第一個源文件。該匯編文件包括定義了異常向量入口、相關(guān)的全局變量、禁用L2緩存、關(guān)閉MMU等,之后跳轉(zhuǎn)到lowlevel_init()函數(shù)中繼續(xù)執(zhí)行。(2)lowlevel_init.S(board\samsung\smdkv210\lowlevel_init.S)該源文件用匯編代碼編寫,其中只定義了一個函數(shù)lowlevel_init()。該函數(shù)實現(xiàn)對平臺硬件資源的一系列初始化過程,包括關(guān)看門狗、初始化系統(tǒng)時鐘、內(nèi)存和串口。(3)board.c(arch\arm\lib\board.c)Board.c主要實現(xiàn)了U-Boot第二階段啟動過程,包括初始化環(huán)境變量、串口控制臺、Flash和打印調(diào)試信息等,最后調(diào)用main_loop()函數(shù)。(4)smdkv210.h(include\configs\Smdkv210.h)該文件與具體平臺相關(guān),比如這里就是S5PV210平臺的配置文件,該源文件采用宏定義了一些與CPU或者外設(shè)相關(guān)的參數(shù)。U-Boot中的重要源文件(1)start.S(arch\arm\cpu\armv7\start.S)(2)lowlevel_init.S(board\samsung\smdkv210\lowlevel_init.S)(3)board.c(arch\arm\lib\board.c)(4)smdkv210.h(include\configs\Smdkv210.h)U-BOOT源碼分析及編譯
參考板的編譯makeARCH=armCROSS_COMPILE=arm-linux-distcleanmakeARCH=armCORSS_COMPILE=arm-linux-s5pc210_universal_defconfigmakeV=1ARCH=armCROSS_COMPILE=arm-linux--j1U-Boot啟動的一般流程
U-Boot啟動第一階段的主要工作U-Boot啟動的一般流程:第二階段(1)board_init_f()(2)board_init_r()7.2.3U-Boot環(huán)境變量U-Boot的環(huán)境變量是使用U-Boot的關(guān)鍵,它可以由用戶定義并遵守約定俗成的一些用法,也有部分是U-Boot定義并不得更改。值得注意的是在未初始化的開發(fā)板中并不存在環(huán)境變量。U-Boot在缺省的情況下會存在一些基本的環(huán)境變量,當用戶執(zhí)行了saveenv命令之后,環(huán)境變量會第一次保存到flash中,之后用戶對環(huán)境變量的修改和保存都是基于保存在flash中的環(huán)境變量的操作。環(huán)境變量名稱相關(guān)描述bootdelay
執(zhí)行自動啟動的等候秒數(shù)baudrate
串口控制臺的波特率netmask
以太網(wǎng)接口的掩碼ethaddr
以太網(wǎng)卡的網(wǎng)卡物理地址bootfile
缺省的下載文件bootargs
傳遞給內(nèi)核的啟動參數(shù)bootcmd
自動啟動時執(zhí)行的命令serverip
服務(wù)器端的ip地址ipaddr
本地ip地址stdin
標準輸入設(shè)備stdout
標準輸出設(shè)備stderr
標準出錯設(shè)備表7-3U-Boot常用環(huán)境變量U-Boot的環(huán)境變量中最重要的兩個變量是:
bootcmd和bootargs。Bootcmd是自動啟動時默認執(zhí)行的一些命令,因此用戶可以在當前環(huán)境中定義各種不同配置,不同環(huán)境的參數(shù)設(shè)置,然后通過bootcmd配置好參數(shù)。
Bootargs是環(huán)境變量中的重中之重.7.2.4U-Boot命令U-Boot上電啟動后,按任意鍵退出自啟動狀態(tài),進入命令行狀態(tài)。在提示符下,可以輸入U-Boot特有的命令完成相應(yīng)的功能。U-Boot提供了更加周詳?shù)拿顜椭ㄟ^help命令不僅可以得到當前U-Boot的所有命令列表,還能夠查看每個命令的參數(shù)說明。RISC-V架構(gòu)的U-Boot引導(dǎo)過程M模式U-Boot引導(dǎo)過程
S模式U-Boot引導(dǎo)過程當在M模式U-Boot中運行時,它會加載包含固件和S模式操作系統(tǒng)的payload鏡像(例如fw_payload),在這種情況下,開發(fā)者可以使用mkimage將payload鏡像打包成uImage格式,并使用bootm命令啟動它。RISC-V生成啟動映像可能包含用于特定平臺初始化的U-BootSPL(SecondaryProgramLoader,第二階段程序加載器,也叫輔助程序加載器)。U-BootSPL然后加載一個FIT映像(u-boot.itb),該鏡像包含提供SBI的固件(例如fw_dynamic),以及在S模式下運行的常規(guī)U-Boot(或U-Boot本身).最后,加載S模式操作系統(tǒng)。7.3交叉開發(fā)環(huán)境的建立PartThree7.3交叉開發(fā)環(huán)境的建立主機-目標機交叉開發(fā)環(huán)境模式是由開發(fā)主機和目標機兩套計算機系統(tǒng)內(nèi)組成的。開發(fā)主機一般指通用計算機,如PC等,目標機指嵌入式開發(fā)板(系統(tǒng))。通過交叉開發(fā)環(huán)境,在主機上使用開發(fā)工具(如各種SDK),針對目標機設(shè)計應(yīng)用系統(tǒng)進行設(shè)計工作,然后下載到目標機上運行。交叉開發(fā)模式一般采用以下3個步驟:(1)在主機上編譯BootLoader(引導(dǎo)加載程序),然后通過JTAG接口燒寫到目標板。(2)在主機上編譯Linux內(nèi)核,然后通過BootLoader下載到目標板以啟動或燒寫到Flash。(3)在主機上編譯各類應(yīng)用程序,通過NFS運行、調(diào)試這些程序,驗證無誤后再將制作好的文件系統(tǒng)映像燒寫到目標板7.3.1.主機與目標機的連接方式主機與目標機的連接方式主要有串口、以太網(wǎng)接口、USB接口、JTAG接口等方式連接。主機可以使用minicom、kermit或者Windows超級終端等工具,通過串口發(fā)送文件。目標機亦可以把程序運行結(jié)果通過串口返回并顯示。以太網(wǎng)接口方式使用簡單,配置靈活,支持廣泛,傳輸速率快,缺點是網(wǎng)絡(luò)驅(qū)動的實現(xiàn)比較復(fù)雜。JTAG(JointTestActionGroup,聯(lián)合測試行動小組)是一種國際標準測試協(xié)議(IEEE1149.1標準),主要是用于對目標機系統(tǒng)中的各芯片的簡單調(diào)試,和對BootLoader的下載兩個功能。JTAG連接器中,其芯片內(nèi)部封裝了專門的測試電路TAP(TestAccessPort,測試訪問口),通過專用的JTAG測試工具對內(nèi)部節(jié)點進行測試。因而該方式是開發(fā)調(diào)試嵌入式系統(tǒng)的一種簡潔高效的手段。JTAG有兩種標準,14針接口和20針接口。JTAG接口一端與PC機并口相連,另一端是面向用戶的JTAG測試接口,通過本身具有的邊界掃描功能便可以對芯片進行測試,從而達到處理器的啟動和停滯、軟件斷點、單步執(zhí)行和修改寄存器等功能的調(diào)試目的。其內(nèi)部主要是由JTAG狀態(tài)機和JTAG掃描鏈的組成。雖然JTAG調(diào)試不占用系統(tǒng)資源,能夠調(diào)試沒有外部總線的芯片,代價也非常小,但是JTAG只能提供一種靜態(tài)的調(diào)試方式,不能提供處理器實時運行時的信息。它是通過串行方式依次傳遞數(shù)據(jù)的,所以傳送信息速度比較慢。7.3.2.主機-目標機的文件傳輸方式主機-目標機的文件傳輸方式主要有串口傳輸方式、網(wǎng)絡(luò)傳輸方式、USB接口傳輸方式、JTAG接口傳輸方式、移動存儲設(shè)備方式。串口傳輸協(xié)議常見的有kermit、Xmodem、Ymoderm、Zmoderm等。串口驅(qū)動程序的實現(xiàn)相對簡單,但是速度慢,不適合較大文件的傳輸。USB接口方式通常將主機設(shè)為主設(shè)備端,目標機設(shè)為從設(shè)備端。與其他通信接口相比,USB接口方式速度快,配置靈活,易于使用。如果目標機上有移動存儲介質(zhì)如U盤等,可以制作啟動盤或者復(fù)制到目標機上,從而引導(dǎo)啟動。網(wǎng)絡(luò)傳輸方式一般采用TFTP(trivialfiletransportprotocol)協(xié)議。TFTP是一個傳輸文件的簡單協(xié)議,是TCP/IP協(xié)議族中的一個用來在客戶機與服務(wù)器之間進行簡單文件傳輸?shù)膮f(xié)議,提供不復(fù)雜、開銷不大的文件傳輸服務(wù)。端口號為69。此協(xié)議只能從文件服務(wù)器上獲得或?qū)懭胛募?,不能列出目錄,不進行認證,它傳輸8位數(shù)據(jù)。傳輸中有三種模式:netascii,這是8位的ASCII碼形式;另一種是octet,這是8位源數(shù)據(jù)類型;最后一種mail已經(jīng)不再支持,它將返回的數(shù)據(jù)直接返回給用戶而不是保存為文件。7.3.3.文件系統(tǒng)的掛接-配置網(wǎng)絡(luò)文件系統(tǒng)NFSNFS(NetworkFileSystem)即網(wǎng)絡(luò)文件系統(tǒng),是FreeBSD支持的文件系統(tǒng)中的一種,它允許網(wǎng)絡(luò)中的計算機之間通過TCP/IP網(wǎng)絡(luò)共享資源。在NFS的應(yīng)用中,本地NFS的客戶端應(yīng)用可以透明地讀寫位于遠端NFS服務(wù)器上的文件,就像訪問本地文件一樣。NFS的優(yōu)點主要有:(1)節(jié)省本地存儲空間,將常用的數(shù)據(jù)存放在一臺NFS服務(wù)器上且可以通過網(wǎng)絡(luò)訪問,那么本地終端將可以減少自身存儲空間的使用。(2)用戶不需要在網(wǎng)絡(luò)中的每個機器上都建有Home目錄,Home目錄可以放在NFS服務(wù)器上且可以在網(wǎng)絡(luò)上被訪問使用。(3)一些存儲設(shè)備如軟驅(qū)、CDROM和Zip等都可以在網(wǎng)絡(luò)上被別的機器使用。這可以減少整個網(wǎng)絡(luò)上可移動介質(zhì)設(shè)備的數(shù)量。交叉編譯工具鏈
交叉開發(fā)工具鏈就是為了編譯、鏈接、處理和調(diào)試跨平臺體系結(jié)構(gòu)的程序代碼。從工具鏈的組成上來說,它一般由多個程序構(gòu)成,glibc、gcc、binutils和gdb四個軟件提供分別對應(yīng)著各個功能。常見的交叉編譯例子如下:(1)在WindowsPC上,利用諸如類似ADS、RVDS等軟件,使用armcc編譯器,則可編譯出針對ARMCPU的可執(zhí)行代碼。(2)在LinuxPC上,利用arm-linux-gcc編譯器,可編譯出針對LinuxARM平臺的可執(zhí)行代碼。(3)在WindowsPC上,利用cygwin環(huán)境,運行arm-elf-gcc編譯器,可編譯出針對ARMCPU的可執(zhí)行代碼。7.4.2工具鏈的構(gòu)建方法通常構(gòu)建交叉工具鏈有如下三種方法。方法一:分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者及用戶。如果只是想使用交叉工具鏈,建議使用下列的方法二構(gòu)建交叉工具鏈。方法二:通過Crosstool腳本工具來實現(xiàn)一次編譯,生成交叉編譯工具鏈,該方法相對于方法一要簡單許多,并且出錯的機會也非常少,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈。方法三:直接通過網(wǎng)上下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點是簡單可靠,缺點也比較明顯,擴展性不足,對特定目標沒有針對性,而且也存在許多未知錯誤的可能,建議讀者慎用此方法。
GCC對于GUN編譯器來說,GCC的編譯要經(jīng)歷四個相互關(guān)聯(lián)的步驟∶預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking)。file.cc程序源文件file.ic程序預(yù)處理后文件file.cxxc++程序源文件,也可以是file.cc/file.cpp/file.c++file.iic++程序預(yù)處理后文件file.hc/c++頭文件file.s匯編程序文件file.o目標代碼文件Binutils與glibcBinutilsBinutils提供了一系列用來創(chuàng)建、管理和維護二進制目標文件的工具程序,如匯編(as)、連接(ld)、靜態(tài)庫歸檔(ar)、反匯編(objdump)、elf結(jié)構(gòu)分析工具(readelf)、無效調(diào)試信息和符號的工具(strip)等。通常binutils與gcc是緊密相集成的,沒有binutils的話,gcc是不能正常工作的。
glibcGlibc是gnu發(fā)布的libc庫,也即c運行庫。Glibc是linux系統(tǒng)中最底層的應(yīng)用程序開發(fā)接口,幾乎其它所有的運行庫都倚賴于glibc。Glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務(wù)外,它本身也提供了許多其它一些必要功能服務(wù)的實現(xiàn),比如open,malloc,printf等等。Glibc是GNU工具鏈的關(guān)鍵組件,用于和二進制工具和編譯器一起使用,為目標架構(gòu)生成用戶空間應(yīng)用程序。Makefile#makefileCC=arm-linux-gcc#指定交叉編譯器EXEC=hello$(EXEC):hello.c$(CC)hello.c–o$(EXEC)#注意命令需要用tab鍵Clean:Rm–f*.o$(EXEC)CC 指明編譯器的宏EXEC 表示生成的執(zhí)行文件名稱的宏OBJS 目標文件列表宏LDFLAGS 連接參數(shù)宏All: 編譯主入口Clean: 清除編譯結(jié)果Install: 將編譯成功的可執(zhí)行文件安裝到系統(tǒng)目錄中,一般為/usr/local/bin目錄擴展:clang與LLVMLLVM(LowLevelVirtualMachine,底層虛擬機)主要涉及到編譯器的中、后端,
其代碼以模塊的形式進行劃分和實現(xiàn),
包括中間表示、代碼分析、優(yōu)化和代碼生成等。
clang主要涉及到編譯器的前端,
也是采用類似的形式進行模塊化實現(xiàn),
包括抽象語法樹、詞法分析、語法分析、語義分析和LLVM中間代碼生成等.
LLVMLLVM編譯流程結(jié)構(gòu)圖
高級語言前端結(jié)構(gòu)圖
中間代碼優(yōu)化器結(jié)構(gòu)圖
LLVM后端代碼生成器的結(jié)構(gòu)圖GCC和Clang對比
嵌入式Linux系統(tǒng)移植過程PartFive7.5嵌入式Linux系統(tǒng)移植過程嵌入式Linux系統(tǒng)的移植主要有BootLoader(如U-Boot)、Linux內(nèi)核、文件系統(tǒng)。嵌入式Linux系統(tǒng)移植的一般流程是:首先構(gòu)建嵌入式Linux開發(fā)環(huán)境,包括硬件環(huán)境和軟件環(huán)境;其次,移植BootLoader;然后,移植Linux內(nèi)核和構(gòu)建根文件系統(tǒng);最后,一般還要移植或開發(fā)設(shè)備驅(qū)動程序。U-Boot移植1.下載U-Boot源碼2.修改相應(yīng)的文件代碼移植過程最主要的就是代碼的修改與文件的配置。國內(nèi)嵌入式廠商研發(fā)的S5PV210開發(fā)板大都基于SMDKV210評估板做了減法和調(diào)整,所以三星提供的U-Boot、內(nèi)核、文件系統(tǒng)大都適用于這些S5PV210開發(fā)板,因而在開發(fā)者在此基礎(chǔ)上只需要根據(jù)相應(yīng)的makefile文件修改配置即可。U-Boot移植3.編譯U-BootU-Boot的編譯命令主要分兩步進行。第一步是配置,如makesmdkv210_config;第二步是編譯,執(zhí)行make就可以了。中。4.燒寫到開發(fā)板上,運行和調(diào)試新開發(fā)的板子沒有任何程序可以執(zhí)行,也不能啟動,需要先將U-Boot燒寫到flash或者SD卡Makefile體系Linux內(nèi)核的配置
#makemenuconfigARCH=armCROSS_COMPILE=arm-linux-這個過程就稱為“配置內(nèi)核”內(nèi)核配置的基本原則是把不必要的功能都去掉,不僅可以減小內(nèi)核大小,還可以節(jié)省編譯內(nèi)核和內(nèi)核模塊的時間。內(nèi)核移植對于內(nèi)核移植而言,主要是添加開發(fā)板初始化和驅(qū)動程序的代碼,這些代碼大部分是跟體系結(jié)構(gòu)相關(guān)。具體到cotrex-A8型開發(fā)板來說,linux已經(jīng)有了較好的支持。比如從Kernel官方維護網(wǎng)站
上下載到2.6.35的源代碼,解壓后查看arch/arm/目錄下已經(jīng)包含了三星S5PV210的支持,即三星官方評估開發(fā)板SMDK210的相關(guān)文件mach-smdkv210了。移植Kernel只需要修改兩個開發(fā)板之間的差別之處就可以了。具體例子可以見書7.5.2節(jié)。
內(nèi)核配置與編譯Gdb調(diào)試器PartSix7.6GDB(GNUDeBugger)是自由軟件基金會(FreeSoftwareFoundation,F(xiàn)SF)的軟件工具之一。它的作用是協(xié)助程序員找到代碼中的錯誤。(1)進入GDB
Gdbtesttest是要調(diào)試的程序,由gcctest.c-g-otest生成。進入后提示符變?yōu)?Gdb)。(2)查看源碼(Gdb)l源碼會進行行號提示。如果需要查看在其他文件中定義的函數(shù),在l后加上函數(shù)名即可定位到這個函數(shù)的定義及查看附近的其他源碼。或者:使用斷點或單步運行,到某個函數(shù)處使用s進入這個函數(shù)。(3)設(shè)置斷點(Gdb)b6這樣會在運行到源碼第6行時停止,可以查看變量的值、堆棧情況等;這個行號是Gdb的行號。(4)查看斷點處情況(Gdb)
infob可以鍵入"infob"來查看斷點處情況,可以設(shè)置多個斷點;(5)運行代碼(Gdb)
r(6)顯示變量值(Gdb)
pn在程序暫停時,鍵入"p變量名"(print)即可;GDB在顯示變量值時都會在對應(yīng)值之前加上"$N"標記,它是當前變量值的引用標記,以后若想再次引用此變量,就可以直接寫作"$N",而無需寫冗長的變量名;(7)觀察變量(Gdb)
watchn在某一循環(huán)處,往往希望能夠觀察一個變量的變化情況,這時就可以鍵入命令"watch"來觀察變量的變化情況,GDB在"n"設(shè)置了觀察點;(8)單步運行(Gdb)
n(9)程序繼續(xù)運行(Gdb)
c使程序繼續(xù)往下運行,直到再次遇到斷點或程序結(jié)束;(10)退出GDB
(Gdb)
q
Gdb中,輸入命令時,可以不用打全命令,只用打命令的前幾個字符就可以了,當然,命令的前幾個字符應(yīng)該要標志著一個唯一的命令,在Linux下,可以敲擊兩次TAB鍵來補齊命令的全稱,如果有重復(fù)的,那么Gdb會把其例出來。遠程調(diào)試PartSix7.7在嵌入式軟件調(diào)試過程中,調(diào)試器通常運行于主機環(huán)境中,被調(diào)試的軟件則運行于基于特定硬件平臺的目標機上。主機上的調(diào)試器通過串口、并口或網(wǎng)卡接口等通信方式與目標機進行通信,控制目標機上程序的運行,實現(xiàn)對目標程序的調(diào)試,這種調(diào)試方式稱為遠程調(diào)試。常用的遠程調(diào)試技術(shù)主要有插樁(stub)和片上調(diào)試(OnChipDebugging,OCD)兩種。插樁(stub)指在目標操作系統(tǒng)和調(diào)試器內(nèi)分別加入某些軟件模塊實現(xiàn)調(diào)試;片上調(diào)試指在微處理器芯片內(nèi)嵌入額外的控制電路實現(xiàn)對目標程序的調(diào)試。片上調(diào)試方式不占用目標平臺的通信端口,但它依賴于硬件。插樁方式僅需要一個用于通信的端口,其他全部由軟件實現(xiàn)。7.7.1遠程調(diào)試工具的構(gòu)成插樁方式下的調(diào)試環(huán)境構(gòu)成遠程調(diào)試工具由三部分構(gòu)成:主機端的調(diào)試器、遠程通信協(xié)議和插樁模塊。前兩部分可采用GDB(GNUdebugger)調(diào)試器來解決。為了監(jiān)控和調(diào)試程序,主機GDB通過串行協(xié)議使用內(nèi)存讀寫命令,無損害地將目標程序原指令用一個trap指令代替,從而完成斷點設(shè)置動作。7.7.2通信協(xié)議-RSP$<data>#[chksum]該數(shù)據(jù)包分為四部分:第一部分是包頭,由字符“$”構(gòu)成;第二部分是數(shù)據(jù)包內(nèi)容,對應(yīng)調(diào)試信息,它可以是調(diào)試器發(fā)布的命令串,也可以是目標機的應(yīng)答信息,數(shù)據(jù)包中應(yīng)該至少有一個字節(jié);第三部分是字符“#”,它是調(diào)試信息的結(jié)束標志;
第四部分是由兩位十六進制數(shù)的ASCII碼字符構(gòu)成的校驗碼,7.7.3遠程調(diào)試的實現(xiàn)方法及設(shè)置相對于宿主機遠程調(diào)試環(huán)境的建立過程,目標機調(diào)試stub的實現(xiàn)更要復(fù)雜,它要提供一系列實現(xiàn)與主機GDB的通信和對被調(diào)試程序的控制功能的函數(shù)。這些功能函數(shù)GDB有的已經(jīng)提供,如Gdb文件包中的m68k-stub.c、i386-stub.c等文件提供了一些相應(yīng)目標平臺的stub子函數(shù),有的函數(shù)需要開發(fā)者根據(jù)特定目標平臺自行設(shè)計實現(xiàn)。stub的主要子函數(shù):sets_debug_traps():函數(shù)指針初始化,捕捉調(diào)試中斷進入handle.exception()函數(shù)。Handle_exception():該函數(shù)是stub的核心部分。程序運行被中斷時,首先發(fā)送一些主機的狀態(tài)信息,如寄存器的值,然后在主機Gdb的控制下執(zhí)行程序,并檢索和發(fā)送Gdb需要的數(shù)據(jù)信息,直到主機Gdb要求程序繼續(xù)運行,handle_exception()交還控制權(quán)給程序。Breakpoint():該功能函數(shù)可以被調(diào)試程序中設(shè)置斷點。除以上函數(shù)外,開發(fā)人員需要針對特定目標平臺,為stub實現(xiàn)以下底層功能函數(shù),才能使調(diào)試stub正常與主機GDB協(xié)同工作,比如:GetDebugChar()、putDebugChar():讀寫通過Gdb遠程串行協(xié)議與主機交互的數(shù)據(jù)。ExceptionHandler():各目標平臺對系統(tǒng)中斷向量的組織安排是不一樣的,該函數(shù)要能夠使得系統(tǒng)中斷發(fā)生時,程序可以正常獲得中斷服務(wù)程序的入口地址。Memset():標準庫函數(shù),保證對特定目標平臺的內(nèi)存操作。開發(fā)者就可以按以下步驟使用stub對目標程序進行遠程調(diào)試:(1)在被調(diào)試程序開始處,插入兩個函數(shù)調(diào)用:sets_debug_traps()和handle.exception()。(2)將被調(diào)試程序、GDB提供的stub功能函數(shù)和上述目標系統(tǒng)中實現(xiàn)的stub底層子函數(shù)一起編譯鏈接生成一個包含調(diào)試stub的目標程序。(3)建立主機與目標機的串口或以太口連接,保證通信物理鏈路的順暢。(4)將被調(diào)試目標代碼下載到目標系統(tǒng)并運行該程序,它會被內(nèi)部stub函數(shù)中斷在開始處,等待宿主機GDB的連接請求。(5)在宿主機運行針對目標平臺編譯鏈接Gdb。用targetremote命令連接目標機stub,然后就使用相應(yīng)GDB命令對目標程序進行跟蹤和調(diào)試了。7.7.4遠程調(diào)試應(yīng)用實例方法目前嵌入式linux系統(tǒng)中,主要有三種遠程調(diào)試方法,分別適合與不同場合的調(diào)試工作:用ROMMonitor調(diào)試內(nèi)核裝載程序、用KGDB調(diào)試系統(tǒng)內(nèi)核和用GDBserver調(diào)試用戶空間程序。這三種調(diào)試的方法的區(qū)別主要在于目標機遠程調(diào)試stub的存在形式不同,而設(shè)計思路和實現(xiàn)方法則大致相同,并且它們配合工作的主機Gdb是同一個程序。1.用ROMMonitor調(diào)試目標機程序在嵌入式linux內(nèi)核運行前的狀態(tài)中,程序的裝載、運行和調(diào)試一般都由RomMon
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年柳州鐵道職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫附答案解析
- 2025年山東經(jīng)貿(mào)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案解析
- 2024年金川縣幼兒園教師招教考試備考題庫含答案解析(奪冠)
- 2024年西安財經(jīng)大學(xué)馬克思主義基本原理概論期末考試題附答案解析(必刷)
- 2025年四川大學(xué)馬克思主義基本原理概論期末考試模擬題帶答案解析(必刷)
- 2025年沈陽體育學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析
- 2025年石家莊鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性考試題庫附答案解析
- 2025年運城幼兒師范高等專科學(xué)校馬克思主義基本原理概論期末考試模擬題附答案解析
- 2025年浙江紡織服裝職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫帶答案解析
- 2025年浙江科技大學(xué)馬克思主義基本原理概論期末考試模擬題帶答案解析
- 2025初中英語詞匯3500詞匯表
- 國家電力安全生產(chǎn)課件
- 鉆探施工安全培訓(xùn)課件
- 家具拆單操作標準及流程指南
- 貿(mào)易企業(yè)貨權(quán)管理辦法
- 小學(xué)數(shù)學(xué)長度單位換算練習(xí)200題及答案
- 電廠廢棄物管理制度
- 新技術(shù)項目立項
- GB/T 18344-2025汽車維護、檢測、診斷技術(shù)規(guī)范
- DB42T 1651-2021 房屋建筑和市政基礎(chǔ)設(shè)施工程安全生產(chǎn)事故隱患排查與治理要求
- 當事人提交證據(jù)材料清單(完整版)
評論
0/150
提交評論