嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件_第1頁
嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件_第2頁
嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件_第3頁
嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件_第4頁
嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件_第5頁
已閱讀5頁,還剩209頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)講義

第6章嵌入式系統(tǒng)軟件移植與Linux下程序開發(fā)周國運2007.9嵌入式系統(tǒng)講義

第6章嵌入式系統(tǒng)軟件移植與Linux下1本章主要內(nèi)容1、Bootloader及vivi移植2、嵌入式Linux內(nèi)核及移植3、基于Linux的應(yīng)用程序開發(fā)4、基于Linux的驅(qū)動程序開發(fā)5、驅(qū)動程序開發(fā)實例本章主要內(nèi)容1、Bootloader及vivi移植26.1Bootloader及vivi移植本節(jié)內(nèi)容1、Bootloader簡介2、Bootloader工作模式3、Bootloader啟動過程4、viviBootloader源代碼分析5、viviBootloader接口命令6、vivi源代碼修改移植6.1Bootloader及vivi移植本節(jié)內(nèi)容3建立交叉編譯環(huán)境Bootloader的/移植/配置/編譯kernel的移植/配置/編譯根文件系統(tǒng)Cramfs的實現(xiàn)嵌入式系統(tǒng)軟件開發(fā)流程用戶應(yīng)用程序開發(fā)建立交叉編譯環(huán)境Bootloader的/移植/配置/編譯ke46.1.1Bootloader簡介

Bootloader,為引導(dǎo)加載程序,是嵌入式系統(tǒng)加電后運行的第一段代碼,相當(dāng)于PC機的BIOS。

Bootloader的位置:通常固化在硬件上的某個固態(tài)存儲設(shè)備上,加電后自啟動。

Bootloader功能:初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,將系統(tǒng)的軟、硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。6.1.1Bootloader簡介 Bootloade5 Bootloader在軟件的層次位置 Bootloader在軟件的層次位置6

Bootloader的地址:在嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時從地址0x0000,0000處開始執(zhí)行,在這個地址處安排的就是Bootloader。

Bootloader是嚴(yán)重地依賴于硬件而實現(xiàn)的。每種不同體系結(jié)構(gòu)的處理器都有不同的Bootloader。不過Bootloader的發(fā)展也趨于支持多種體系結(jié)構(gòu),如現(xiàn)在比較成熟的vivi、RedBoot和U-Boot等。 Bootloader的地址:在嵌入式系統(tǒng)中,系統(tǒng)在上電或7幾種發(fā)布的Bootloader1、vivi vivi是韓國Mizi公司開發(fā)的Bootloader,適用于ARM9處理器。2、RedBootRedBoot即紅帽(RedHat)嵌入式調(diào)試引導(dǎo)程序,是一種用于嵌入式系統(tǒng)的獨立開放源代碼引導(dǎo)/裝載器。3、U-BootU-Boot(UniversalBootloader)由德國DENX小組開發(fā),是一款目前功能較為強大的開源Bootloader程序,它支持多種處理器平臺,包括ARM、PowerPC、MIPS等。幾種發(fā)布的Bootloader1、vivi vivi是韓國M86.1.2Bootloader操作模式 大多數(shù)Bootloader都有兩種不同的操作模式:“啟動加載”模式和“下載”模式。其區(qū)別對于開發(fā)人員才有意義。 從最終用戶的角度看,Bootloader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。6.1.2Bootloader操作模式 大多數(shù)Boot91、啟動加載(Bootloading)模式 啟動加載模式稱為“自舉”(Autonomous)模式。即Bootloader從目標(biāo)機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。 啟動加載模式是Bootloader的正常工作模式,在嵌入式產(chǎn)品發(fā)布的時侯,Bootloader必須工作在這種模式下。1、啟動加載(Bootloading)模式102、下載(Downloading)模式

下載方式:在這種模式下,目標(biāo)機上的Bootloader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機下載文件。

下載內(nèi)容及存儲:主要是下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標(biāo)機的RAM中,然后再被Bootloader寫到目標(biāo)機上的FLASH類固態(tài)存儲設(shè)備中。2、下載(Downloading)模式11

下載模式應(yīng)用場合:Bootloader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用到這種工作模式。

用戶應(yīng)用接口:工作于這種模式下的Bootloader通常都會向它的終端用戶提供一個簡單的命令行接口。如在RedBoot下,將出現(xiàn)“RedBoot>”提示符;在viviBootloader下出現(xiàn)“vivi>”提示符。 下載模式應(yīng)用場合:Bootloader的這種模式通常在第122、下載(Downloading)模式2、下載(Downloading)模式13RedBoot的Bootloader 像RedBoot或U-Boot等功能強大的Bootloader通常都可同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。 比如,RedBoot在啟動時處于正常的啟動加載模式,但是它會延時3秒等待終端用戶按下任意鍵而將RedBoot切換到下載模式。如在等待時間內(nèi)沒有接收到用戶按鍵,則繼續(xù)啟動Linux內(nèi)核。RedBoot的Bootloader146.1.3Bootloader啟動過程

Bootloader的啟動可以分為兩個階段

1、第一階段 階段1主要包含依賴于CPU體系結(jié)構(gòu)及硬件設(shè)備的初始化等。通常都用匯編語言來實現(xiàn)。這個階段的任務(wù)有5: (1)、基本的硬件設(shè)備初始化 這是Bootloader一開始就執(zhí)行的操作,其目的是為階段2的執(zhí)行、以及隨后kernel的執(zhí)行準(zhǔn)備好一些基本的硬件環(huán)境。6.1.3Bootloader啟動過程 Bootloa15

它通常包括以下工作:屏蔽所有的中斷、設(shè)置CPU的速度和時鐘頻率、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù)cache等。 它通常包括以下工作:屏蔽所有的中斷、設(shè)置CPU的速度16

(2)、為階段2代碼準(zhǔn)備RAM空間 為了獲得更快的執(zhí)行速度,通常把階段2的代碼加載到RAM空間中來執(zhí)行。 準(zhǔn)備RAM空間考慮的因素:階段2代碼大小、堆棧、頁大?。?KB的倍數(shù))、安排位置等。 總的空間有1MB足夠,安排在RAM的頂端較恰當(dāng)。 (2)、為階段2代碼準(zhǔn)備RAM空間17

(3)、拷貝階段2代碼到RAM空間 (4)、設(shè)置好堆棧 堆棧指針sp設(shè)置在1MB的RAM空間的最頂端(堆棧向下生長)。

(5)、跳轉(zhuǎn)到階段2的C程序入口點 在上述一切都就緒后,就可以跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行了。 (3)、拷貝階段2代碼到RAM空間18

Bootloader的階段2可執(zhí)行映像剛被拷貝到RAM空間時的系統(tǒng)內(nèi)存布局Bootloader的階段2可執(zhí)行映像剛被拷貝到RAM空間192、第二階段 階段2通常用C語言來實現(xiàn),以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個階段的主要任務(wù)有5:

(1)、初始化本階段要使用到的硬件 至少初始化一個串口,以便和終端用戶進行I/O輸出信息等。2、第二階段20

(2)、檢測系統(tǒng)內(nèi)存映射(memorymap) 所謂內(nèi)存映射,就是指在整個物理地址空間中有哪些地址范圍被分配用來作為系統(tǒng)的RAM單元。為后面使用RAM、運行程序做好準(zhǔn)備。 (3)、將kernel和根文件系統(tǒng)映像從flash讀到RAM空間 (2)、檢測系統(tǒng)內(nèi)存映射(memorymap)21

(4)、為kernel設(shè)置啟動參數(shù) 這是在調(diào)用內(nèi)核之前應(yīng)該做的準(zhǔn)備工作。Linux2.4.x以后的內(nèi)核都期望以標(biāo)記列表(taggedlist)的形式來傳遞啟動參數(shù)。 啟動參數(shù)標(biāo)記列表方法:以ATAG_CORE標(biāo)記開始,以ATAG_NONE標(biāo)記結(jié)束。 在嵌入式Linux系統(tǒng)中,通常需要由BootLoader設(shè)置的啟動參數(shù)有:ATAG_CORE、ATAG_MEM(內(nèi)存映射)、ATAG_NONE等。 (4)、為kernel設(shè)置啟動參數(shù)22

(5)、調(diào)用內(nèi)核 Bootloader調(diào)用Linuxkernel的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處。在跳轉(zhuǎn)時必須滿足下列條件: 1)、CPU寄存器的設(shè)置:R0為0;R1為機器類型ID;R2為啟動參數(shù),標(biāo)記列表在RAM中的起始基地址。(機器類型參見linux/arch/arm/tools/mach-types目錄) 2)、CPU模式:CPU必須設(shè)置為SVC模式,必須禁止中斷(IRQs和FIQs)。 3)、MMU和Cache的設(shè)置:MMU必須關(guān)閉;指令Cache可以打開也可以關(guān)閉;數(shù)據(jù)Cache必須關(guān)閉。 (5)、調(diào)用內(nèi)核236.1.4viviBootloader源碼分析

vivi是韓國Mizi公司開發(fā)的Bootloader,適用于ARM9處理器。 vivi有兩種工作模式,在啟動時可以選擇。在vivi啟動時,通過串行口發(fā)出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按回車鍵啟動LinuxOS,按其它鍵進入vivi命令接口模式,可以使用vivi提供的命令進行一些操作。6.1.4viviBootloader源碼分析 vi24一、vivi源代碼目錄結(jié)構(gòu) vivi源代碼包含的目錄有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目錄,共300多個文件。各個目錄內(nèi)容如下:

1、arch(architecture)目錄 它下面的文件為與CPU硬件相關(guān)的初始化代碼,此目錄包含了所用vivi支持的CPU。一般只包含S3C2410x的文件。一、vivi源代碼目錄結(jié)構(gòu)25

2、Documentation目錄 其下文件為vivi使用指南。

3、drivers目錄 存放的為MTD(數(shù)據(jù)存儲媒質(zhì))設(shè)備讀寫控制文件和串行口操作文件,對串行口支持xmodem和ymodem協(xié)議。

4、include目錄 存放所有的頭文件,包括S3C2410微處理器的和S3C2410開發(fā)板的頭文件。 2、Documentation目錄26

5、init目錄 該目錄下是系統(tǒng)初始化文件main.c、version.c,后者是vivi版本信息,main.c為vivi整個初始化的結(jié)構(gòu)。

6、lib目錄 該目錄下是公共應(yīng)用及接口代碼,如時鐘功能文件time.c,堆棧初始化文件heap.c等文件。

7、scripts目錄 該目錄存放的是系統(tǒng)配置需要的腳本文件,如menuconfig和configue文件。 5、init目錄27 8、CVS目錄 所有的目錄下面都有一個CVS目錄,存放的是該目錄的路徑和它的子目錄。 8、CVS目錄28

二、vivi源代碼文件與功能結(jié)構(gòu) vivi源代碼文件: 1、vivi/arch/s3c2410/head.s 2、一段過度,實現(xiàn)循環(huán)調(diào)用,main返回后重新復(fù)位 LDR SP, DW_STACK_START MOV FP, #0 MOV A2, #0 BL MAIN MOV PC, #FLASH_BASE 3、vivi/init/main.c 二、vivi源代碼文件與功能結(jié)構(gòu)296.1.5viviBootloader接口命令 vivi有兩種工作模式,一種是“啟動加載”模式,另一種是命令行模式。利用串行口與主機的連接,可以進行命令行操作。 vivi啟動后,通過串行口發(fā)出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按下除了“Enter”之外的鍵,便可進入命令行模式。 vivi的接口命令有5條。6.1.5viviBootloader接口命令 vi30

1、load---下載文件命令

功能:將二進制文件下載到Flash或RAM格式:load<media_type>[<partname>|<addr><size>]<x|y|z> media_type:存儲器類型,F(xiàn)lash或RAM partname:分區(qū)名稱 addrsize:下載的地址及占用空間大小 x|y|z:文件的傳輸協(xié)議。x表示采用xmodem協(xié)議,y表示采用ymodem協(xié)議,z表示采用zmodem協(xié)議。目前vivi僅支持xmodem協(xié)議。 1、load---下載文件命令31

例1:vivi>loadflashkernelx 表示下載壓縮的內(nèi)核映像文件zImage到flash存儲器的內(nèi)核分區(qū)中,采用xmodem傳輸協(xié)議。

例2:vivi>loadflash0x800000xc0000x嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件32 2、part---MTD分區(qū)操作命令

操作命令:顯示、增加、刪除、復(fù)位、保存MTD分區(qū)等。

各個命令格式: partshow:顯示分區(qū)信息 partdel<partname>:刪除指定的分區(qū) partreset:恢復(fù)分區(qū)的默認(rèn)值 partsave:在flash中保存分區(qū)和參數(shù)值 2、part---MTD分區(qū)操作命令33 增加新的分區(qū)partadd<partname><offset><size><flag>: partname:新分區(qū)名稱 offset:新分區(qū)的偏移地址 size:新分區(qū)的大小 flag:新分區(qū)的類型,可以是JFFS2、LOCKED、BONFS 增加新的分區(qū)34

3、param---設(shè)置或查看分區(qū)參數(shù)命令 查看分區(qū)參數(shù):paramshow 設(shè)置啟動等待按鍵延遲: paramsetboot_delayn(μs) 設(shè)置通信初始化超時:

paramsetxmodem_initial_timeoutm(μs) 3、param35

4、boot---引導(dǎo)內(nèi)核命令格式:boot[media_type][<partname>|<addr><size>] media_type:存儲器類型,flash或RAM partname:內(nèi)核所在分區(qū)名稱 addr:內(nèi)核所在器件的偏移地址 size:內(nèi)核的大小若 boot (無參數(shù)),則從kernel內(nèi)核對應(yīng)的分區(qū)中(kernel)讀取內(nèi)核映像啟動。 4、boot---引導(dǎo)內(nèi)核命令36 例如: 1、vivi>bootnand0x80000 內(nèi)核在nandflash中,偏移地址為0x80000,大小為缺省值0xc0000 2、vivi>bootnor0x80000 例如:37

5、flash---flash存儲器管理命令

擦除flash數(shù)據(jù)格式:flasherase[<partname>|<offset><size>] 說明: 對flash只有擦除命令。 例如: flasherase0x800000xc0000 5、flash---flash存儲器管理命令38vivi接口命令命令功能Load下載flash或RAM命令PartMTD分區(qū)操作命令param設(shè)置、查看參數(shù)命令Boot啟動系統(tǒng)命令flashFlash管理命令第三講到此vivi接口命令命令功能Load下載f396.1.6vivi源碼的修改移植 vivi的移植方法步驟: 對vivi進行修改移植 對vivi進行配置 對vivi進行編譯 下載、運行vivi

一、對vivi進行修改移植設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為 6.1.6vivi源碼的修改移植 vivi的移植方法步40 設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為:cygwin friendly-arm crosstool kernel vivi … 設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為:41

1、修改vivi/Makefile

(1)修改交叉編譯庫和頭文件

1)修改編譯器路徑:將: CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-修改為:CROSS_COMPILE=arm-linux-gcc的路徑 如: CROSS_COMPILE =/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux- 1、修改vivi/Makefile42

2)修改編譯器庫文件路徑:將: ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2修改為:

ARM_GCC_LIBS=符合本機的路徑如: ARM_GCC_LIBS=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/lib/gcc-lib/arm-linux/2.95.3

2)修改編譯器庫文件路徑:43

3)增加交叉編譯時頭文件的搜索路徑:

LIBC_INCLUDE_DIR=本機的include的路徑如:

LIBC_INCLUDE_DIR=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include 3)增加交叉編譯時頭文件的搜索路徑:44

(2)Linux內(nèi)核包含文件修改Linux頭文件所在路徑將:LINUX_INCLUDE_DIR=/opt/host/armv4l/include改為:

LINUX_INCLUDE_DIR=符合本機的如: LINUX_INCLUDE_DIR=/friendly-arm/kernel/include (2)Linux內(nèi)核包含文件45

2、修改vivi中與硬件相關(guān)的部分 只需要修改:/friendly-arm/vivi/include/platform/ 下面的文件smdk2410.h即可。 文件smdk2410.h的內(nèi)容是針對開發(fā)板的硬件配置的,主要有:時鐘設(shè)置、存儲器初始化、通用I/O口初始化、UART初始化、vivi初始配置等。 根據(jù)自己的目標(biāo)板的實際情況進行設(shè)置即可。

2、修改vivi中與硬件相關(guān)的部分46

3、支持NorFlash啟動的修改(vivi/arch/s3c2410/smdk.c)

(1)Norflash分區(qū) 對于一個嵌入式系統(tǒng),可能會采用Norflash、Nandflash、SDRAM等多種介質(zhì)構(gòu)成存儲器系統(tǒng),Norflash(如1、2MB)用于存放、運行bootloader,Nandflash用于存放操作系統(tǒng)、其它系統(tǒng)軟件、應(yīng)用程序和各種文件,SDRAM用于運行程序和存放數(shù)據(jù)。 如果系統(tǒng)有Norflash存儲器(一般沒有),則需要做相應(yīng)修改。 3、支持NorFlash啟動的修改47

修改方法:在vivi/arch/s3c2410/smdk.c中的分區(qū)代碼,添加上Norflash分區(qū):#ifdefCONFIG_S3C2410_AMD_BOOTmtd_partition_tdefault_mtd_partitions[]={ { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, 修改方法:在vivi/arch/s3c2410/smdk48 { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 },{ name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, {49 { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS }};#endif {50

(2)內(nèi)核啟動參數(shù)設(shè)置 經(jīng)過上面修改,系統(tǒng)板可以從Nandflash中啟動Linux,也可以從Norflash中啟動Linux,另外還需要修改啟動命令: (2)內(nèi)核啟動參數(shù)設(shè)置51 還需要修改啟動命令:#ifdefCONFIG_S3C2410_NAND_BOOTCharLinux_cmd[]=

"noinitrdroot=/dev/bon/2init=/linuxrc console=tty1 console=ttyS0";#elseCharLinux_cmd[]=

"noinitrdroot=/dev/mtdblock/3 init=/linuxrcconsole=tty1console=ttyS0"; 還需要修改啟動命令:52 式中啟動命令: noinitrd :不使用ramdisk; root :根文件系統(tǒng)所在的MTD分區(qū) init :內(nèi)核運行入口命令文件 console :內(nèi)核信息輸出控制臺 ttyS0表示串行口; tty0表示虛擬終端LCD。 說明: 關(guān)于Linux啟動命令的參數(shù),可以參考Kernel/Documentatio/下面的文件 kernel-parameters.txt。 式中啟動命令:53

4、增加一種下載操作loadflash<partname>j操作 在Nand啟動時,可以從JTAG下載程序到SDRAM(0x30000000),然后用“l(fā)oadflash<partname>j”來燒寫相應(yīng)的分區(qū),并且可以做vivi、kernel、root這3個分區(qū)的操作。其中大部分操作與使用X-Modem和Y-Modem等功能類似,所以命名為J-Modem,并特別修改以下3個部分。 4、增加一種下載操作54 (1)在vivi/include/priv_data.h中增加宏定義 原來為:#defineX_MODEM 1#defineY_MODEM 2#defineZ_MODEM 3

增加:#defineJTAG_D 4 (1)在vivi/include/priv_data.55 (2)在vivi/lib/load_file.c中增加對J-Modem的識別 原來為:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM; else returnUNKNOWN_MODEM; } (2)在vivi/lib/load_file.c中56 修改為:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM;

elseif(strncmp(“J",mt,1)==0) returnJTAG_D;

else returnUNKNOWN_MODEM; } 說明:該修改僅提高了下載到SDRAM的速度 修改為:57

二、對vivi進行配置 運行vivi配置程序menuconfig: make menuconfig 啟動對vivi配置的主菜單,根據(jù)自己的目標(biāo)系統(tǒng)逐項進行設(shè)置,設(shè)置完后退出保存即可。

二、對vivi進行配置58嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件59

三、對vivi進行編譯 在vivi目錄下執(zhí)行以下命令:

make clean make

makeclean是清除以前編譯時生成的所有目標(biāo)文件和臨時文件。 如果沒有錯誤,編譯后會生成vivi的目標(biāo)文件vivi.bin。 三、對vivi進行編譯60 四、對vivi進行下載 利用JTAG口將vivi下載到目標(biāo)板的Norflash空間(0x00000---0x20000)。 然后對目標(biāo)板加電,使vivi啟動運行,觀察運行情況。嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件616.2Linux內(nèi)核及移植本節(jié)內(nèi)容1、Linux內(nèi)核結(jié)構(gòu)2、Linux移植3、Linux編譯4、Linux下載6.2Linux內(nèi)核及移植本節(jié)內(nèi)容626.2.1Linux內(nèi)核結(jié)構(gòu)

一、Linux操作系統(tǒng)的移植性

Linux操作系統(tǒng)具有很好的移植性,能夠很方便地從一個硬件平臺移植到另一個硬件平臺上,其根本原因是Linux操作系統(tǒng)的代碼,將與硬件相關(guān)的代碼與硬件無關(guān)的代碼是分開編寫的。

Linux移植所涉及的文件:對Linux移植時,只需要修改與硬件相關(guān)的代碼即可,涉及的文件主要是各個目錄下的makefile文件,以及少數(shù)的匯編語言文件。6.2.1Linux內(nèi)核結(jié)構(gòu) 一、Linux操作系統(tǒng)的63

一、Linux內(nèi)核結(jié)構(gòu) Linux內(nèi)核有12個主目錄,700多個子目錄,文件總數(shù)11000多個,總長度120多MB。 Linux內(nèi)核的主目錄為:arch、drivers、fs、include、init、ipc、kernel、lib、mm、net、、

1、arch目錄 arch目錄包含了與硬件體系結(jié)構(gòu)相關(guān)的內(nèi)核代碼,其下面的每一個目錄都是一種硬件平臺,如ARM和PC機的i386。對于每一平 一、Linux內(nèi)核結(jié)構(gòu)64 臺都包含以下幾個目錄。 boot :與平臺相關(guān)的啟動內(nèi)核代碼 kernel :與平臺相關(guān)的內(nèi)核代碼 lib :與平臺相關(guān)的通用函數(shù) mm :與平臺相關(guān)的內(nèi)存管理代碼 math-emu :與平臺相關(guān)的模擬FPU代碼 顯然,內(nèi)核移植的重點就是該目錄下面的文件。

2、drivers目錄 該目錄下面保存的是所用設(shè)備的驅(qū)動程序,其下的每個目錄是一種設(shè)備。 臺都包含以下幾個目錄。65

3、fs目錄 該目錄下面列出了Linux所支持的文件系統(tǒng),其下每個目錄代表一種文件系統(tǒng),文件系統(tǒng)代碼與平臺無關(guān)。

4、include目錄 該目錄下面是編譯內(nèi)核所需要的頭文件,與平臺無關(guān)的部分在linux子目錄下面,其余的子目錄都是與各種平臺相關(guān)的頭文件。 5、init目錄 其下只有兩個文件:main.c和version.c,前者是核心的初始化代碼,后者是版本信息 3、fs目錄66

6、ipc目錄 其文件是核心進程的通信代碼。

7、kernel目錄 為與平臺無關(guān)的內(nèi)核管理代碼,與平臺相關(guān)部分在arch/***/kernel下面。

8、lib目錄 該目錄下面的文件是與平臺無關(guān)的通用函數(shù)。

9、mm目錄 該目錄下面的文件是與平臺無關(guān)的內(nèi)存管理代碼,與平臺相關(guān)部分在arch/***/mm下面。 6、ipc目錄67 10、net目錄 是網(wǎng)絡(luò)功能代碼,其每個子目錄對應(yīng)網(wǎng)絡(luò)的一個方面。 11、其它目錄 Documentation目錄下存放的是說明和應(yīng)用文檔,scripts目錄下存放的是配置內(nèi)核腳本。 另外在每個目錄下幾乎都有一個depend文件和Makefile文件,depend是被包含在Makefile中的,編譯目標(biāo)所依賴的頭文件。

10、net目錄686.2.2Linux移植 對于后面的移植,假設(shè)內(nèi)核的目錄為/my-arm/kernel,并且設(shè)環(huán)境變量為$KERNELCODE=/my-arm/kernel。

一、/my-arm/kernel---根目錄 根目錄下只需要修改Makefile文件。該文件的任務(wù)有兩個:產(chǎn)生Linux內(nèi)核鏡像壓縮文件vmlinux和內(nèi)核模塊,Makefile遞歸進入到各個子目錄中,調(diào)用子目錄中的Makefile最終產(chǎn)生出目標(biāo)文件。6.2.2Linux移植 對于后面的移植,假設(shè)內(nèi)核的目69 需要修改的內(nèi)容:

(1)指定目標(biāo)平臺:將: ARCH:=$(shelluname–m|sed–es/i.86/i.386……修改為: ARCH:=arm

(2)指定交叉編譯器將: CROSS_COMPILE=修改為: CROSS_COMPILE=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux- 需要修改的內(nèi)容:70

(3)修改TOPDIR將: TOPDIR:=$(shellbin/pwd)修改為: TOPDIR:=$(/my-arm/kernel)

(4)修改export INSTALL_MOD_PATH將: INSTALL_MOD_PATH=/root修改為: INSTALL_MOD_PATH =/my-arm/kernel/arch/arm/root (3)修改TOPDIR71

二、arch/arm目錄

1、對Makefile文件的修改 ifeq($(CONFIG_ARCH_S3C2410),y) TEXTADDR = 0xC0008000 MACHINE = s3c2410 endif

TEXTADDR決定內(nèi)核起始運行地址,即image.ram應(yīng)下載的位置,其值與具體目標(biāo)板有關(guān)。 0xC0008000的含義:從地址0xC0000000開始,共有32MB空間。 二、arch/arm目錄72

2、對config.in文件的修改 config.in是配置文件,運行menuconfig時出現(xiàn)的菜單就是config.in的內(nèi)容。因為2.4.18內(nèi)核沒有中沒有S3C2410x處理器的信息,所以需要加入相關(guān)信息。

(1)添加CONFIG_ARCH_S3C2410子選項

修改后為:

if[“$CONFIG_ARCH_S3C2410”=“y”];thencomment’S3C2410Implementation’dep_bool‘SMDK(MERITECHBOARD)’CONFIG_S3C2410_SMCK$CONFIG_ARCH_S3C2410fi 2、對config.in文件的修改73

(2)其它選項 在: if[“$CONFIG_FOOTBRIDGE_HOST”=“y”–o\ …… “$CONFIG_ARCH_SA1100”=“y”];then中間添加: “$CONFIG_ARCH_S3C410”=“y”–o\ (2)其它選項74

三、arch/arm/boot目錄

1、Makefile文件需要考慮修改的內(nèi)容 ifeq($(CONFIG_ARCH_S3C2410),y)

ZTEXTADDR =

0x30008000

ZRELADDR =

0x30208000 endif

ZRELADDR為內(nèi)核解壓后輸出的地址。ZTEXTADDR為Boorloader執(zhí)行的起始地址,若直接啟動執(zhí)行,則設(shè)為0,否則為裝入RAM中的開始地址。 這兩個地址由具體的目標(biāo)板決定。隨目標(biāo)變化隨目標(biāo)板變化 三、arch/arm/boot目錄隨目標(biāo)變化隨目標(biāo)板變化75 2、compressed/Makefile修改后: ifeq($(CONFIG_ARCH_S3C2410),y) OBJS +=head-s3c2410.o endif 加入head-s3c2410.o 3、compressed/head-s3c2410.S 這是新加入的文件 2、compressed/Makefile76#include<linux/config.h>#include<linux/linkage.h>#include<asm/mach-types.h> .section ".start",#alloc,#execinstr__S3C2410_start: bic r2,pc,#0x1f addr3,r2,#0x4000 @16kbisquiteenough...1: ldrr0,[r2],#32 teq r2,r3 bne 1b mcr p15,0,r0,c7,c10,4 @drainWB mcr p15,0,r0,c7,c7,0 @flushI&Dcaches#include<linux/config.h>77#if0 @disablingMMUandcaches mrc p15,0,r0,c1,c0,0 @readcontrolregister bic r0,r0,#0x05 @disableDcacheandMMU bicr0,r0,#1000 @disableIcache mcrp15,0,r0,c1,c0,0#endif#if078

mov r0,#0x002000001: subs r0,r0,#1 bne 1b mov r0,#0x00200000796.2.3Linux編譯 Linux內(nèi)核的編譯需要以下三步操作。

一、配置內(nèi)核 可以執(zhí)行以下幾個命令:

make config make menuconfig make xconfig

make oldconfig makeconfig命令在文本方式界面下進行配置

make menuconfig命令在菜單界面下進行配置 make xconfig命令在圖形界面下進行配置6.2.3Linux編譯 Linux內(nèi)核的編譯需要以下80 配置過程共130多個選項。 配置完成后會生成.config文件,并且在include/linux/目錄下生成一個自動配置文件autoconf.h,保存配置信息,下次配置產(chǎn)生新的.config和autoconf.h文件,原來的.config被更名為.config.old。

二、創(chuàng)建內(nèi)核的依賴關(guān)系 命令:

make dep 該命令搜索Linux編譯輸出與源代碼頭文件之間的依賴關(guān)系,并生成依賴文件。 配置過程共130多個選項。81

三、編譯內(nèi)核

make clean make zImage make modules make modules_install makeclean是清除以前構(gòu)造內(nèi)核時生成的所有目標(biāo)文件、模塊文件和臨時文件。 makezImage是編譯內(nèi)核,生成壓縮的內(nèi)核映像文件,存放在/arch/arm/boot目錄下。 Makemodules是創(chuàng)建內(nèi)核模塊。 Makemodules_install是創(chuàng)建內(nèi)核模塊安裝信息文件。 三、編譯內(nèi)核826.3嵌入式應(yīng)用程序開發(fā)過程 需要以下幾個步驟。

一、編寫源程序 如編寫一個“hello.c”程序,在Linux下、用編輯軟件vim進行編輯,源程序為: #include <stdio.h> int main() { printf(“Helloworld!\n”); }6.3嵌入式應(yīng)用程序開發(fā)過程 需要以下幾個步驟。83

二、編譯程序 在Linux下,用交叉編譯軟件對“hello.c”進行編譯,命令為: arm-linux-gcc–ohellohello.c 生成在ARM下運行的可執(zhí)行文件hello.exe

三、下載程序 通過vivi或網(wǎng)絡(luò)下載程序。 二、編譯程序84作業(yè)P25210、12、14作業(yè)85嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件86嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件87嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件88嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件89嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件90嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件91嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件92嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件93嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件94嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件95嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件96嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件97嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件98嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件99嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件100嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件101嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件102嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件103嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件104嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件105嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件106嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件107嵌入式系統(tǒng)講義

第6章嵌入式系統(tǒng)軟件移植與Linux下程序開發(fā)周國運2007.9嵌入式系統(tǒng)講義

第6章嵌入式系統(tǒng)軟件移植與Linux下108本章主要內(nèi)容1、Bootloader及vivi移植2、嵌入式Linux內(nèi)核及移植3、基于Linux的應(yīng)用程序開發(fā)4、基于Linux的驅(qū)動程序開發(fā)5、驅(qū)動程序開發(fā)實例本章主要內(nèi)容1、Bootloader及vivi移植1096.1Bootloader及vivi移植本節(jié)內(nèi)容1、Bootloader簡介2、Bootloader工作模式3、Bootloader啟動過程4、viviBootloader源代碼分析5、viviBootloader接口命令6、vivi源代碼修改移植6.1Bootloader及vivi移植本節(jié)內(nèi)容110建立交叉編譯環(huán)境Bootloader的/移植/配置/編譯kernel的移植/配置/編譯根文件系統(tǒng)Cramfs的實現(xiàn)嵌入式系統(tǒng)軟件開發(fā)流程用戶應(yīng)用程序開發(fā)建立交叉編譯環(huán)境Bootloader的/移植/配置/編譯ke1116.1.1Bootloader簡介

Bootloader,為引導(dǎo)加載程序,是嵌入式系統(tǒng)加電后運行的第一段代碼,相當(dāng)于PC機的BIOS。

Bootloader的位置:通常固化在硬件上的某個固態(tài)存儲設(shè)備上,加電后自啟動。

Bootloader功能:初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,將系統(tǒng)的軟、硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。6.1.1Bootloader簡介 Bootloade112 Bootloader在軟件的層次位置 Bootloader在軟件的層次位置113

Bootloader的地址:在嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時從地址0x0000,0000處開始執(zhí)行,在這個地址處安排的就是Bootloader。

Bootloader是嚴(yán)重地依賴于硬件而實現(xiàn)的。每種不同體系結(jié)構(gòu)的處理器都有不同的Bootloader。不過Bootloader的發(fā)展也趨于支持多種體系結(jié)構(gòu),如現(xiàn)在比較成熟的vivi、RedBoot和U-Boot等。 Bootloader的地址:在嵌入式系統(tǒng)中,系統(tǒng)在上電或114幾種發(fā)布的Bootloader1、vivi vivi是韓國Mizi公司開發(fā)的Bootloader,適用于ARM9處理器。2、RedBootRedBoot即紅帽(RedHat)嵌入式調(diào)試引導(dǎo)程序,是一種用于嵌入式系統(tǒng)的獨立開放源代碼引導(dǎo)/裝載器。3、U-BootU-Boot(UniversalBootloader)由德國DENX小組開發(fā),是一款目前功能較為強大的開源Bootloader程序,它支持多種處理器平臺,包括ARM、PowerPC、MIPS等。幾種發(fā)布的Bootloader1、vivi vivi是韓國M1156.1.2Bootloader操作模式 大多數(shù)Bootloader都有兩種不同的操作模式:“啟動加載”模式和“下載”模式。其區(qū)別對于開發(fā)人員才有意義。 從最終用戶的角度看,Bootloader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。6.1.2Bootloader操作模式 大多數(shù)Boot1161、啟動加載(Bootloading)模式 啟動加載模式稱為“自舉”(Autonomous)模式。即Bootloader從目標(biāo)機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。 啟動加載模式是Bootloader的正常工作模式,在嵌入式產(chǎn)品發(fā)布的時侯,Bootloader必須工作在這種模式下。1、啟動加載(Bootloading)模式1172、下載(Downloading)模式

下載方式:在這種模式下,目標(biāo)機上的Bootloader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機下載文件。

下載內(nèi)容及存儲:主要是下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標(biāo)機的RAM中,然后再被Bootloader寫到目標(biāo)機上的FLASH類固態(tài)存儲設(shè)備中。2、下載(Downloading)模式118

下載模式應(yīng)用場合:Bootloader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用到這種工作模式。

用戶應(yīng)用接口:工作于這種模式下的Bootloader通常都會向它的終端用戶提供一個簡單的命令行接口。如在RedBoot下,將出現(xiàn)“RedBoot>”提示符;在viviBootloader下出現(xiàn)“vivi>”提示符。 下載模式應(yīng)用場合:Bootloader的這種模式通常在第1192、下載(Downloading)模式2、下載(Downloading)模式120RedBoot的Bootloader 像RedBoot或U-Boot等功能強大的Bootloader通常都可同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。 比如,RedBoot在啟動時處于正常的啟動加載模式,但是它會延時3秒等待終端用戶按下任意鍵而將RedBoot切換到下載模式。如在等待時間內(nèi)沒有接收到用戶按鍵,則繼續(xù)啟動Linux內(nèi)核。RedBoot的Bootloader1216.1.3Bootloader啟動過程

Bootloader的啟動可以分為兩個階段

1、第一階段 階段1主要包含依賴于CPU體系結(jié)構(gòu)及硬件設(shè)備的初始化等。通常都用匯編語言來實現(xiàn)。這個階段的任務(wù)有5: (1)、基本的硬件設(shè)備初始化 這是Bootloader一開始就執(zhí)行的操作,其目的是為階段2的執(zhí)行、以及隨后kernel的執(zhí)行準(zhǔn)備好一些基本的硬件環(huán)境。6.1.3Bootloader啟動過程 Bootloa122

它通常包括以下工作:屏蔽所有的中斷、設(shè)置CPU的速度和時鐘頻率、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù)cache等。 它通常包括以下工作:屏蔽所有的中斷、設(shè)置CPU的速度123

(2)、為階段2代碼準(zhǔn)備RAM空間 為了獲得更快的執(zhí)行速度,通常把階段2的代碼加載到RAM空間中來執(zhí)行。 準(zhǔn)備RAM空間考慮的因素:階段2代碼大小、堆棧、頁大?。?KB的倍數(shù))、安排位置等。 總的空間有1MB足夠,安排在RAM的頂端較恰當(dāng)。 (2)、為階段2代碼準(zhǔn)備RAM空間124

(3)、拷貝階段2代碼到RAM空間 (4)、設(shè)置好堆棧 堆棧指針sp設(shè)置在1MB的RAM空間的最頂端(堆棧向下生長)。

(5)、跳轉(zhuǎn)到階段2的C程序入口點 在上述一切都就緒后,就可以跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行了。 (3)、拷貝階段2代碼到RAM空間125

Bootloader的階段2可執(zhí)行映像剛被拷貝到RAM空間時的系統(tǒng)內(nèi)存布局Bootloader的階段2可執(zhí)行映像剛被拷貝到RAM空間1262、第二階段 階段2通常用C語言來實現(xiàn),以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個階段的主要任務(wù)有5:

(1)、初始化本階段要使用到的硬件 至少初始化一個串口,以便和終端用戶進行I/O輸出信息等。2、第二階段127

(2)、檢測系統(tǒng)內(nèi)存映射(memorymap) 所謂內(nèi)存映射,就是指在整個物理地址空間中有哪些地址范圍被分配用來作為系統(tǒng)的RAM單元。為后面使用RAM、運行程序做好準(zhǔn)備。 (3)、將kernel和根文件系統(tǒng)映像從flash讀到RAM空間 (2)、檢測系統(tǒng)內(nèi)存映射(memorymap)128

(4)、為kernel設(shè)置啟動參數(shù) 這是在調(diào)用內(nèi)核之前應(yīng)該做的準(zhǔn)備工作。Linux2.4.x以后的內(nèi)核都期望以標(biāo)記列表(taggedlist)的形式來傳遞啟動參數(shù)。 啟動參數(shù)標(biāo)記列表方法:以ATAG_CORE標(biāo)記開始,以ATAG_NONE標(biāo)記結(jié)束。 在嵌入式Linux系統(tǒng)中,通常需要由BootLoader設(shè)置的啟動參數(shù)有:ATAG_CORE、ATAG_MEM(內(nèi)存映射)、ATAG_NONE等。 (4)、為kernel設(shè)置啟動參數(shù)129

(5)、調(diào)用內(nèi)核 Bootloader調(diào)用Linuxkernel的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處。在跳轉(zhuǎn)時必須滿足下列條件: 1)、CPU寄存器的設(shè)置:R0為0;R1為機器類型ID;R2為啟動參數(shù),標(biāo)記列表在RAM中的起始基地址。(機器類型參見linux/arch/arm/tools/mach-types目錄) 2)、CPU模式:CPU必須設(shè)置為SVC模式,必須禁止中斷(IRQs和FIQs)。 3)、MMU和Cache的設(shè)置:MMU必須關(guān)閉;指令Cache可以打開也可以關(guān)閉;數(shù)據(jù)Cache必須關(guān)閉。 (5)、調(diào)用內(nèi)核1306.1.4viviBootloader源碼分析

vivi是韓國Mizi公司開發(fā)的Bootloader,適用于ARM9處理器。 vivi有兩種工作模式,在啟動時可以選擇。在vivi啟動時,通過串行口發(fā)出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按回車鍵啟動LinuxOS,按其它鍵進入vivi命令接口模式,可以使用vivi提供的命令進行一些操作。6.1.4viviBootloader源碼分析 vi131一、vivi源代碼目錄結(jié)構(gòu) vivi源代碼包含的目錄有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目錄,共300多個文件。各個目錄內(nèi)容如下:

1、arch(architecture)目錄 它下面的文件為與CPU硬件相關(guān)的初始化代碼,此目錄包含了所用vivi支持的CPU。一般只包含S3C2410x的文件。一、vivi源代碼目錄結(jié)構(gòu)132

2、Documentation目錄 其下文件為vivi使用指南。

3、drivers目錄 存放的為MTD(數(shù)據(jù)存儲媒質(zhì))設(shè)備讀寫控制文件和串行口操作文件,對串行口支持xmodem和ymodem協(xié)議。

4、include目錄 存放所有的頭文件,包括S3C2410微處理器的和S3C2410開發(fā)板的頭文件。 2、Documentation目錄133

5、init目錄 該目錄下是系統(tǒng)初始化文件main.c、version.c,后者是vivi版本信息,main.c為vivi整個初始化的結(jié)構(gòu)。

6、lib目錄 該目錄下是公共應(yīng)用及接口代碼,如時鐘功能文件time.c,堆棧初始化文件heap.c等文件。

7、scripts目錄 該目錄存放的是系統(tǒng)配置需要的腳本文件,如menuconfig和configue文件。 5、init目錄134 8、CVS目錄 所有的目錄下面都有一個CVS目錄,存放的是該目錄的路徑和它的子目錄。 8、CVS目錄135

二、vivi源代碼文件與功能結(jié)構(gòu) vivi源代碼文件: 1、vivi/arch/s3c2410/head.s 2、一段過度,實現(xiàn)循環(huán)調(diào)用,main返回后重新復(fù)位 LDR SP, DW_STACK_START MOV FP, #0 MOV A2, #0 BL MAIN MOV PC, #FLASH_BASE 3、vivi/init/main.c 二、vivi源代碼文件與功能結(jié)構(gòu)1366.1.5viviBootloader接口命令 vivi有兩種工作模式,一種是“啟動加載”模式,另一種是命令行模式。利用串行口與主機的連接,可以進行命令行操作。 vivi啟動后,通過串行口發(fā)出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按下除了“Enter”之外的鍵,便可進入命令行模式。 vivi的接口命令有5條。6.1.5viviBootloader接口命令 vi137

1、load---下載文件命令

功能:將二進制文件下載到Flash或RAM格式:load<media_type>[<partname>|<addr><size>]<x|y|z> media_type:存儲器類型,F(xiàn)lash或RAM partname:分區(qū)名稱 addrsize:下載的地址及占用空間大小 x|y|z:文件的傳輸協(xié)議。x表示采用xmodem協(xié)議,y表示采用ymodem協(xié)議,z表示采用zmodem協(xié)議。目前vivi僅支持xmodem協(xié)議。 1、load---下載文件命令138

例1:vivi>loadflashkernelx 表示下載壓縮的內(nèi)核映像文件zImage到flash存儲器的內(nèi)核分區(qū)中,采用xmodem傳輸協(xié)議。

例2:vivi>loadflash0x800000xc0000x嵌入式系統(tǒng)講義嵌入式系統(tǒng)軟件移植與Linux下程課件139 2、part---MTD分區(qū)操作命令

操作命令:顯示、增加、刪除、復(fù)位、保存MTD分區(qū)等。

各個命令格式: partshow:顯示分區(qū)信息 partdel<partname>:刪除指定的分區(qū) partreset:恢復(fù)分區(qū)的默認(rèn)值 partsave:在flash中保存分區(qū)和參數(shù)值 2、part---MTD分區(qū)操作命令140 增加新的分區(qū)partadd<partname><offset><size><flag>: partname:新分區(qū)名稱 offset:新分區(qū)的偏移地址 size:新分區(qū)的大小 flag:新分區(qū)的類型,可以是JFFS2、LOCKED、BONFS 增加新的分區(qū)141

3、param---設(shè)置或查看分區(qū)參數(shù)命令 查看分區(qū)參數(shù):paramshow 設(shè)置啟動等待按鍵延遲: paramsetboot_delayn(μs) 設(shè)置通信初始化超時:

paramsetxmodem_initial_timeoutm(μs) 3、param142

4、boot---引導(dǎo)內(nèi)核命令格式:boot[media_type][<partname>|<addr><size>] media_type:存儲器類型,flash或RAM partname:內(nèi)核所在分區(qū)名稱 addr:內(nèi)核所在器件的偏移地址 size:內(nèi)核的大小若 boot (無參數(shù)),則從kernel內(nèi)核對應(yīng)的分區(qū)中(kernel)讀取內(nèi)核映像啟動。 4、boot---引導(dǎo)內(nèi)核命令143 例如: 1、vivi>bootnand0x80000 內(nèi)核在nandflash中,偏移地址為0x80000,大小為缺省值0xc0000 2、vivi>bootnor0x80000 例如:144

5、flash---flash存儲器管理命令

擦除flash數(shù)據(jù)格式:flasherase[<partname>|<offset><size>] 說明: 對flash只有擦除命令。 例如: flasherase0x800000xc0000 5、flash---flash存儲器管理命令145vivi接口命令命令功能Load下載flash或RAM命令PartMTD分區(qū)操作命令param設(shè)置、查看參數(shù)命令Boot啟動系統(tǒng)命令flashFlash管理命令第三講到此vivi接口命令命令功能Load下載f1466.1.6vivi源碼的修改移植 vivi的移植方法步驟: 對vivi進行修改移植 對vivi進行配置 對vivi進行編譯 下載、運行vivi

一、對vivi進行修改移植設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為 6.1.6vivi源碼的修改移植 vivi的移植方法步147 設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為:cygwin friendly-arm crosstool kernel vivi … 設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為:148

1、修改vivi/Makefile

(1)修改交叉編譯庫和頭文件

1)修改編譯器路徑:將: CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-修改為:CROSS_COMPILE=arm-linux-gcc的路徑 如: CROSS_COMPILE =/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux- 1、修改vivi/Makefile149

2)修改編譯器庫文件路徑:將: ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2修改為:

ARM_GCC_LIBS=符合本機的路徑如: ARM_GCC_LIBS=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/lib/gcc-lib/arm-linux/2.95.3

2)修改編譯器庫文件路徑:150

3)增加交叉編譯時頭文件的搜索路徑:

LIBC_INCLUDE_DIR=本機的include的路徑如:

LIBC_INCLUDE_DIR=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include 3)增加交叉編譯時頭文件的搜索路徑:151

(2)Linux內(nèi)核包含文件修改Linux頭文件所在路徑將:LINUX_INCLUDE_DIR=/opt/host/armv4l/include改為:

LINUX_INCLUDE_DIR=符合本機的如: LINUX_INCLUDE_DIR=/friendly-arm/kernel/include (2)Linux內(nèi)核包含文件152

2、修改vivi中與硬件相關(guān)的部分 只需要修改:/friendly-arm/vivi/include/platform/ 下面的文件smdk2410.h即可。 文件smdk2410.h的內(nèi)容是針對開發(fā)板的硬件配置的,主要有:時鐘設(shè)置、存儲器初始化、通用I/O口初始化、UART初始化、vivi初始配置等。 根據(jù)自己的目標(biāo)板的實際情況進行設(shè)置即可。

2、修改vivi中與硬件相關(guān)的部分153

3、支持NorFlash啟動的修改(vivi/arch/s3c2410/smdk.c)

(1)Norflash分區(qū) 對于一個嵌入式系統(tǒng),可能會采用Norflash、Nandflash、SDRAM等多種介質(zhì)構(gòu)成存儲器系統(tǒng),Norflash(如1、2MB)用于存放、運行bootloader,Nandflash用于存放操作系統(tǒng)、其它系統(tǒng)軟件、應(yīng)用程序和各種文件,SDRAM用于運行程序和存放數(shù)據(jù)。 如果系統(tǒng)有Norflash存儲器(一般沒有),則需要做相應(yīng)修改。 3、支持NorFlash啟動的修改154

修改方法:在vivi/arch/s3c2410/smdk.c中的分區(qū)代碼,添加上Norflash分區(qū):#ifdefCONFIG_S3C2410_AMD_BOOTmtd_partition_tdefault_mtd_partitions[]={ { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, 修改方法:在vivi/arch/s3c2410/smdk155 { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 },{ name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, {156 { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS }};#endif {157

(2)內(nèi)核啟動參數(shù)設(shè)置 經(jīng)過上面修改,系統(tǒng)板可以從Nandflash中啟動Linux,也可以從Norflash中啟動Linux,另外還需要修改啟動命令: (2)內(nèi)核啟動參數(shù)設(shè)置158 還需要修改啟動命令:#ifdefCONFIG_S3C2410_NAND_BOOTCharLinux_cmd[]=

"noinitrdroot=/dev/bon/2init=/linuxrc console=tty1 console=ttyS0";#elseCharLinux_cmd[]=

"noinitrdroot=/dev/mtdblock/3 init=/linuxrcconsole=tty1console=ttyS0"; 還需要修改啟動命令:159 式中啟動命令: noinitrd :不使用ramdisk; root :根文件系統(tǒng)所在的MTD分區(qū) init :內(nèi)核運行入口命令文件 console :內(nèi)核信息輸出控制臺 ttyS0表示串行口; tty0表示虛擬終端LCD。 說明: 關(guān)于Linux啟動命令的參數(shù),可以參考Kernel/Documentatio/下面的文件 kernel-parameters.txt。 式中啟動命令:160

4、增加一種下載操作loadflash<partname>j操作 在Nand啟動時,可以從JTAG下載程序到SDRAM(0x30000000),然后用“l(fā)oadflash<partname>j”來燒寫相應(yīng)的分區(qū),并且可以做vivi、kernel、root這3個分區(qū)的操作。其中大部分操作與使用X-Modem和Y-Modem等功能類似,所以命名為J-Modem,并特別修改以下3個部分。 4、增加一種下載操作161 (1)在vivi/include/priv_data.h中增加宏定義 原來為:#defineX_MODEM 1#defineY_MODEM 2#defineZ_MODEM 3

增加:#defineJTAG_D 4 (1)在vivi/include/priv_data.162 (2)在vivi/lib/load_file.c中增加對J-Modem的識別 原來為:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM; else returnUNKNOWN_MODEM; } (2)在vivi/lib/load_file.c中163 修改為:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM;

elseif(strncmp(“J",mt,1)==0) returnJTAG_D;

else returnUNKNOWN_MODEM; } 說明:該修改僅提高了下載到SDRAM的速度 修改為:164

二、對vivi進行配置 運行vivi配置程序menuconfig: make menuconfig 啟動對vivi配置的主菜單,根據(jù)自己的目標(biāo)系統(tǒng)逐項

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論