當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式微處理器
[導(dǎo)讀]收藏

最近在學(xué)習(xí)系統(tǒng)移植的相關(guān)知識,在學(xué)習(xí)和調(diào)試過程中,發(fā)現(xiàn)了很多問題,也解決了很多問題,但總是對于我們的開發(fā)結(jié)果有一種莫名其妙的感覺,糾其原因,主要對于我們的開發(fā)環(huán)境沒有一個深刻的認(rèn)識,有時候幾個簡單的命令就可以完成非常復(fù)雜的功能,可是我們有沒有想過,為什么會有這樣的效果?如果沒有去追問,只是機械地完成,并且看到實驗效果,這樣做其實并沒有真正的掌握系統(tǒng)移植的本質(zhì)。


在做每一個步驟的時候,首先問問自己,為什么要這樣做,然后再問問自己正在做什么?搞明白這幾個問題,我覺得就差不多了,以后不管更換什么平臺,什么芯片,什么開發(fā)環(huán)境,你都不會迷糊,很快就會上手。對于嵌入式的學(xué)習(xí)方法,我個人方法就是:從宏觀上把握(解決為什么的問題),微觀上研究(解決正在做什么的問題),下面以自己學(xué)習(xí)的arm-cortex_a8開發(fā)板為目標(biāo),介紹下自己的學(xué)習(xí)方法和經(jīng)驗。


嵌入式Linux系統(tǒng)移植主要由四大部分組成:


一、搭建交叉開發(fā)環(huán)境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統(tǒng)的制作

第一部分:搭建交叉開發(fā)環(huán)境


先介紹第一分部的內(nèi)容:搭建交叉開發(fā)環(huán)境,首先必須得思考兩個問題,什么是交叉環(huán)境? 為什么需要搭建交叉環(huán)境?


先回答第一個問題,在嵌入式開發(fā)中,交叉開發(fā)是很重要的一個概念,開發(fā)的第一個環(huán)節(jié)就是搭建環(huán)境,第一步不能完成,后面的步驟從無談起,這里所說的交叉開發(fā)環(huán)境主要指的是:在開發(fā)主機上(通常是我的pc機)開發(fā)出能夠在目標(biāo)機(通常是我們的開發(fā)板)上運行的程序。嵌入式比較特殊的是不能在目標(biāo)機上開發(fā)程序(狹義上來說),因為對于一個原始的開發(fā)板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要借助pc機進行燒錄程序等相關(guān)工作,開發(fā)板才能跑起來,這里的pc機就是我們說的開發(fā)主機,想想如果沒有開發(fā)主機,我們的目標(biāo)機基本上就是無法開發(fā),這也就是電子行業(yè)的一句名言:搞電子,說白了,就是玩電腦!


然后回答第二個問題,為什么需要交叉開發(fā)環(huán)境?主要原因有以下幾點:


原因1:嵌入式系統(tǒng)的硬件資源有很多限制,比如cpu主頻相對較低,內(nèi)存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬件資源更加豐富,因此利用pc機進行開發(fā)會提高開發(fā)效率。


原因2:嵌入式系統(tǒng)MCU體系結(jié)構(gòu)和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標(biāo)程序才能夠在相應(yīng)的平臺上比如:ARM、MIPS、 ? POWEPC上正常運行。

交叉開發(fā)環(huán)境的硬件組成主要由以下幾大部分

1.開發(fā)主機
2.目標(biāo)機(開發(fā)板)
3.二者的鏈接介質(zhì),常用的主要有3中方式:(1)串口線 (2)USB線?(3)網(wǎng)線

對應(yīng)的硬件介質(zhì),還必須要有相應(yīng)的軟件“介質(zhì)”支持:

1.對于串口,通常用的有串口調(diào)試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;
2.對于USB線,當(dāng)然必須要有USB的驅(qū)動才可以,一般芯片公司會提供,比如對于三星的芯片,USB下載主要由DNW軟件來完成;
3.對于網(wǎng)線,則必須要有網(wǎng)絡(luò)協(xié)議支持才可以,常用的服務(wù)主要兩個

第一:tftp服務(wù):

主要用于實現(xiàn)文件的下載,比如開發(fā)調(diào)試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統(tǒng)直接下載到內(nèi)存中運行,而不需要預(yù)先燒錄到Flash芯片中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然后再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數(shù)是由限的;另外一方面:測試的目的就是把這些目標(biāo)文件加載到內(nèi)存中直接運行就可以了,而tftp就剛好能夠?qū)崿F(xiàn)這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去

第二:nfs服務(wù):

主要用于實現(xiàn)網(wǎng)絡(luò)文件的掛載,實際上是實現(xiàn)網(wǎng)絡(luò)文件的共享,在開發(fā)的過程中,通常在系統(tǒng)移植的最后一步會制作文件系統(tǒng),那么這是可以把制作好的文件系統(tǒng)放置在我們開發(fā)主機PC的相應(yīng)位置,開發(fā)板通過nfs服務(wù)進行掛載,從而測試我們制作的文件系統(tǒng)是否正確,在整個過程中并不需要把文件系統(tǒng)燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動后,kernel運行起來后會根據(jù)我們設(shè)置的啟動參數(shù)進行自動掛載,因此,對于開發(fā)測試來講,這種方式非常的方便,能夠提高開發(fā)效率。

另外,還有一個名字叫samba的服務(wù)也比較重要,主要用于文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現(xiàn)網(wǎng)絡(luò)文件的共享,而samba實現(xiàn)的是開發(fā)主機上Windows主機和Linux虛擬機之間的文件共享,是一種跨平臺的文件共享,方便的實現(xiàn)文件的傳輸。

以上這幾種開發(fā)的工具在嵌入式開發(fā)中是必備的工具,對于嵌入式開發(fā)的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發(fā)效率會提高很多。等測試完成以后,就會把相應(yīng)的目標(biāo)文件燒錄到Flash中去,也就是等發(fā)布產(chǎn)品的時候才做的事情,因此對于開發(fā)人員來說,所有的工作永遠(yuǎn)是測試。

通過前面的工作,我們已經(jīng)準(zhǔn)備好了交叉開發(fā)環(huán)境的硬件部分和一部分軟件,最后還缺少交叉編譯器,讀者可能會有疑問,為什么要用交叉編譯器?前面已經(jīng)講過,交叉開發(fā)環(huán)境必然會用到交叉編譯工具,通俗地講就是在一種平臺上編譯出能運行在體系結(jié)構(gòu)不同的另一種平臺上的程序,開發(fā)主機PC平臺(X86 CPU)上編譯出能運行在以ARM為內(nèi)核的CPU平臺上的程序,編譯得到的程序在X86 CPU平臺上是不能運行的,必須放到ARM CPU平臺上才能運行,雖然兩個平臺用的都是Linux系統(tǒng)。相對于交叉編譯,平常做的編譯叫本地編譯,也就是在當(dāng)前平臺編譯,編譯得到的程序也是在本地執(zhí)行。用來編譯這種跨平臺程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標(biāo)機上運行的程序,必須要用交叉編譯工具鏈來完成。
?

這里又有一個問題,不就是一個交叉編譯工具嗎?為什么又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調(diào)試,對于一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統(tǒng)提供C編譯器)和glibc(一些基本的C函數(shù)和其他函數(shù)的定義)?3個部分組成。有時為了減小libc庫的大小,也可以用別的 ?c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。
? ???

那么,如何得到一個交叉工具鏈呢?是從網(wǎng)上下載一個“程序”然后安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標(biāo)開發(fā)平臺比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平臺,每個平臺專門定制一個交叉工具鏈放在網(wǎng)絡(luò)上,然后供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內(nèi)核一樣,我們只關(guān)心我們需要的東西,編譯我們需要的東西在我們的平臺上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的制作方法和系統(tǒng)移植有著很多相似的地方,也就是說,交叉開發(fā)工具是一個支持很多平臺的工具集的集合(類似于Linux源碼),然后我們只需從這些工具集中找出跟我們平臺相關(guān)的工具就行了,那么如何才能找到跟我們的平臺相關(guān)的工具,這就是涉及到一個如何制作交叉工具鏈的問題了。

通常構(gòu)建交叉工具鏈有如下三種方法:

方法一 :分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構(gòu)建交叉工具鏈。

方法二:?通過Crosstool-ng腳本工具來實現(xiàn)一次編譯,生成交叉編譯工具鏈,該方法相對于方法一要簡單許多,并且出錯的機會也非常少,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈。

方法三 :直接通過網(wǎng)上下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點不用多說,當(dāng)然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構(gòu)建好的,也就是固定的,沒有靈活性,所以構(gòu)建所用的庫以及編譯器的版本也許并不適合你要編譯的程序,同時也許會在使用時出現(xiàn)許多莫名其妙的錯誤,建議讀者慎用此方法。
? ???

crosstool-ng是一個腳本工具,可以制作出適合不同平臺的交叉編譯工具鏈,在進行制作之前要安裝一下軟件:
? ? ?$ sudo apt-get install ?g++ ?libncurses5-dev ?bison ?flex ?texinfo automake ?libtool ?patch ?gcj ?cvs ?cvsd ?gawk?
?????crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然后解壓,接下來就是進行安裝配置了,這個配置優(yōu)點類似內(nèi)核的配置。主要的過程有以下幾點:
? ???1.?設(shè)定源碼包路徑和交叉編譯器的安裝路徑
? ? ?2.?
修改交叉編譯器針對的構(gòu)架

???? 3.?增加編譯時的并行進程數(shù),以增加運行效率,加快編譯,因為這個編譯會比較慢。
? ? ?4.?關(guān)閉JAVA編譯器 ,減少編譯時間
? ? ?5. 編譯
? ? ?6. 添加環(huán)境變量
? ? ?7. 刷新環(huán)境變量。
? ? ?8. 測試交叉工具鏈
? ???

到此,嵌入式Linux系統(tǒng)移植四大部分的第一部分工作全部完成,接下來可以進行后續(xù)的開發(fā)了。

第二部分:bootloader的選擇和移植

一、Boot Loader 概念
? ? ???

就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境,他就是所謂的引導(dǎo)加載程序(Boot Loader)。

【圖1Flash存儲中存放文件的分布圖

?

二、為什么系統(tǒng)移植之前要先移植BootLoader?
? ? ??

BootLoader的任務(wù)是引導(dǎo)操作系統(tǒng),所謂引導(dǎo)操作系統(tǒng),就是啟動內(nèi)核,讓內(nèi)核運行就是把內(nèi)核加載到內(nèi)存RAM中去運行,那先問兩個問題:第一個問題,是誰把內(nèi)核搬到內(nèi)存中去運行?第二個問題:我們說的內(nèi)存是SDRAM,大家都知道,這種內(nèi)存和SRAM不同,最大的不同就是SRAM只要系統(tǒng)上電就可以運行,而SDRAM需要軟件進行初始化才能運行,那么在把內(nèi)核搬運到內(nèi)存運行之前必須要先初始化內(nèi)存吧,那么內(nèi)存是由誰來初始化的呢?其實這兩件事情都是由bootloader來干的,目的是為內(nèi)核的運行準(zhǔn)備好軟硬件環(huán)境,沒有bootloadr我們的系統(tǒng)當(dāng)然不能跑起來。

三、bootloader的分類。
??????

首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,大概的分類如下圖所示:


【圖2bootloader分類圖

? ? ??

由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導(dǎo)程序,而且同時支持X86、ARM和PowerPC等多種處理器架構(gòu)。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發(fā)的用于多種嵌入式CPU的bootloader程序,對于Linux的開發(fā),德國的u-boot做出了巨大的貢獻,而且是開源的。
? ? ??

u-boot具有以下特點:

? ? ??① 開放源碼;
? ? ??② 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
? ? ??③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
? ? ??④ 較高的可靠性和穩(wěn)定性;
? ? ??⑤ 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
? ? ??⑥ 豐富的設(shè)備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
? ? ?⑦ 較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)技術(shù)支持;
? ? ? 其實,把u-boot可以理解為是一個小型的操作系統(tǒng)。

四、u-boot的目錄結(jié)構(gòu)


? ? ? * board 目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動;
? ? ??* common 獨立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;
? ? ??* cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動及中斷初始化等文件;
? ? ??* driver 通用設(shè)備驅(qū)動,如CFI FLASH驅(qū)動(目前對INTEL FLASH支持較好)
? ? ??* doc U-Boot的說明文檔;
? ? ??* examples可在U-Boot下運行的示例程序;如hello_world.c,timer.c;
? ? ??* 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 上電自檢文件目錄。尚有待于進一步完善;
? ? ??* rtc RTC驅(qū)動程序;
? ? ??* tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具;

五、u-boot的工作模式
? ? ??

U-Boot的工作模式有啟動加載模式和下載模式。啟動加載模式是Bootloader的正常工作模式,嵌入式產(chǎn)品發(fā)布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統(tǒng)從FLASH中加載到SDRAM中運行,整個過程是自動的。下載模式就是Bootloader通過某些通信手段將內(nèi)核映像或根文件系統(tǒng)映像等從PC機中下載到目標(biāo)板的SDRAM中運行,用戶可以利用Bootloader提供的一些令接口來完成自己想要的操作,這種模式主要用于測試和開發(fā)。

六、u-boot的啟動過程
? ? ??

大多數(shù)BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語言來實現(xiàn),而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。


1、 stage1(start.s代碼結(jié)構(gòu))
?U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由于一個可執(zhí)行的image必須有一個入口點,并且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設(shè)置異常向量(exception vector)。
(3)設(shè)置CPU的速度、時鐘頻率及中斷控制寄存器。
(4)初始化內(nèi)存控制器 。
(5)將rom中的程序復(fù)制到ram中。
(6)初始化堆棧 。
(7)轉(zhuǎn)到ram中執(zhí)行,該工作可使用指令ldrpc來完成。


2、 stage2(C語言代碼部分)


lib_arm/board.c中的start armboot是C語言開始的函數(shù),也是整個啟動代碼中C語言的主函數(shù),同時還是整個u-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作:
(1)調(diào)用一系列的初始化函數(shù)。
(2)初始化flash設(shè)備。
(3)初始化系統(tǒng)內(nèi)存分配函數(shù)。
(4)如果目標(biāo)系統(tǒng)擁有nand設(shè)備,則初始化nand設(shè)備。
(5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備。
(6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫ip,c地址等。
(7)進入命令循環(huán)(即整個boot的工作循環(huán)),接受用戶從串口輸入的命令,然后進行相應(yīng)的工作。

七、基于cortex-a8的s5pc100bootloader啟動過程分析


s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:


1.?S5PC100 USB啟動過程


[1] A8 reset, 執(zhí)行iROM中的程序
[2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4,撥到4對面),判斷從哪里啟動(USB)
[3] iROM中的程序會初始化USB,然后等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續(xù)接管A8, 然后等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader

2.?S5PC100 Nandflash啟動過程


[1] A8 reset, 執(zhí)行IROM中的程序
[2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4,撥到靠4那邊),判斷從哪里啟動(Nandflash)
[3] iROM中的程序驅(qū)動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷貝完整的BootLoader到SDRAM并運行
[6] BootLoader拷貝內(nèi)核到SDRAM,并運行它
[7] 內(nèi)核運行起來后,掛載rootfs,并且運行系統(tǒng)初始化腳本

八、u-boot移植(基于cortex_a8s5pc100為例)


1.建立自己的平臺


(1).下載源碼包2010.03版本,比較穩(wěn)定
(2).解壓后添加我們自己的平臺信息,以smdkc100為參考版,移植自己s5pc100的開發(fā)板
(3).修改相應(yīng)目錄的文件名,和相應(yīng)目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平臺進行相應(yīng)的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).“開關(guān)”相應(yīng)的宏定義
(7).添加Nand和網(wǎng)卡的驅(qū)動代碼
(8).優(yōu)化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發(fā)板) ? make(編譯出我們的u-boot.bin鏡像文件)
(10).設(shè)置環(huán)境變量,即啟動參數(shù),把編譯好的u-boot下載到內(nèi)存中運行,過程如下:
1. 配置開發(fā)板網(wǎng)絡(luò)
? ? ? ?ip地址配置:
? ? ? ?$setenv ipaddr 192.168.0.6 ? ? ? ? ? ? ? 配置ip地址到內(nèi)存的環(huán)境變量
? ? ? ?$saveenv ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 保存環(huán)境變量的值到nandflash的參數(shù)區(qū)

? ? ? ?網(wǎng)絡(luò)測試:
? ? ? ?在開發(fā)開發(fā)板上ping虛擬機:
? ? ? ?$ ping 192.168.0.157(虛擬機的ip地址)
?
? ? ???如果網(wǎng)絡(luò)測試失敗,從下面幾個方面檢查網(wǎng)絡(luò):
? ? ???1. 網(wǎng)線連接好
? ? ? ?2. 開發(fā)板和虛擬機的ip地址是否配置在同一個網(wǎng)段
? ? ? ?3. 虛擬機網(wǎng)絡(luò)一定要采用橋接(VM--Setting-->option)
? ? ? ?4. 連接開發(fā)板時,虛擬機需要設(shè)置成靜態(tài)ip地址

? ? 2. 在開發(fā)板上,配置tftp服務(wù)器(虛擬機)的ip地址
? ? ? ?$setenv serverip 192.168.0.157(虛擬機的ip地址)
? ? ? ?$saveenv
? ? 3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
? ? 4. 通過tftp下載u-boot.bin到開發(fā)板內(nèi)存
? ? ? ?$ tftp 20008000(內(nèi)存地址即可) u-boot.bin(要下載的文件名)

? ? ? ?如果上面的命令無法正常下載:
? ? ? ?1. serverip配置是否正確
? ? ? ?2. tftp服務(wù)啟動失敗,重啟tftp服務(wù)
? ? ? ? ? #sudo service tftpd-hpa restart

? ? 5. 燒寫u-boot.bin到nandflash的0地址
? ? ? ?$nand erase 0(起始地址) ?40000(大小) ? ? ? ? ? ? ? ? ? ?擦出nandflash 0 - 256k的區(qū)域
? ? ? ?$nand write 20008000((緩存u-boot.bin的內(nèi)存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)
? ??
? ? 6. 切換開發(fā)板的啟動方式到nandflash
? ? ? ?1. 關(guān)閉開發(fā)板
? ? ? ?2. 把SW1的開關(guān)4撥到4的那邊
? ? ? ?3. 啟動開發(fā)板,它就從nandflash啟動

第三部分:kernel的配置、編譯、和移植

一、將下載好的linux-2.6.35.tar.bz2拷貝到主目錄下解壓

二、修改頂層目錄下的Makefile,主要修改平臺的體系架構(gòu)和交叉編譯器,代碼如下:
? ???

?ARCH ? ??= $(SUBARCH)
? ? ??CROSS_COMPILE ??=
? ? ??CROSS_COMPILE ??= $(CONFIG_CROSS_COMPILE:"%"=%)
??????修改以上代碼為:
? ? ??ARCH ? ??= arm ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??---->體系架構(gòu)是arm架構(gòu)
? ? ?CROSS_COMPILE ??= arm-cortex_a8-linux-gnueabi- ? ?---->交叉編譯器是arm-cortex_a8平臺的
????? 注意:這兩個變量值會直接影響頂層Makefile的編譯行為,即選擇編譯哪些代碼,用什么編譯器進行編譯。

三、拷貝標(biāo)準(zhǔn)版配置文件,目的是得到跟我們開發(fā)板相關(guān)的配置信息。


$ cp arch/arm/configs/s5pc100_defconfig ? ?.config
? ? ??

這里拷貝arch/arm/configs/s5pc100_defconfig到 ?.config文件是選取跟我們開發(fā)板相關(guān)的代碼。因為Linux支持的平臺非常非常多,不僅僅是ARM處理器,當(dāng)然我們編譯的時候只需要編譯跟我們平臺相關(guān)的代碼就可以了,平臺相關(guān)的不需要編譯,那么就有個問題,Linux系統(tǒng)中的源代碼文件有一萬多以個,面對這么龐大的文件數(shù)量,我們?nèi)绾稳ミx擇呢?
? ? ???

其實,我們擔(dān)心的問題也是寫操作系統(tǒng)的那哥們早就擔(dān)心過的問題了,只不過人家已經(jīng)把這個問題幫我們解決了,我們只需進行很簡單的操作,就可以選擇出我們要編譯的代碼,具體的方法就是把相應(yīng)平臺的_deconfig直接拷貝到頂層目錄的.config文件中,這樣.config文件中就記錄了我們要移植平臺的平臺信息,因為在配置內(nèi)核時,系統(tǒng)會把所有的配置信息都保存在頂層目錄的.config文件中。注意在第一次,進行make menuconfig時,系統(tǒng)會根據(jù)我們選取的平臺信息自動選取相關(guān)的代碼和模塊,因此我們只需要進入然后再退出,選擇保存配置信息就行了,系統(tǒng)會把這些跟我們移植平臺相關(guān)的所有配置信息全部保存在頂層目錄的.config文件中。

四、配置內(nèi)核
? ? ??

$make menuconfig
? ???

注意:第一次進去,不做任何操作,直接推出,在推出時提示是否保存配置信息,一定要保存配置信息,點擊“YES”。這樣我們的.config中就已經(jīng)保存了我們開發(fā)平臺的信息。
? ? ???

在這個環(huán)節(jié),我們需要關(guān)心一個問題,make menuconfig時,系統(tǒng)到低都做了哪些事情?為什么會出現(xiàn)圖形化的界面?圖形化的界面中的相關(guān)內(nèi)容是從哪里來的?
????? ??

圖形化的界面當(dāng)然是由一個特殊的圖形庫來實現(xiàn)的,還記得第一次make menuconfig時,系統(tǒng)并沒有出現(xiàn)圖形化的界面,而是報錯了,并且提示我們?nèi)鄙?ncurses-devel ,此時只需要按照要求安裝一個libncurses5-dev就行了,sudo apt-get install libncurses5-dev,有了這個圖形化庫的支持,我們才能夠正常顯示圖形化界面。
? ? ???

好了,圖形化界面的問題解決了,那還有另外一個問題就是圖形化界面里面的內(nèi)容是從哪里來的?要回答這個問題,我們就要提一下Linux內(nèi)核的設(shè)計思想了,Linux 內(nèi)核是以模塊的方式來組織這個操作系統(tǒng)的,那么,為什么要用模塊的方式來組織呢?模塊的概念又是什么呢?在此來一一回答這個問題。
? ? ??

Linux2.6內(nèi)核的源碼樹目錄下一般都會有兩個文件:Kconfig和Makefile。分布在各目錄下的Kconfig構(gòu)成了一個分布式的內(nèi)核配置數(shù)據(jù)庫,每個Kconfig分別描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單。每個目錄都會存放功能相對獨立的信息,在每個目錄中會存放各個不同的模塊信息,比如在/dev/char/目錄下就存放了所有字符設(shè)備的驅(qū)動程序,而這些程序代碼在內(nèi)核中是以模塊的形式存在的,也就是說當(dāng)系統(tǒng)需要這個驅(qū)動的時候,會把這個驅(qū)動以模塊的方式編譯到系統(tǒng)的內(nèi)核中,編譯分為靜態(tài)編譯和動態(tài)編譯,靜態(tài)編譯內(nèi)核體積比動態(tài)編譯的體積要大,前面已經(jīng)說了每個目錄下面都會有一個Kconfig的文件,我們還會問,這個文件中都存放了什么信息?前面說了,每個目錄的Kconfig文件描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單,有其特殊的語法格式,圖形化界面的文字正是從這個文件中讀取出來的,如果把這個文件中的相應(yīng)目錄文件的信息全部刪除,那么在圖形化界面中將看不到該模塊的信息,因此也不能進行模塊的配置。
? ? ???

在內(nèi)核配置make menuconfig(或xconfig等)時,系統(tǒng)會自動從Kconfig中讀出配置菜單,用戶配置完后保存到.config(在頂層目錄下生成)中。在內(nèi)核編譯時,主Makefile調(diào)用這個.config,(.config的重要性就體現(xiàn)在,它保存了我們的所有的配置信息,是我們選取源代碼并且進行編譯源代碼的最終依據(jù)?。?!)就知道了用戶對內(nèi)核的配置情況。上面的內(nèi)容說明:Kconfig就是對應(yīng)著內(nèi)核的配置菜單。假如要想添加新的驅(qū)動到內(nèi)核的源碼中,可以通過修改Kconfig來增加對我們驅(qū)動的配置菜單,這樣就有途徑選擇我們的驅(qū)動,假如想使這個驅(qū)動被編譯,還要修改該驅(qū)動所在目錄下的Makefile。因此,一般添加新的驅(qū)動時需要修改的文件有兩種,即:Kconfig ?和相應(yīng)目錄的Makefile(注意不只是兩個),系統(tǒng)移植的重要內(nèi)容就是給內(nèi)核添加和刪除相應(yīng)的模塊,因此主要修改的內(nèi)核文件就是Kconfig 和相應(yīng)目錄的Makefile這兩個文件。

五、編譯內(nèi)核
? ???

$make zImage
? ? ??

通過上述操作我們能夠在 arch/arm/boot 目錄下生成一個 zImage 文件,這就是經(jīng)過壓縮的內(nèi)核鏡像。
? ? ???

內(nèi)核的編譯過程是非常復(fù)雜的,注意這里的編譯是靜態(tài)編譯,此時會執(zhí)行頂層目錄下的Makefile中的zImage命令,在執(zhí)行的過程中,會根據(jù)當(dāng)前目錄的.config文件去選擇編譯源代碼。編譯內(nèi)核的具體步驟比較復(fù)雜,有時間會另寫文章詳細(xì)描述。

六、通過tftp網(wǎng)絡(luò)服務(wù)下載測試內(nèi)核
????? ?setenv bootcmd tftp 20008000(內(nèi)存地址) zImage;go 20008000
? ? ? ?setenv bootargs nfs nfsroot=192.168.1.199(虛擬機的ip):/source/rootfs ip=192.168.1.200(開發(fā)板的ip)??init=/linuxrc(第一個要啟動的用戶進程) ttySAC0,115200(設(shè)置中斷為串口1,波特率為:115200)??? ?
???????

保存環(huán)境變量,復(fù)位開發(fā)板,測試是否能夠正常啟動(注意:在此之前應(yīng)設(shè)置好需要nfs掛載的文件系統(tǒng),最后才能看到效果).內(nèi)核測試和啟動過程也是比較復(fù)雜的,在后續(xù)的文章中會詳細(xì)介紹。

第四部分:根文件系統(tǒng)的介紹
????

由本文的第一張圖:Flash存儲中存放文件的分布圖可知,文件系統(tǒng)的制作和移植是系統(tǒng)移植的最后一道工序了,在這里首先要提幾個問題:
? ??1.什么是文件系統(tǒng)?
? ??2.如何實現(xiàn)文件系統(tǒng)?
? ? 3.常用的文件系統(tǒng)有哪些?為什么需要這些文件系統(tǒng)?
? ??

下面來一一回答這些問題:

文件系統(tǒng)我們在日常生活中則很少聽說,但是它確實存在,只是名字不叫文件系統(tǒng)罷了,一般叫資料庫。資料庫里面的文件眾多,我們?nèi)绾慰焖贉?zhǔn)確的找到我們要的那份文件呢?資料庫采用了分類索引的方法來實現(xiàn)快速查找。類似于我們學(xué)校圖書館的管理方式,一樓可能是哲學(xué)類,二樓是社科類的,三樓是電子類的,四樓是計算機類的…………等等,我們把這種進行了分類索引的資料庫叫文件系統(tǒng)。
? ??

對于計算機而言,文件其實就是資料數(shù)據(jù),只能存儲在物理介質(zhì)上面,比如:硬盤,但是我們?nèi)瞬豢赡茏约鹤x取物理介質(zhì)上的文件,或者自己把文件寫入物理介質(zhì),物理介質(zhì)上文件的讀寫只能采用程序來完成,為了方便實現(xiàn),程序又被分成了物理介質(zhì)驅(qū)動程序、內(nèi)容存儲程序和文件內(nèi)容存儲程序。物理介質(zhì)驅(qū)動程序?qū)iT用于從物理介質(zhì)上存取數(shù)據(jù);內(nèi)容存儲程序用于把文件內(nèi)容和文件屬性信息打包;文件內(nèi)容存儲程序用于把用戶輸入形成文件內(nèi)容,或者取得文件內(nèi)容顯示出來。


我們可以把一個文件系統(tǒng)(倒樹)分解成多個文件系統(tǒng)(倒樹)分別存放到存儲介質(zhì)上,比如:一個存儲到光盤里,一個存儲到硬盤中,在使用時,我們把光盤里的文件系統(tǒng)的根目錄掛到硬盤文件系統(tǒng)的一個目錄下面,這樣訪問這個目錄就相當(dāng)于是訪問光盤的根目錄了,找到了根目錄,我們也就可以訪問整個光盤上的文件系統(tǒng)了。


“在Linux系統(tǒng)中一切皆是文件”這句話是我們學(xué)習(xí)Linux系統(tǒng)的時候常常聽到的一句話。雖然有些夸張,但是它揭示了文件系統(tǒng)對于Linux系統(tǒng)的重要性;實際上文件系統(tǒng)對于所有的操作系統(tǒng)都很重要,因為它們把大部分的硬件設(shè)備和軟件數(shù)據(jù)以文件的形式進行管理。Linux系統(tǒng)對設(shè)備和數(shù)據(jù)的管理框架圖如下:



【圖3】文件系統(tǒng)實現(xiàn)


[說明]

A.?VFS(virtual?file?system)是虛擬文件系統(tǒng),它管理特殊文件(虛擬文件)、磁盤文件和設(shè)備文件

B.?fs_operations結(jié)構(gòu)是由一系列文件操作接口函數(shù)組成,由文件系統(tǒng)層來完成,為VFS提供文件操作;

C.?在文件系統(tǒng)層,磁盤文件要實現(xiàn)各種文件系統(tǒng)(如:ext2),設(shè)備文件要實現(xiàn)各種抽象的設(shè)備驅(qū)動

D.?在設(shè)備驅(qū)動層,磁盤驅(qū)動要實現(xiàn)各種磁盤的驅(qū)動程序,其他設(shè)備驅(qū)動要實現(xiàn)具體的設(shè)備驅(qū)動

E.?物理層就是設(shè)備自身


? ?為什么會有不同的文件類型?


由于存儲介質(zhì)有很多種,所以沒有辦法用一種統(tǒng)一的格式存放文件系統(tǒng)到各種不同的存儲介質(zhì)上,而是需要多種不同的存儲格式來適應(yīng)各種存儲介質(zhì)的特性,以求達(dá)到存取效率和空間利用率的最優(yōu)化,這樣就需要對每種存儲格式制定一個規(guī)范,這寫規(guī)范就叫文件系統(tǒng)類型。常見的文件系統(tǒng)類型有:
1.Dos
? FAT16
2.windows
? FAT16、FAT32、NTFS
3.Linux
? Minix、ext、ext2 、ext3 、ISO9660 、jffs2, yaffs, yaffs2、cramfs, romfs, ramdisk, rootfs、proc、sysfs、usbfs、devpts、 tmpfs & ramfs、 NFS


? ? 由此可見,Linux支持的文件系統(tǒng)最多。以不同的介質(zhì)來分類,如下所示:
? ?磁盤
? ??FAT16、 FAT16、FAT32、NTFS、ext、ext2 、ext3、Minix
? ?光盤
? ??ISO9660、
? ?Flash
? ??jffs2, yaffs, yaffs2、cramfs, romfs
? ?內(nèi)存
? ??Ramdisk、tmpfs & ramfs
? ?虛擬
? ??rootfs、proc、sysfs、usbfs、devpts、NFS
????

常用的存儲介質(zhì)理論上都可以用于存儲Linux支持的文件系統(tǒng);因為我們這里只研究嵌入式系統(tǒng),而嵌入式系統(tǒng)由于體積和移動特性的限制,不能采用磁盤和光盤,所以只能采用flash類的存儲設(shè)備、內(nèi)存和虛擬存儲設(shè)備作為文件系統(tǒng)的存儲介質(zhì);?

flash芯片的驅(qū)動程序是由系統(tǒng)來提供,所以它的存取特點完全是flash自身的特點,這時最好有更加適合flash的文件系統(tǒng)——Jffs、Yaffs、Cramfs和Romfs。這些文件系統(tǒng)都是嵌入式Linux系統(tǒng)中常用的文件系統(tǒng),可以根據(jù)特點來選擇使用它們,特點如下:
共同點
基于MTD驅(qū)動
Jffs
??A.針對NOR Flash的實現(xiàn)
??B.基于哈希表的日志型文件系統(tǒng)
??C.采取損耗平衡技術(shù),每次寫入時都會盡量使寫入的位置均勻分布
??D.可讀寫,支持?jǐn)?shù)據(jù)壓縮
??E.崩潰/掉電安全保護
??F.當(dāng)文件系統(tǒng)已滿或接近滿時,因為垃圾收集的關(guān)系,運行速度大大放慢
Yaffs
? A.針對Nand Flash的實現(xiàn)
??B.日志型文件系統(tǒng)
??C.采取損耗平衡技術(shù),每次寫入時都會盡量使寫入的位置均勻分布
??D.可讀寫,不支持?jǐn)?shù)據(jù)壓縮
??E.掛載時間短,占用內(nèi)存小
??F.自帶Nandflash驅(qū)動,可以不使用VFS和MTD
Cramfs
??A.單頁壓縮,支持隨機訪問,壓縮比高達(dá)2:1
??B.速度快,效率高
??C.只讀,有利于保護文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性,但是無法對其內(nèi)容進行擴充
Romfs
??A.簡單的、緊湊的、只讀的文件系統(tǒng)?
??B.順序存放數(shù)據(jù),因而支持應(yīng)用程序以XIP(execute In Place,片內(nèi)運行)方式運行,在系統(tǒng)運行時,節(jié)省RAM空間?

????特有的文件系統(tǒng)類型:
Ramdisk文件系統(tǒng)

????

Linux系統(tǒng)中,內(nèi)存經(jīng)常用于存儲文件系統(tǒng),這種叫做RamdiskRamdisk有兩種,一種是完全把內(nèi)存看成物理存儲介質(zhì),利用內(nèi)存模擬磁盤,運用磁盤的文件系統(tǒng)類型;另一種只是在內(nèi)存中存儲了文件系統(tǒng)邏輯結(jié)構(gòu),運用tmpfs?&?ramfs文件系統(tǒng)類型:
????tmpfs & ramfs
????

1.?概述
????用物理內(nèi)存模擬磁盤分區(qū),掛載這種分區(qū)后,就可以跟讀寫磁盤文件一樣讀寫這里面的文件,但是操作速度要比磁盤文件快得多;所以一般應(yīng)用在下面幾個方面:
? ? 1)讀寫速度要求快的文件應(yīng)該放在這種文件系統(tǒng)中
? ? 2)磁盤分區(qū)為flash的情況下,把需要經(jīng)常讀寫的文件放在這種文件系統(tǒng)中,然后定期寫回flash
? ? 3)系統(tǒng)中的臨時文件,如/tmp、/var目錄下的文件應(yīng)該放在這種文件系統(tǒng)中
? ? 4)/dev設(shè)備文件(因為設(shè)備文件隨驅(qū)動和設(shè)備的加載和卸載而變化),應(yīng)該放在這種文件系統(tǒng)中
? ??

2.?特點?
? ? 1)由于數(shù)據(jù)都存放在物理內(nèi)存中,所以系統(tǒng)重啟后,這個文件系統(tǒng)中的數(shù)據(jù)會全部丟失
? ? 2)ramfs在沒有指定最大的大小值情況下,會自動增長,直到用掉系統(tǒng)中所有的物理內(nèi)存為止,這時會導(dǎo)致系統(tǒng)的崩潰,建議掛載時最好限定其最大的大小值
? ? 3)tmpfs如果指定了大小值,自動增長至大小值后,系統(tǒng)會限定它的大??;這個文件系統(tǒng)占用的物理內(nèi)存頁可以背置換到swap分區(qū),但是ramfs不行



不同的文件系統(tǒng)具有不同的制作方法,有的比較復(fù)雜,有的比較簡單,在此由于篇幅限制,先不做介紹,在后續(xù)的文章中會單獨介紹文件系統(tǒng)的制作。
?

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉