linux交叉編譯環(huán)境_第1頁(yè)
linux交叉編譯環(huán)境_第2頁(yè)
linux交叉編譯環(huán)境_第3頁(yè)
linux交叉編譯環(huán)境_第4頁(yè)
linux交叉編譯環(huán)境_第5頁(yè)
已閱讀5頁(yè),還剩105頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式Linux開發(fā)環(huán)境的構(gòu)建主要介紹如何構(gòu)建嵌入式Linux的開發(fā)環(huán)境,包括:

1.創(chuàng)建交叉編譯工具2.Linux內(nèi)核的移植

3.根文件系統(tǒng)的制作4.Bootloader的移植1第一頁(yè),共一百一十頁(yè)。商用嵌入式LINUXARMIRIX

Embedded

Linux--derived

form

DebianCoollogic

Coollinux--combines

Linux

and

JavaCoventive

Xlinux--kernel

can

be

as

small

as

142kbEsfia

Redblue

Linux--400k,

designed

for

wireless

apps2第二頁(yè),共一百一十頁(yè)。商用嵌入式LINUXKYZO

Pizza

Box

Linux--Samba

based

file,

print,CD

serverLineo

Embedix--supports

realtime

and

high

availability

appsLynuxWorks

BlueCat--general

purpose

embedded

solutionsMonta

Vista

Linux--

general

purpose

embedded

solutions3第三頁(yè),共一百一十頁(yè)。商用嵌入式LINUXNeoware

NeoLinuxRed

Hat

derived

for

information

appliancesPalmPalm

TynuxInternet

appliance

and

multimediaRed

Hat

Embedded

Linuxgeneral

purpose

embedded

solutionRed

Sonic

Red-Ice

Linuxruns

from

DiskonChip

or

CompactFlash4第四頁(yè),共一百一十頁(yè)。商用嵌入式LINUXRidgeRun

DSP

Linuxfor

multimedia,

wireless,

RT

on

DSPTimeSys

Linux

GPLlow

latency

enhanced

kernelTuxia

TASTEdistro

targets

Internet

appliancesVital

Systems

vLinuxfor

ARM

based

embedded

apps5第五頁(yè),共一百一十頁(yè)。開源嵌入式LinuxEmbedded

Debian

Project--–

convert

Debian

to

an

embedded

OSETLinuxfor

PC104

SBC’suCLinuxfor

microprocessors

that

don’t

have

MMUuLinux

(muLinux)distro

fits

on

a

single

floppy6第六頁(yè),共一百一十頁(yè)。Linux如何做到實(shí)時(shí)?7第七頁(yè),共一百一十頁(yè)。Linux如何做到實(shí)時(shí)?8第八頁(yè),共一百一十頁(yè)。Linux支持的CPUIntel

X86MIPSARMStrongARMPowerPCHitachi

SuperH9第九頁(yè),共一百一十頁(yè)。嵌入式系統(tǒng)的開發(fā)模式本機(jī)開發(fā):在目標(biāo)機(jī)中直接進(jìn)行操作系統(tǒng)移植及應(yīng)用程序的開發(fā)。在這種方式下進(jìn)行開發(fā),首先就得在目標(biāo)機(jī)中安裝操作系統(tǒng),并且具有良好的人機(jī)開發(fā)界面。但是由于一般的嵌入式系統(tǒng)都是資源受限系統(tǒng),如內(nèi)、外存儲(chǔ)空間小,CPU處理速度不夠快等,在這樣的環(huán)境下進(jìn)行嵌入式linux的開發(fā)必然會(huì)影響到系統(tǒng)的成本以及開發(fā)速度,所以多數(shù)情況下都不采用這種開發(fā)方式。10第十頁(yè),共一百一十頁(yè)。嵌入式系統(tǒng)的開發(fā)模式交叉開發(fā):在一臺(tái)主機(jī)上進(jìn)行操作系統(tǒng)的裁剪,以及編寫應(yīng)用程序,在主機(jī)上應(yīng)用交叉編譯環(huán)境編譯內(nèi)核及應(yīng)用程序,然后把目標(biāo)代碼下載到目標(biāo)機(jī)上運(yùn)行。這就需要在主機(jī)上安裝、配置交叉編譯環(huán)境(交叉開發(fā)工具鏈),使其能夠編譯成在目標(biāo)機(jī)上運(yùn)行的目標(biāo)代碼。11第十一頁(yè),共一百一十頁(yè)。嵌入式系統(tǒng)的開發(fā)模式模擬開發(fā):建立在交叉開發(fā)環(huán)境基礎(chǔ)之上。除了主機(jī)和目標(biāo)機(jī)以外,還得提供一個(gè)在主機(jī)上模擬目標(biāo)機(jī)的環(huán)境,這就不需要每次的修改都下載到目標(biāo)機(jī)中,待程序正確后再下載到目標(biāo)機(jī)上運(yùn)行。這樣就可以達(dá)到在沒有目標(biāo)機(jī)的情況下調(diào)試軟件的目的。比較著名的模擬開發(fā)環(huán)境有SkyEye,能夠模擬如ARM等處理器的開發(fā)環(huán)境。模擬硬件環(huán)境是一件比較復(fù)雜的工程,所以多數(shù)商業(yè)嵌入式系統(tǒng)的開發(fā)采用的是交叉開發(fā)模式。12第十二頁(yè),共一百一十頁(yè)。開發(fā)平臺(tái)的選擇Linux作為開發(fā)平臺(tái)選擇Linux作為編譯及編譯的平臺(tái),這需要在Linux平臺(tái)上安裝交叉編譯環(huán)境,然后直接在Linux平臺(tái)上直接進(jìn)行開發(fā),使用Linux的文本編輯器vi或emacs來修改操作系統(tǒng)內(nèi)核代碼,編寫應(yīng)用程序,并使用Linux下的Minicom作為串口控制臺(tái),與目標(biāo)機(jī)器進(jìn)行通信。13第十三頁(yè),共一百一十頁(yè)。開發(fā)平臺(tái)的選擇Windows作為開發(fā)平臺(tái)選擇Windows作為開發(fā)平臺(tái),可以使用自己熟悉的文本編輯器來書寫源代碼,但需要安裝cgywin軟件用來提供Windows下的Linux開發(fā)環(huán)境,同時(shí)還要安裝適用于cygwin的交叉開發(fā)環(huán)

境,或能夠自己編譯出cygwin下的交叉開發(fā)工具。這種開發(fā)環(huán)境下,可以使用Windows下的串口控制臺(tái)軟件與目標(biāo)機(jī)器進(jìn)行

通信。14第十四頁(yè),共一百一十頁(yè)。開發(fā)平臺(tái)的選擇Linux服務(wù)器,Windows工作站的開發(fā)方式–如果習(xí)慣了Windows的操作,或在開發(fā)的同時(shí)還要使用Windows的其他軟件,但又只習(xí)慣Linux下的交叉開發(fā)工具鏈,還有一種方式:搭建一個(gè)Linux服務(wù)器,在上邊運(yùn)行telnet和ftp服務(wù),在Windows工作站上用telnet客戶端和ftp工具遠(yuǎn)程登陸到Linux服務(wù)器來開發(fā)。15第十五頁(yè),共一百一十頁(yè)。1.

創(chuàng)建交叉編譯工具由于一般嵌入式開發(fā)系統(tǒng)存儲(chǔ)大小有限,通常要在pc機(jī)上建立一個(gè)用于目標(biāo)機(jī)的交叉編譯環(huán)境。這是一個(gè)由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境。交叉編譯工具包括:Binutils—用于操作二進(jìn)制文件的實(shí)用程序集合。包括諸如ar、as、objdump、objcopy

這樣的實(shí)用程序。Gcc—GNU

C

編譯器。Glibc—所有用戶應(yīng)用程序都將鏈接到的C

庫(kù)。避免使用任何C

庫(kù)函數(shù)的內(nèi)核和 其它應(yīng)用程序可以在沒有該庫(kù)的情況下進(jìn)行編譯。16第十六頁(yè),共一百一十頁(yè)。1.創(chuàng)建交叉編譯工具(cont.)創(chuàng)建交叉編譯工具的一般步驟:1.下載源文件、補(bǔ)丁和建立編譯環(huán)境

a)下載源文件linux內(nèi)核源碼及相應(yīng)的補(bǔ)丁binutils-2.10.1gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3b)建立工作目錄,設(shè)置環(huán)境變量,安裝Linux頭文件。17第十七頁(yè),共一百一十頁(yè)。1.

創(chuàng)建交叉編譯工具(cont.)建立二進(jìn)制工具(binutils)binutils包中的工具常用來操作二進(jìn)制目標(biāo)文件。該包中最重要的兩個(gè)工具就是GNU匯編器as和鏈接器ld。創(chuàng)建初始編譯器(bootstrap

gcc)創(chuàng)建交叉編譯版本的Gcc,需要交叉編譯版本的glibc,而交叉編譯版本的glibc是通過交叉編譯版本的gcc創(chuàng)建的。面對(duì)這個(gè)先有雞還是先有蛋的問題,解決的辦法是先只編譯對(duì)C語(yǔ)言的支持,并禁止支持線程。18第十八頁(yè),共一百一十頁(yè)。1.

創(chuàng)建交叉編譯工具(cont.)4.第一次創(chuàng)建c庫(kù)(glibc)這一步編譯好的glic還不能用,它只是第二次編譯所需要的工具。后面的編譯工作都需要連接到這個(gè)庫(kù)上。19第十九頁(yè),共一百一十頁(yè)。1.創(chuàng)建交叉編譯工具(cont.)建立全套編譯器(full

gcc)有了交叉編譯版本的glibc,就可以創(chuàng)建完整版本的Gcc了。第二次創(chuàng)建C庫(kù)重新編譯glibc,并把glibc安裝到特定的工作目錄中。20第二十頁(yè),共一百一十頁(yè)。嵌入式Linux開發(fā)涉及的層次嵌入式Linux開發(fā)大致涉及三個(gè)層次:引導(dǎo)裝載程序Linux內(nèi)核圖形用戶界面(或稱GUI)21第二十一頁(yè),共一百一十頁(yè)。引導(dǎo)裝載程序引導(dǎo)裝載程序通常是在任何硬件上執(zhí)行的第一段代碼。在PC系統(tǒng)中,通常將引導(dǎo)裝載程序裝入主引導(dǎo)記錄(Master

B

ot

Record,(MBR))中,或者裝入Linux駐留的磁盤的第一個(gè)扇區(qū)中。通常,在臺(tái)式機(jī)或其它系統(tǒng)上,BIOS

將控制移交給引導(dǎo)裝載程序。22第二十二頁(yè),共一百一十頁(yè)。問題在大多數(shù)情況下,嵌入式系統(tǒng)沒有BIOS支持,如何實(shí)現(xiàn)第一次引導(dǎo)呢?23第二十三頁(yè),共一百一十頁(yè)。解決方法一專用軟件專用軟件可以直接與遠(yuǎn)程系統(tǒng)上的閃存設(shè)備進(jìn)行交互并將引導(dǎo)裝載程序安裝在flash的給定位置中。

這個(gè)軟件使用目標(biāo)機(jī)上的JTAG

端口,它是用于執(zhí)行外部輸入的指令的接口

JFlash-linux

是一種用于直接寫閃存的流行工具。它在主機(jī)機(jī)器上執(zhí)行并通過JTAG

接口使用并行端口訪問目標(biāo)閃存芯片。24第二十四頁(yè),共一百一十頁(yè)。解決方法二微小的引導(dǎo)代碼根據(jù)幾個(gè)字節(jié)的指令初始化一些DRAM

,并啟用目標(biāo)上的一個(gè)串行(或者USB,或者以太網(wǎng))端口與主機(jī)程序通信。然后,主機(jī)程序或裝入程序可以使用這個(gè)連接將引導(dǎo)裝載程序傳送到目標(biāo)上,并將它寫入閃存。在安裝它并給予其控制后,這個(gè)引導(dǎo)裝載程序執(zhí)行Bootloader的功能25第二十五頁(yè),共一百一十頁(yè)。2.Bootloader的移植一、什么是bootloader(引導(dǎo)加載程序)BootLoader就是在操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前運(yùn)行的一段小程序??梢猿跏蓟布O(shè)備、建立內(nèi)存空間的映射圖(有的CPU沒有

內(nèi)存映射功能如S3C44B0),從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)

合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序準(zhǔn)備好正確的環(huán)境。26第二十六頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)二、Boot

Loader的操作模式多數(shù)BootLoader都包含兩種不同的操作模式:√

“啟動(dòng)加載(Boot

loading)”模式:也稱為“自主”(Autonomous)模式,也即BootLoader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程并沒有用戶的介入。是BootLoader的正常工作模式。在嵌入式產(chǎn)品發(fā)布的時(shí)候,BootLoader必須工作在這種模式下.√

從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與下載工作模式的區(qū)別。27第二十七頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)下載(Down

loading)模式:在這種模式下目標(biāo)機(jī)上的BootLoader

將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)下載文件,比如應(yīng)用程序、數(shù)據(jù)文件、內(nèi)核映像等.從主機(jī)下載的文件通常首先被BootLoader保存到目標(biāo)機(jī)的RAM中然后再被BootLoader寫到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)設(shè)備中。這種模式通常在系統(tǒng)更新時(shí)使用。工作于這種模式下的BootLoader通常都會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口。28第二十八頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)三、BootLoader的啟動(dòng)過程Boot

Loader的實(shí)現(xiàn)依賴于CPU

的體系結(jié)構(gòu),因此大多數(shù)Boot

Loader

的啟動(dòng)都分為stage1

和stage2兩大部分。依賴于CPU

體系結(jié)構(gòu)的代碼,設(shè)備初始化代碼等,通常都放在stage1中,而且通常都用匯編語(yǔ)言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。stage2則通常用C語(yǔ)言來實(shí)現(xiàn),可以實(shí)現(xiàn)給復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。29第二十九頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)B

ot

Loader

的stage1

通常包括以下步驟(以執(zhí)行的先后順序):硬件設(shè)備初始化執(zhí)行–linux/arch/arm/kernel/head-xxx.S屏蔽所有的中斷。為中斷提供服務(wù)通常是OS

設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在

Boot

Loader的執(zhí)行全過程中可以不必響應(yīng)任何中斷。中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態(tài)寄存器(比如ARM

的CPSR

寄存器)來完成。設(shè)置CPU

的速度和時(shí)鐘頻率。30第三十頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)RAM初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫(kù)控制寄存器等。初始化LED。通過GPIO

來驅(qū)動(dòng)LED,表明系統(tǒng)狀態(tài)是OK

還是

Error。如果板子上沒有LED,那么也可以通過初始化UART

向串口打印Boot

Loader的Logo

字符信息來完成這一點(diǎn)。關(guān)閉CPU

內(nèi)部指令/數(shù)據(jù)cache。31第三十一頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)為加載Boot

Loader

的stage2準(zhǔn)備RAM

空間。為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM

空間中來執(zhí)行,因此必須為加載Boot

Loader的stage2

準(zhǔn)備好一段可用的RAM

空間范圍??截怋oot

Loader的stage2

到RAM

空間中。拷貝時(shí)要確定兩點(diǎn):stage2的可執(zhí)行映象在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;RAM

空間的起始地址。32第三十二頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)設(shè)置好堆棧。堆棧指針的設(shè)置是為了執(zhí)行C語(yǔ)言代碼作好準(zhǔn)備。跳轉(zhuǎn)到stage2

的C

入口點(diǎn)。在上述一切都就緒后,就可以跳轉(zhuǎn)到Boot

Loader的stage2

去執(zhí)行了。比如,在ARM

系統(tǒng)中,這可以通過修改PC

寄存器為合適的地址來實(shí)現(xiàn)。33第三十三頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)stage2

的代碼通常用C

語(yǔ)言來實(shí)現(xiàn)。但是與普通C語(yǔ)言應(yīng)用程序不同的是,在編譯和鏈接boot

loader

這樣的程序時(shí),不能使用glibc庫(kù)中的任何支持函數(shù)。具體步驟(以執(zhí)行的先后順序):·

初始化本階段要使用到的硬件設(shè)備。通常包括:(1)初始化至少一個(gè)串口,以便和終端用戶進(jìn)行I/O

輸出信息;(2)初始化計(jì)時(shí)器等。設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號(hào)等。34第三十四頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)檢測(cè)系統(tǒng)內(nèi)存映射(memory

map)。指在整個(gè)4GB物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的RAM

單元。比如,在SA-1100

CPU

中,從0xC000,0000

開始的512M

地址空間被用作系統(tǒng)的RAM

地址空間,而在SamsungS3C44B0X

CPU中,從0x0c00,0000

到0x1000,0000

之間的64M

地址空間被用作系統(tǒng)的RAM

地址空間。35第三十五頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)將kernel

映像和根文件系統(tǒng)映像從flash

上讀到RAM空間中。規(guī)劃內(nèi)存占用的布局包括兩個(gè)方面:內(nèi)核映像所占用的內(nèi)存范圍根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局時(shí),主要考慮基地址和映像的大小。從Flash

上拷貝數(shù)據(jù)36第三十六頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)為內(nèi)核設(shè)置啟動(dòng)參數(shù)。在將內(nèi)核映像和根文件系統(tǒng)映像拷貝到RAM空間中后,就可以準(zhǔn)備啟動(dòng)Linux

內(nèi)核了。但是在調(diào)用內(nèi)核之前,應(yīng)該作一步準(zhǔn)備工作,即:設(shè)置Linux

內(nèi)核的啟動(dòng)參數(shù)。調(diào)用內(nèi)核。37第三十七頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)系統(tǒng)初始化linux/init/main.c

---

start_kernel(…)setup_arch(…);//platform

specific

init,

board

param,

memoryrange,etcpaging_init(…);trap_init();init_IRQ();38第三十八頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)sched_init();time_init();parse_options(command_line);console_initkmalloc_initinode_initmem_initbuffer_init();sock_init();kernel

thread

---

init()39第三十九頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)設(shè)備驅(qū)動(dòng)初始化掛載root文件系統(tǒng)ROMFS(Or

otheras

root)Open

tty

from

root運(yùn)行初始化進(jìn)程40第四十頁(yè),共一百一十頁(yè)。/etc/rchostname

Atmel/bin/expand

/etc/ramfs.img

/dev/ram0mount

-t

proc

proc

/procmount

-t

ext2

/dev/ram0

/varmkdir

/var/tmpmkdir

/var/logmkdir

/var/runmkdir

/var/lockcat

/etc/motdifconfig

lo

route

add

-net

netmask

lodhcpcd41第四十一頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)四、u-boot(1)簡(jiǎn)介U-Boot,全稱Universal

Boot

Loader,是開放源碼項(xiàng)目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與

Linux內(nèi)核很相似,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡(jiǎn)化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。42第四十二頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),當(dāng)前,它還支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是OpenBSD,NetBSD,FreeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,SCO,Dell,NCR,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS。這是U-Boot中Universal的一層含義。43第四十三頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)

另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常

用系列的處理器。

這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前來看,U-Boot對(duì)PowerPC系列處理器支持最為豐富,對(duì)Linux的支持最完善。44第四十四頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)(2)u-boot的特點(diǎn)①開放源碼;②支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS;③支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;45第四十五頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)④較高的可靠性和穩(wěn)定性;⑤高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;⑥豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;⑦較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持;46第四十六頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)(3)U-Boot主要目錄結(jié)構(gòu)board

目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動(dòng);common

獨(dú)立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測(cè)與故障檢測(cè);cpu

與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動(dòng)及中斷初始化等文件;driver

通用設(shè)備驅(qū)動(dòng),如CFI

FLASH驅(qū)動(dòng)(目前對(duì)INTEL

FLASH支持較好)47第四十七頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)doc

U-Boot的說明文檔;include

U-Boot頭文件;尤其configs子目錄下與目標(biāo)板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;lib_xxx

處理器體系相關(guān)的文件,如lib_ppc,lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;net

與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;post

上電自檢文件目錄。尚有待于進(jìn)一步完善;rtc

RTC驅(qū)動(dòng)程序;tools

用于創(chuàng)建U-Boot

S-RECORD和BIN鏡像文件的工具;48第四十八頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)(4)U-Boot可支持的主要功能

系統(tǒng)引導(dǎo):支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng);支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;

基本輔助功能:強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤對(duì)Linux支持最為強(qiáng)勁;支持目標(biāo)板環(huán)境參數(shù)多種存儲(chǔ)方式,如FLASH、NVRAM、EEPROM;CRC32校驗(yàn),49第四十九頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)可校驗(yàn)FLASH中內(nèi)核、RAMDISK鏡像文件是否完好;

設(shè)備驅(qū)動(dòng):串口、SDRAM、FLASH、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動(dòng)支持;

上電自檢功能SDRAM、FLASH大小自動(dòng)檢測(cè);SDRAM故障檢測(cè);CPU型號(hào);特殊功能:XIP內(nèi)核引導(dǎo);50第五十頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)(5)u-boot移植的主要步驟以S3C2410處理器為例,說明u-boot的主要移植步驟:1.修改Makefile文件bks2410_config

:

unconfig@./mkconfig

$(@:_config=)

arm

arm920t

bks2410

NULLs3c24x051第五十一頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)各參數(shù)含義:arm:CPU的架構(gòu)(ARCH)arm920t:CPU的類型(CPU),其對(duì)應(yīng)于cpu/arm920t子目錄。bks2410:開發(fā)板的型號(hào)(BOARD),對(duì)應(yīng)于board/bks2410目錄。NULL:開發(fā)者/或經(jīng)銷商(vender)。s3c24x0:片上系統(tǒng)(SOC)。52第五十二頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)建立board/bks2410目錄,拷貝board/smdk2410下的文件到board/bks2410目錄,將smdk2410.c更名為bks2410.ccp

include/configs/smdk2410.h

include/configs/bks2410.h將arm-linux-gcc的目錄加入到PATH環(huán)境變量中測(cè)試編譯能否成功:

make

bks2410_config make

all

ARCH=arm生成u-boot.bin就OK了53第五十三頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)依照自己開發(fā)板的內(nèi)存地址分配情況修改board/bks2410/memsetup.S文件在board/bks2410加入NAND

Flash讀函數(shù),建立nand_read.c。修改board/bks2410/Makefile修改cpu/arm920t/start.S文件修改include/configs/bks2410.h文件重新編譯u-bootmake

all

ARCH=arm通過jtag將u-boot燒寫到flash54第五十四頁(yè),共一百一十頁(yè)。2.Bootloader的移植(cont.)五、vivi簡(jiǎn)介vivi是韓國(guó)mizi公司開發(fā)的bootloader,適用于ARM9處理器。如果目標(biāo)平臺(tái)使用的是ARM9處理器,那么選用vivi來做bootloader是個(gè)不錯(cuò)的選擇。55第五十五頁(yè),共一百一十頁(yè)。56第五十六頁(yè),共一百一十頁(yè)。3.Linux的內(nèi)核格式linux的內(nèi)核有多種格式,vmlinux、老式的zImage和新型的bzImage。vmlinux和zImage

之間的主要區(qū)別:vmlinux

是實(shí)際的(未壓縮的)可執(zhí)行文件,而zImage是或多或少包含相同信息的自解壓壓縮文件—只是壓縮它以處理(通常是Intel強(qiáng)制的)640

KB

引導(dǎo)時(shí)間的限制。57第五十七頁(yè),共一百一十頁(yè)。3.Linux的內(nèi)核格式zImage和新型的bzImage之間最大的差別是對(duì)于內(nèi)核體積大小的限制。由于zImage內(nèi)核需要放在實(shí)模式1MB的內(nèi)存之內(nèi),所以其體積受到了限制。目前采用的內(nèi)核格式大多為bzImage,這種格式?jīng)]有1MB內(nèi)存限制。58第五十八頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植使某個(gè)平臺(tái)的代碼運(yùn)行在其他平臺(tái)上的過程就叫做移植。Linux系統(tǒng)通過移植可以運(yùn)行在ARM,PowerPC,M68K等多種平臺(tái)上。Linux內(nèi)核結(jié)構(gòu)linux內(nèi)核主要由5個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口和進(jìn)程間通信。一般在Linux系統(tǒng)中的/usr/src/linux-*.*.*目錄下就是內(nèi)核源代碼。59第五十九頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)Linux內(nèi)核源代碼的分布如下:

arch

這個(gè)子目錄包含了此核心源代碼所支持的硬件體系結(jié)構(gòu)相關(guān)的核心代碼。如對(duì)于X86平臺(tái)就是i386。

include

這個(gè)目錄包括了核心的大多數(shù)include文件。另外對(duì)于每種支持的體系結(jié)構(gòu)分別有一個(gè)子目錄。init

此目錄包含核心啟動(dòng)代碼。

mm

此目錄包含了所有的內(nèi)存管理代碼。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下,如對(duì)應(yīng)于X86的就是

arch/i386/mm/fault.c

。60第六十頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)

drivers

系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)都位于此目錄中。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種也有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于drivers/sound。ipc

此目錄包含了核心的進(jìn)程間通訊代碼。modules

此目錄包含已建好可動(dòng)態(tài)加載的模塊。

fs

Linux支持的文件系統(tǒng)代碼。不同的文件系統(tǒng)有不同的子目錄對(duì)應(yīng),如ext2文件系統(tǒng)對(duì)應(yīng)的就是ext2子目錄。

kernel

主要核心代碼。同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在

arch/*/kernel目錄下。61第六十一頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)

net

核心的網(wǎng)絡(luò)部分代碼。里面的每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。

lib

此目錄包含了核心的庫(kù)代碼。與處理器結(jié)構(gòu)相關(guān)庫(kù)代碼被放在arch/*/lib/目錄下。scripts此目錄包含用于配置核心的腳本文件。Documentation

此目錄是一些文檔,起參考作用。62第六十二頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)Linux內(nèi)核的移植移植所要做的工作就是根據(jù)硬件的配置,修改

Linux內(nèi)核目錄中的Makefile文件、配置文件及某些源代碼。63第六十三頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)編譯內(nèi)核1、安裝內(nèi)核如果內(nèi)核已經(jīng)安裝(/usr/src/目錄有l(wèi)inux子目錄),跳過;如果沒有安裝,在光驅(qū)中放入linux安裝光盤,找到kernel-source-2.xx.xx.rpm文件(xx代表數(shù)字,表示內(nèi)核的版本號(hào)),比如RedHatlinux的RPMS目錄是/RedHat/RPMS/目錄,然后使用命令rpm

-ivh

kernel-source2.xx.xx.rpm安裝內(nèi)核64第六十四頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)2、清除從前編譯內(nèi)核時(shí)殘留的.o

文件和不必要的關(guān)聯(lián)

cd

/usr/src/linuxmake

mrproper刪除所有因構(gòu)造內(nèi)核過程中產(chǎn)生的所有文件,除了Make

clean所刪除的文件之外,還要?jiǎng)h除.config,.depend等文件,把核心源碼恢復(fù)到最原始的狀態(tài)。65第六十五頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)3、配置內(nèi)核,修改相關(guān)參數(shù)在圖形界面下,make

xconfig;字符界面下,make

menuconfig調(diào)用./scripts/Configure按照arch/i386/config.in來進(jìn)行配置。命令執(zhí)行完后產(chǎn)生文件.config,其中保存著配置信息。下一次再做make

config將產(chǎn)生新的.config文件,原.config被改名為.config.old在內(nèi)核配置菜單中正確設(shè)置個(gè)內(nèi)核選項(xiàng),保存退出66第六十六頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)4、正確設(shè)置關(guān)聯(lián)文件make

dep尋找依存慣性,產(chǎn)生兩個(gè)文件.depend和.hdepend,其中.hdepend表示每個(gè).h文件都包含其他哪些嵌入文件,而.depend文件有多個(gè),在每個(gè)會(huì)產(chǎn)生目標(biāo)文件(.o)文件的目錄下均有,它表示每個(gè)目錄文件都依賴哪些嵌入文件(.h)5、編譯內(nèi)核對(duì)于大內(nèi)核(比如需要SCSI支持),make

bzImage對(duì)于小內(nèi)核,make

zImage根據(jù)可用的系統(tǒng)資源和引導(dǎo)裝載程序的功能,內(nèi)核可以編譯成vmlinux、Image

或zImage。67第六十七頁(yè),共一百一十頁(yè)。3.Linux內(nèi)核的移植(cont.)6、編譯模塊make

modules7、安裝模塊make

modules_install68第六十八頁(yè),共一百一十頁(yè)。內(nèi)核鏈接和裝入為目標(biāo)系統(tǒng)編譯了內(nèi)核后,通過使用引導(dǎo)裝載程序(bootloader),內(nèi)核就被裝入到目標(biāo)系統(tǒng)的內(nèi)存(在DRAM中或者在閃存中)。通過使用串行、USB

或以太網(wǎng)端口,引導(dǎo)裝載程序與主機(jī)通信以將內(nèi)核傳送到目標(biāo)的閃存或DRAM中。在將內(nèi)核完全裝入目標(biāo)后,引導(dǎo)裝載程序?qū)⒖刂苽鬟f給裝入內(nèi)核的地址。69第六十九頁(yè),共一百一十頁(yè)。內(nèi)核鏈接和裝入內(nèi)核可執(zhí)行文件由許多鏈接在一起的對(duì)象文件組成。對(duì)象文件有許多節(jié),如文本、數(shù)據(jù)、init數(shù)據(jù)、bass等等。對(duì)象文件都是由一個(gè)稱為鏈接器腳本的文件鏈接并裝入的。鏈接器腳本的功能是將輸入對(duì)象文件的各節(jié)映射到輸出文件中;即將所有輸入對(duì)象文件都鏈接到單一的可執(zhí)行文件中,將該可執(zhí)行文件的各節(jié)裝入到指定地址處。vmlinux.lds

是存在于arch/<target>/目錄中的內(nèi)核鏈接器腳本,負(fù)責(zé)鏈接內(nèi)核的各個(gè)節(jié)并將它們裝入內(nèi)存中特定偏移量處。70第七十頁(yè),共一百一十頁(yè)。典型的vmlinux.lds文件OUTPUT_ARCH(<arch>)

/*

<arch>

includes

architecture

type

*/ENTRY(stext)

/*

stext

is

the

kernel

entry

point

*/SECTIONS

/*

SECTIONS

command

describes

the

layoutof

the

output

file

*/{.

=

TEXTADDR;

/*

TEXTADDR

is

LMA

for

the

kernel

*/.init

:

{

/*

Init

code

and

data*/_stext

=

.;

/*

First

section

is

stext

followedby

init

data

section

*/

init_begin

=

.;*(.text.init)

init_end

=

.;}.text

:

{

/*

Real

text

segment

follows

init_data

section

*/_text

=

.;*(.text)_etext

=

.;

/*

End

of

text

section*/}71第七十一頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作嵌入式系統(tǒng)需要一種以結(jié)構(gòu)化格式存儲(chǔ)和檢索信息的方法;這就需要文件系統(tǒng)的參與。Ramdisk是通過將計(jì)算機(jī)的RAM用作設(shè)備來創(chuàng)建和掛裝文件系統(tǒng)的一種機(jī)制,它通常用于無盤系統(tǒng)(當(dāng)然包括微型嵌入式設(shè)備,它只包含作為永久存儲(chǔ)媒質(zhì)的閃存芯片)。72第七十二頁(yè),共一百一十頁(yè)。RamDisk簡(jiǎn)介將RAM模擬當(dāng)做硬盤來使用的一種技術(shù)。相對(duì)于傳統(tǒng)的硬盤文件訪問來說,這種技術(shù)可以極大的提高在其上進(jìn)行的文件訪問的速度。但是RAM的易失性也意味著當(dāng)關(guān)閉電源后的數(shù)據(jù)將會(huì)丟失。Ramdisk的速度特別快,大概是現(xiàn)在最快的7200轉(zhuǎn)硬盤速度的30倍。VSuite

Ramdisk——推薦,免費(fèi)版。RamDisk

Plus——需要序列號(hào)。73第七十三頁(yè),共一百一十頁(yè)。創(chuàng)建基于Ext2fs的Ramdiskmke2fs

-vm0

/dev/ram

4096mount

-t

ext2

/dev/ram

/mntcd

/mntcp

/bin,

/sbin,

/etc,

/dev

...

files

in

mntcd

../umount

/mntdd

if=/dev/ram

bs=1k

count=4096of=ext2ramdisk74第七十四頁(yè),共一百一十頁(yè)。ramfs一種基于ram的文件系統(tǒng),開發(fā)ramfs的目的是因?yàn)閞amdisk浪費(fèi)了太多的內(nèi)存cache頁(yè),ramfs是基于tmpfs的一個(gè)實(shí)例。75第七十五頁(yè),共一百一十頁(yè)。Initrd與initramfsinitrd是init

ramdisk的縮寫,initramfs是init

ramfs的縮寫。init前綴代表它們具有了引導(dǎo)內(nèi)核啟動(dòng)的功能。ramfs比ramdisk更加高效,自然initramfs也更加優(yōu)秀,是2.6內(nèi)核新加入的推薦使用的機(jī)制,雖然可能pc中g(shù)rub使用的內(nèi)核cmd

line參數(shù)是kernel

/vmlinuz-2.6.25-14.fc9.i686

ro

root=UUID=11d7ac51-2b45-489e-8a48-8d2a28e2c04e

rhgb

quietinitrd

/initrd-2.6.25-14.fc9.i686.img實(shí)際上使用的是initramfs,文件格式不同,initrd是gziped的,initramfs是cpio的76第七十六頁(yè),共一百一十頁(yè)。initrdinitrd的作用:精簡(jiǎn)的根文件系統(tǒng),包含必備的目錄和程序。內(nèi)核鏡像不應(yīng)該靜態(tài)包含進(jìn)太多驅(qū)動(dòng)模塊。但是

Linux內(nèi)核啟動(dòng)最后一步,創(chuàng)建init內(nèi)核線程,需要執(zhí)行的init程序或者腳本在根文件系統(tǒng)中。根文件系統(tǒng)可能在硬盤、磁盤陣列、nfs、flash上。此時(shí),可使用initrd作為一個(gè)過渡。77第七十七頁(yè),共一百一十頁(yè)。initrdinitrd,或者initramfs,無論在pc還是嵌入式,都是可以選擇的,分3種情況完全不要initrdinitrd作為最終的根文件系統(tǒng)initrd作為過渡,由initrd的init來加載最終的根文件系統(tǒng)78第七十八頁(yè),共一百一十頁(yè)。情況1,比如嵌入式linux靜態(tài)包含了nand

flash驅(qū)動(dòng)和jffs2驅(qū)動(dòng),指定內(nèi)核啟動(dòng)參數(shù)root=/dev/mtdblock2

rootfs=jffs2

rw

console=ttySAC0,115200

init=/linuxrc(使用busybox作為根文件系統(tǒng))情況2,將根文件系統(tǒng)做成ramdisk鏡像,使用ubbot下載到0x30800000,內(nèi)核啟動(dòng)參數(shù)root=/dev/ram

rw

init=/linuxrc

initrd=0x30800000,8M

console=ttySAC0,115200注意,一旦使用了ramdisk作為內(nèi)核命令行參數(shù)root的參數(shù),root=/dev/ram那么就直接把initrd當(dāng)做最終的根文件系統(tǒng)情況3,pc常見,嵌入式linux也可見這樣的啟動(dòng)參數(shù)console=ttySAC0,115200

root=nfs

nfsroot=:/source/rootfsinitrd=0x10800000,0x14af4779第七十九頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作一、根文件系統(tǒng)的基本結(jié)構(gòu)和內(nèi)容Linux系統(tǒng)的根文件的基本結(jié)構(gòu)如圖1所示,其中每個(gè)目錄中都包含特定內(nèi)容:1./bin目錄/bin目錄包含了引導(dǎo)啟動(dòng)所需的命令或普通用戶可能用的命令(可能在引導(dǎo)啟動(dòng)后)。這些命令都是二進(jìn)制文件的可執(zhí)行程序。80第八十頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)2./sbin目錄/sbin目錄類似/bin,也用于存儲(chǔ)二進(jìn)制文件。因?yàn)槠渲械拇蟛糠治募嗍窍到y(tǒng)管理員使用的基本的系統(tǒng)程序,所以雖然普通用戶必要且允許時(shí)可以使用,但一般不給普通用戶使用。81第八十一頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)/etc目錄/etc目錄存放著各種系統(tǒng)配置文件,其中包括了用戶信息文件/etc/passwd,系統(tǒng)初始化文件/etc/rc等。Linux正是靠這些文件才得以正常地運(yùn)行。/root目錄/r

ot目錄是超級(jí)用戶的目錄。82第八十二頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)5./lib目錄/根文件系統(tǒng)上的程序所需的共享庫(kù),存放根文件系統(tǒng)程序運(yùn)行所需的共享文件。/lib/modules

目錄包含系統(tǒng)核心可加載各種模塊,尤其是那些在恢復(fù)損壞的系統(tǒng)時(shí)重新引導(dǎo)系統(tǒng)所需

的模塊(例如網(wǎng)絡(luò)和文件系統(tǒng)驅(qū)動(dòng))。83第八十三頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)/dev目錄/dev目錄存放了設(shè)備驅(qū)動(dòng)程序,用戶通過這些文件訪問外部設(shè)備。比如,用戶可以通過訪問/dev/mouse來訪問鼠標(biāo)的輸入。/tmp目錄/tmp

目錄存放程序在運(yùn)行時(shí)產(chǎn)生的信息和數(shù)據(jù)。/boot目錄/boot目錄存放引導(dǎo)加載器(bootloader)使用的文件,如LILO、grub,核心映像也經(jīng)常放在這里,而不是放在根目錄中。84第八十四頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)/mnt目錄系統(tǒng)管理員臨時(shí)安裝(mount)文件系統(tǒng)的安裝點(diǎn)。程序并不自動(dòng)支持安裝到/mnt

。/mnt

下面可以分為許多子目錄,例如/mnt/dosa

可能是使用MSDOS文件系統(tǒng)的軟驅(qū),而/mnt/exta可能是使用ext2文件系統(tǒng)的軟驅(qū),/mnt/cdrom

光驅(qū)等等。/proc,/usr,/var,/home目錄其他文件系統(tǒng)的安裝點(diǎn)。85第八十五頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)二、嵌入式Linux系統(tǒng)的根文件系統(tǒng)的制作第一步:確定根文件系統(tǒng)的目錄結(jié)構(gòu)在嵌入式Linux系統(tǒng)中,必須有的目錄包括:/bin,/dev,/etc/,/lib,/proc,/sbin,和/usr,其他目錄都是可選的。86第八十六頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)第二步:在根文件系統(tǒng)中各個(gè)目錄的添加必要的內(nèi)容,包括:1、鏈接庫(kù)glibc2、內(nèi)核映象,內(nèi)核配置文件等;3、內(nèi)核模塊;4、設(shè)備文件87第八十七頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)只需要一些必備的條目及符號(hào)鏈接就可以滿足系統(tǒng)的運(yùn)行?;镜?dev條目包括:文件名

說明

類型主編號(hào)次編號(hào)權(quán)限位mem

物理內(nèi)存存取字符

11600null

黑洞設(shè)備字符13666zero

以null

byte字符15666為數(shù)據(jù)來源random隨機(jī)數(shù)產(chǎn)生器字符

1864488第八十八頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)tty0字符

4

0

600現(xiàn)行的虛擬控制臺(tái)字符

4

1

6004

64

600tty1

第一個(gè)虛擬控制臺(tái)ttyS0

第一個(gè)UART

字符串行端口tty

現(xiàn)行的控制臺(tái)字符

console

系統(tǒng)控制臺(tái)字符5

0

6665

1

60089第八十九頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)創(chuàng)建/dev中的條目:(使用mknod命令)#mknod

–m

600

mem

c

1

1#

mknod

–m

666

null c

1

3…………創(chuàng)建符號(hào)鏈接:(使用ln–s

命令)鏈接名稱fdstdinstdoutstderr鏈接對(duì)象/proc/self/fdfd/0fd/1fd/290第九十頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)5、主要的系統(tǒng)應(yīng)用程序標(biāo)準(zhǔn)的Linux工作站和服務(wù)器發(fā)行套件中都配備了數(shù)以千計(jì)的二進(jìn)制命令文件,并且不同的發(fā)行套件提供的命令集還各不相同。嵌入式Linux系統(tǒng)中不需要這么多的二進(jìn)制文件。一般有兩種方法來定制嵌入式Linux系統(tǒng)中的二進(jìn)制命令文件:1、挑選若干標(biāo)準(zhǔn)命令;2、盡可能把命令集濃縮成僅僅實(shí)現(xiàn)必要功能的極少數(shù)應(yīng)用程序(如BusyBox)。91第九十一頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)BusyBox簡(jiǎn)介BusyBox包含了一些簡(jiǎn)單的工具,例如cat

和echo,還包含了一些更大、更復(fù)雜的工具,例如grep、find、mount以及telnet(不過它的選項(xiàng)比傳統(tǒng)的版本要少);BusyBox

稱為L(zhǎng)inux工具里的瑞士軍刀。92第九十二頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)93第九十三頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)6、init程序內(nèi)核初始化的最后一個(gè)動(dòng)作是啟動(dòng)init程序。init程序啟動(dòng)后會(huì)根據(jù)

inittab文件的內(nèi)容啟動(dòng)指定的系統(tǒng)服務(wù)。大多數(shù)Linux使用的init跟System

V

的init類似,嵌入式Linux系統(tǒng)可用BusyBox來提供init的功能。用戶需要定制目標(biāo)平臺(tái)的

inittab、rc.sysinit、rc等文件。94第九十四頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)三、制作根文件系統(tǒng)的鏡像根文件系統(tǒng)的目錄結(jié)構(gòu)和內(nèi)容都準(zhǔn)備好了之后,需要把它制成一個(gè)鏡像文件,以便于將其下載到開發(fā)板上。嵌入式系統(tǒng)常用的文件系統(tǒng)介紹:(1)CRamfscramfs是一個(gè)壓縮式的只讀文件系統(tǒng),不需要一次性地將文件系統(tǒng)中的

所有內(nèi)容都解壓縮到內(nèi)存之中,而只是在系統(tǒng)需要訪問某個(gè)位置的數(shù)據(jù)的時(shí)侯,馬上計(jì)算出該數(shù)據(jù)在cramfs中的位置,將其實(shí)時(shí)地解壓縮到內(nèi)存之中,然后通過對(duì)內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù)。95第九十五頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)cramfs中的解壓縮以及解壓縮之后的內(nèi)存中數(shù)據(jù)存放位置都是由

cramfs文件系統(tǒng)本身進(jìn)行維護(hù)的,用戶并不需要了解具體的實(shí)現(xiàn)過程,因此這種方式增強(qiáng)了透明度,對(duì)開發(fā)人員來說,既方便,又節(jié)省了存儲(chǔ)空間。96第九十六頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)cramfs特性:采用實(shí)時(shí)解壓縮方式,但解壓縮的時(shí)侯有延遲。

cramfs的數(shù)據(jù)都是經(jīng)過處理、打包的,對(duì)其進(jìn)先寫操作有一定困難。所以cramfs不支持寫操作,這個(gè)特性剛好適合嵌入式應(yīng)用中使用Flash存儲(chǔ)文件系統(tǒng)的場(chǎng)合。97第九十七頁(yè),共一百一十頁(yè)。4.根文件系統(tǒng)的制作(cont.)cramfs中文件最大不能超過16MB。

支持組標(biāo)識(shí)(gid),但是mkcramfs只將gid的低8位保存下來,因此只有這8位是有效的。

支持硬鏈接。但是cramfs并沒有完全處理好,硬鏈接的文件屬性中,鏈接數(shù)仍然為1.

cramfs的目錄中,沒有“.”和“..”這兩項(xiàng)。因此,

cramfs中的目錄的鏈接數(shù)通常也僅有一個(gè)。98第九十八頁(yè),共一百一十頁(yè)。4.根文

溫馨提示

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

評(píng)論

0/150

提交評(píng)論