嵌入式Linux系統(tǒng)移植的四大步驟

最近在學(xué)習(xí)系統(tǒng)移植的相關(guān)知識(shí)符匾,在學(xué)習(xí)和調(diào)試過程中,發(fā)現(xiàn)了很多問題像啼,也解決了很多問題,但總是對(duì)于我們的開發(fā)結(jié)果有一種莫名其妙的感覺潭苞,糾其原因忽冻,主要對(duì)于我們的開發(fā)環(huán)境沒有一個(gè)深刻的認(rèn)識(shí),有時(shí)候幾個(gè)簡(jiǎn)單的命令就可以完成非常復(fù)雜的功能旗唁,可是我們有沒有想過棕孙,為什么會(huì)有這樣的效果?如果沒有去追問猛蔽,只是機(jī)械地完成湖笨,并且看到實(shí)驗(yàn)效果旗扑,這樣做其實(shí)并沒有真正的掌握系統(tǒng)移植的本質(zhì)。
在做每一個(gè)步驟的時(shí)候赶么,首先問問自己肩豁,為什么要這樣做,然后再問問自己正在做什么辫呻?搞明白這幾個(gè)問題清钥,我覺得就差不多了,以后不管更換什么平臺(tái)放闺,什么芯片祟昭,什么開發(fā)環(huán)境,你都不會(huì)迷糊怖侦,很快就會(huì)上手篡悟。對(duì)于嵌入式的學(xué)習(xí)方法,我個(gè)人方法就是:從宏觀上把握(解決為什么的問題)匾寝,微觀上研究(解決正在做什么的問題)搬葬,下面以自己學(xué)習(xí)的arm-cortex_a8開發(fā)板為目標(biāo),介紹下自己的學(xué)習(xí)方法和經(jīng)驗(yàn)艳悔。 嵌入式Linux系統(tǒng)移植主要由四大部分組成: 一急凰、搭建交叉開發(fā)環(huán)境 二、bootloader的選擇和移植 三猜年、kernel的配置抡锈、編譯、和移植 四乔外、根文件系統(tǒng)的制作 第一部分:搭建交叉開發(fā)環(huán)境

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

先回答第一個(gè)問題撇簿,在嵌入式開發(fā)中,交叉開發(fā)是很重要的一個(gè)概念差购,開發(fā)的第一個(gè)環(huán)節(jié)就是搭建環(huán)境补疑,第一步不能完成,后面的步驟從無談起歹撒,這里所說的交叉開發(fā)環(huán)境主要指的是:在開發(fā)主機(jī)上(通常是我的pc機(jī))開發(fā)出能夠在目標(biāo)機(jī)(通常是我們的開發(fā)板)上運(yùn)行的程序莲组。嵌入式比較特殊的是不能在目標(biāo)機(jī)上開發(fā)程序(狹義上來說),因?yàn)閷?duì)于一個(gè)原始的開發(fā)板暖夭,在沒有任何程序的情況下它根本都跑不起來锹杈,為了讓它能夠跑起來撵孤,我們還必須要借助pc機(jī)進(jìn)行燒錄程序等相關(guān)工作,開發(fā)板才能跑起來竭望,這里的pc機(jī)就是我們說的開發(fā)主機(jī)邪码,想想如果沒有開發(fā)主機(jī),我們的目標(biāo)機(jī)基本上就是無法開發(fā)咬清,這也就是電子行業(yè)的一句名言:搞電子闭专,說白了,就是玩電腦旧烧!
然后回答第二個(gè)問題影钉,為什么需要交叉開發(fā)環(huán)境?主要原因有以下幾點(diǎn): 原因****1:嵌入式系統(tǒng)的硬件資源有很多限制掘剪,比如cpu主頻相對(duì)較低平委,內(nèi)存容量較小等,想想讓幾百M(fèi)HZ主頻的MCU去編譯一個(gè)Linux kernel會(huì)讓我們等的不耐煩夺谁,相對(duì)來說廉赔,pc機(jī)的速度更快,硬件資源更加豐富匾鸥,因此利用pc機(jī)進(jìn)行開發(fā)會(huì)提高開發(fā)效率蜡塌。 原因2:嵌入式系統(tǒng)MCU體系結(jié)構(gòu)和指令集不同,因此需要安裝交叉編譯工具進(jìn)行編譯勿负,這樣編譯的目標(biāo)程序才能夠在相應(yīng)的平臺(tái)上比如:ARM馏艾、MIPS、 POWEPC上正常運(yùn)行笆环。 交叉開發(fā)環(huán)境的硬件組成主要由以下幾大部分1.開發(fā)主機(jī) 2.目標(biāo)機(jī)(開發(fā)板) 3.二者的鏈接介質(zhì)攒至,常用的主要有3中方式:(1)串口線 (2)USB線 (3)網(wǎng)線 對(duì)應(yīng)的硬件介質(zhì)厚者,還必須要有相應(yīng)的軟件“介質(zhì)”支持: 1.對(duì)于串口躁劣,通常用的有串口調(diào)試助手,putty工具等库菲,工具很多账忘,功能都差不多,會(huì)用一兩款就可以熙宇; 2.對(duì)于USB線鳖擒,當(dāng)然必須要有USB的驅(qū)動(dòng)才可以,一般芯片公司會(huì)提供烫止,比如對(duì)于三星的芯片蒋荚,USB下載主要由DNW軟件來完成; 3.對(duì)于網(wǎng)線馆蠕,則必須要有網(wǎng)絡(luò)協(xié)議支持才可以期升,常用的服務(wù)主要兩個(gè) 第一:tftp服務(wù):
主要用于實(shí)現(xiàn)文件的下載惊奇,比如開發(fā)調(diào)試的過程中,主要用tftp把要測(cè)試的bootloader播赁、kernel和文件系統(tǒng)直接下載到內(nèi)存中運(yùn)行颂郎,而不需要預(yù)先燒錄到Flash芯片中,一方面容为,在測(cè)試的過程中乓序,往往需要頻繁的下載,如果每次把這些要測(cè)試的文件都燒錄到Flash中然后再運(yùn)行也可以坎背,但是缺點(diǎn)是:過程比較麻煩替劈,而且Flash的擦寫次數(shù)是由限的;另外一方面:測(cè)試的目的就是把這些目標(biāo)文件加載到內(nèi)存中直接運(yùn)行就可以了沼瘫,而tftp就剛好能夠?qū)崿F(xiàn)這樣的功能抬纸,因此,更沒有必要把這些文件都燒錄到Flash中去 第二:****nfs服務(wù):
主要用于實(shí)現(xiàn)網(wǎng)絡(luò)文件的掛載耿戚,實(shí)際上是實(shí)現(xiàn)網(wǎng)絡(luò)文件的共享湿故,在開發(fā)的過程中,通常在系統(tǒng)移植的最后一步會(huì)制作文件系統(tǒng)膜蛔,那么這是可以把制作好的文件系統(tǒng)放置在我們開發(fā)主機(jī)PC的相應(yīng)位置坛猪,開發(fā)板通過nfs服務(wù)進(jìn)行掛載,從而測(cè)試我們制作的文件系統(tǒng)是否正確皂股,在整個(gè)過程中并不需要把文件系統(tǒng)燒錄到Flash中去墅茉,而且掛載是自動(dòng)進(jìn)行掛載的,bootload啟動(dòng)后呜呐,kernel運(yùn)行起來后會(huì)根據(jù)我們?cè)O(shè)置的啟動(dòng)參數(shù)進(jìn)行自動(dòng)掛載就斤,因此,對(duì)于開發(fā)測(cè)試來講蘑辑,這種方式非常的方便洋机,能夠提高開發(fā)效率。 另外洋魂,還有一個(gè)名字叫samba
的服務(wù)也比較重要绷旗,主要用于文件的共享,這里說的共享和nfs的文件共享不是同一個(gè)概念副砍,nfs的共享是實(shí)現(xiàn)網(wǎng)絡(luò)文件的共享衔肢,而samba實(shí)現(xiàn)的是開發(fā)主機(jī)上
Windows主機(jī)和Linux虛擬機(jī)之間的文件共享,是一種跨平臺(tái)的文件共享
豁翎,方便的實(shí)現(xiàn)文件的傳輸角骤。 以上這幾種開發(fā)的工具在嵌入式開發(fā)中是必備的工具,對(duì)于嵌入式開發(fā)的效率提高做出了偉大的貢獻(xiàn)心剥,因此邦尊,要對(duì)這幾個(gè)工具熟練使用硼控,這樣你的開發(fā)效率會(huì)提高很多。等測(cè)試完成以后胳赌,就會(huì)把相應(yīng)的目標(biāo)文件燒錄到Flash中去牢撼,也就是等發(fā)布產(chǎn)品的時(shí)候才做的事情,因此對(duì)于開發(fā)人員來說疑苫,所有的工作永遠(yuǎn)是測(cè)試熏版。 通過前面的工作,我們已經(jīng)準(zhǔn)備好了交叉開發(fā)環(huán)境的硬件部分和一部分軟件捍掺,最后還缺少交叉編譯器撼短,讀者可能會(huì)有疑問,為什么要用交叉編譯器挺勿?前面已經(jīng)講過曲横,交叉開發(fā)環(huán)境必然會(huì)用到交叉編譯工具,通俗地講就是在一種平臺(tái)上編譯出能運(yùn)行在體系結(jié)構(gòu)不同的另一種平臺(tái)上的程序不瓶,開發(fā)主機(jī)PC平臺(tái)(X86 CPU)上編譯出能運(yùn)行在以ARM為內(nèi)核的CPU平臺(tái)上的程序禾嫉,編譯得到的程序在X86 CPU平臺(tái)上是不能運(yùn)行的,必須放到ARM CPU平臺(tái)上才能運(yùn)行蚊丐,雖然兩個(gè)平臺(tái)用的都是Linux系統(tǒng)熙参。相對(duì)于交叉編譯,平常做的編譯叫本地編譯麦备,也就是在當(dāng)前平臺(tái)編譯孽椰,編譯得到的程序也是在本地執(zhí)行。用來編譯這種跨平臺(tái)程序的編譯器就叫交叉編譯器凛篙,相對(duì)來說黍匾,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標(biāo)機(jī)上運(yùn)行的程序呛梆,必須要用交叉編譯工具鏈來完成锐涯。
這里又有一個(gè)問題,不就是一個(gè)交叉編譯工具嗎削彬?為什么又叫交叉工具鏈呢全庸?原因很簡(jiǎn)單秀仲,程序不能光編譯一下就可以運(yùn)行融痛,還得進(jìn)行匯編和鏈接等過程,同時(shí)還需要進(jìn)行調(diào)試神僵,對(duì)于一個(gè)很大工程雁刷,還需要進(jìn)行工程管理等等,所以保礼,這里 說的交叉編譯工具是一個(gè)由編譯器沛励、連接器和解釋器組成的綜合開發(fā)環(huán)境责语,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統(tǒng)提供C編譯器)和glibc(一些基本的C函數(shù)和其他函數(shù)的定義) 3個(gè)部分組成目派。有時(shí)為了減小libc庫的大小坤候,也可以用別的 c 庫來代替 glibc,例如 uClibc企蹭、dietlibc 和 newlib白筹。
那么,如何得到一個(gè)交叉工具鏈呢谅摄?是從網(wǎng)上下載一個(gè)“程序”然后安裝就可以使用了嗎徒河?回答這個(gè)問題之前先思考這樣一個(gè)問題,我們的交叉工具鏈顧名思義就是在PC機(jī)上編譯出能夠在我們目標(biāo)開發(fā)平臺(tái)比如ARM上運(yùn)行的程序送漠,這里就又有一個(gè)問題了顽照,我們的ARM處理器型號(hào)非常多,難道有專門針對(duì)我們某一款的交叉工具鏈嗎闽寡?若果有的話代兵,可以想一想,這么多處理器平臺(tái)爷狈,每個(gè)平臺(tái)專門定制一個(gè)交叉工具鏈放在網(wǎng)絡(luò)上奢人,然后供大家去下載,想想可能需要找很久才能找到適合你的編譯器淆院,顯然這種做法不太合理何乎,且浪費(fèi)資源!因此土辩,要得到一個(gè)交叉工具鏈支救,就像我們移植一個(gè)Linux內(nèi)核一樣,我們只關(guān)心我們需要的東西拷淘,編譯我們需要的東西在我們的平臺(tái)上運(yùn)行各墨,不需要的東西我們不選擇不編譯,所以启涯,交叉工具鏈的制作方法和系統(tǒng)移植有著很多相似的地方贬堵,也就是說,交叉開發(fā)工具是一個(gè)支持很多平臺(tái)的工具集的集合(類似于Linux源碼)结洼,然后我們只需從這些工具集中找出跟我們平臺(tái)相關(guān)的工具就行了黎做,那么如何才能找到跟我們的平臺(tái)相關(guān)的工具,這就是涉及到一個(gè)如何制作交叉工具鏈的問題了松忍。
通常構(gòu)建交叉工具鏈有如下三種方法:
方法一 :分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼蒸殿,最終生成交叉編譯工具鏈。該方法相對(duì)比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者宏所。如果只是想使用交叉工具鏈酥艳,建議使用下列的方法二構(gòu)建交叉工具鏈。
方法二: 通過Crosstool-ng腳本工具來實(shí)現(xiàn)一次編譯爬骤,生成交叉編譯工具鏈充石,該方法相對(duì)于方法一要簡(jiǎn)單許多,并且出錯(cuò)的機(jī)會(huì)也非常少霞玄,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈赫冬。
方法三 :直接通過網(wǎng)上下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點(diǎn)不用多說溃列,當(dāng)然是簡(jiǎn)單省事劲厌,但與此同時(shí)該方法有一定的弊端就是局限性太大,因?yàn)楫吘故莿e人構(gòu)建好的听隐,也就是固定的补鼻,沒有靈活性,所以構(gòu)建所用的庫以及編譯器的版本也許并不適合你要編譯的程序雅任,同時(shí)也許會(huì)在使用時(shí)出現(xiàn)許多莫名其妙的錯(cuò)誤风范,建議讀者慎用此方法。
crosstool-ng是一個(gè)腳本工具沪么,可以制作出適合不同平臺(tái)的交叉編譯工具鏈硼婿,在進(jìn)行制作之前要安裝一下軟件:
$ 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下載到本地,然后解壓禽车,接下來就是進(jìn)行安裝配置了寇漫,這個(gè)配置優(yōu)點(diǎn)類似內(nèi)核的配置。主要的過程有以下幾點(diǎn):
1. 設(shè)定源碼包路徑和交叉編譯器的安裝路徑
2.

修改交叉編譯器針對(duì)的構(gòu)架

修改交叉編譯器針對(duì)的構(gòu)架
3. 增加編譯時(shí)的并行進(jìn)程數(shù)殉摔,以增加運(yùn)行效率州胳,加快編譯,因?yàn)檫@個(gè)編譯會(huì)比較慢逸月。
4. 關(guān)閉JAVA編譯器 栓撞,減少編譯時(shí)間
5. 編譯
6. 添加環(huán)境變量
7. 刷新環(huán)境變量。
8. 測(cè)試交叉工具鏈
到此碗硬,嵌入式Linux系統(tǒng)移植四大部分的第一部分工作全部完成瓤湘,接下來可以進(jìn)行后續(xù)的開發(fā)了。

第二部分:bootloader的選擇和移植 一恩尾、Boot Loader 概念
就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序弛说。通過這段小程序,我們可以初始化硬件設(shè)備特笋、建立內(nèi)存空間的映射圖剃浇,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境猎物,他就是所謂的引導(dǎo)加載程序(Boot Loader)虎囚。

image

【圖1】Flash存儲(chǔ)中存放文件的分布圖

二、為什么系統(tǒng)移植之前要先移植****BootLoader蔫磨?
BootLoader的任務(wù)是引導(dǎo)操作系統(tǒng)淘讥,所謂引導(dǎo)操作系統(tǒng),就是啟動(dòng)內(nèi)核堤如,讓內(nèi)核運(yùn)行就是把內(nèi)核加載到內(nèi)存RAM中去運(yùn)行蒲列,那先問兩個(gè)問題:第一個(gè)問題,是誰把內(nèi)核搬到內(nèi)存中去運(yùn)行搀罢?第二個(gè)問題:我們說的內(nèi)存是SDRAM蝗岖,大家都知道,這種內(nèi)存和SRAM不同榔至,最大的不同就是SRAM只要系統(tǒng)上電就可以運(yùn)行抵赢,而SDRAM需要軟件進(jìn)行初始化才能運(yùn)行,那么在把內(nèi)核搬運(yùn)到內(nèi)存運(yùn)行之前必須要先初始化內(nèi)存吧唧取,那么內(nèi)存是由誰來初始化的呢铅鲤?其實(shí)這兩件事情都是由bootloader來干的,目的是為內(nèi)核的運(yùn)行準(zhǔn)備好軟硬件環(huán)境枫弟,沒有bootloadr我們的系統(tǒng)當(dāng)然不能跑起來邢享。

三、bootloader的分類淡诗。
首先更正一個(gè)錯(cuò)誤的說法骇塘,很多人說bootloader就是U-boot,這種說法是錯(cuò)誤的韩容,確切來說是u-boot是bootloader的一種绪爸。也就是說bootloader具有很多種類,大概的分類如下圖所示:

[圖片上傳失敗...(image-6cd517-1553392681585)]

【圖2】bootloader分類圖

  由上圖可以看出宙攻,不同的bootloader具有不同的使用范圍奠货,其中最令人矚目的就是有一個(gè)叫U-Boot的bootloader,是一個(gè)通用的引導(dǎo)程序座掘,而且同時(shí)支持X86递惋、ARM和PowerPC等多種處理器架構(gòu)。U-Boot溢陪,全稱 Universal Boot Loader萍虽,是遵循GPL條款的開放源碼項(xiàng)目,是由德國(guó)DENX小組開發(fā)的用于多種嵌入式CPU的bootloader程序形真,對(duì)于Linux的開發(fā)杉编,德國(guó)的u-boot做出了巨大的貢獻(xiàn)超全,而且是開源的。
 ** u-boot具有以下特點(diǎn):**

  ① 開放源碼邓馒;
  ② 支持多種嵌入式操作系統(tǒng)內(nèi)核嘶朱,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS光酣;
  ③ 支持多個(gè)處理器系列疏遏,如PowerPC、ARM救军、x86财异、MIPS、XScale唱遭;
  ④ 較高的可靠性和穩(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ù)支持缝彬;
  其實(shí),把u-boot可以理解為是一個(gè)小型的操作系統(tǒng)哺眯。 **四谷浅、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支持較好)
  * doc U-Boot的說明文檔;
  * examples可在U-Boot下運(yùn)行的示例程序竹海;如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 上電自檢文件目錄园细。尚有待于進(jìn)一步完善;
  * rtc RTC驅(qū)動(dòng)程序接校;
  * tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具猛频;

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

六杜顺、u-boot的啟動(dòng)過程
大多數(shù)BootLoader都分為stage1和stage2兩大部分财搁,U-boot也不例外。依賴于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語言來實(shí)現(xiàn)躬络,而stage2則通常用C語言來實(shí)現(xiàn)尖奔,這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性穷当。
1越锈、 stage1(start.s代碼結(jié)構(gòu))
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成膘滨,其主要代碼部分如下:
(1) 定義入口甘凭。由于一個(gè)可執(zhí)行的image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口火邓,通常這個(gè)入口放在rom(Flash)的0x0地址丹弱,因此德撬,必須通知編譯器以使其知道這個(gè)入口,該工作可通過修改連接器腳本來完成躲胳。
(2)設(shè)置異常向量(exception vector)蜓洪。
(3)設(shè)置CPU的速度、時(shí)鐘頻率及中斷控制寄存器坯苹。
(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ù)裳仆,也是整個(gè)啟動(dòng)代碼中C語言的主函數(shù),同時(shí)還是整個(gè)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)進(jìn)入命令循環(huán)(即整個(gè)boot的工作循環(huán))喘帚,接受用戶從串口輸入的命令,然后進(jìn)行相應(yīng)的工作咒钟。

七吹由、基于cortex-a8的s5pc100bootloader啟動(dòng)過程分析
s5pc100支持兩種啟動(dòng)方式,分別為USB啟動(dòng)方式和NandFlash啟動(dòng)方式:

  1. S5PC100 USB啟動(dòng)過程
    [1] A8 reset, 執(zhí)行iROM中的程序
    [2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4朱嘴,撥到4對(duì)面)倾鲫,判斷從哪里啟動(dòng)(USB)
    [3] iROM中的程序會(huì)初始化USB,然后等待PC機(jī)下載程序
    [4] 利用DNW程序萍嬉,從PC機(jī)下載SDRAM的初始化程序到iRAM中運(yùn)行乌昔,初始化SDRAM
    [5] SDRAM初始化完畢,iROM中的程序繼續(xù)接管A8, 然后等待PC下載程序(BootLoader)
    [6] PC利用DNW下載BootLoader到SDRAM
    [7] 在SDRAM中運(yùn)行BootLoader 2. S5PC100 Nandflash啟動(dòng)過程 [1] A8 reset, 執(zhí)行IROM中的程序
    [2] iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4壤追,撥到靠4那邊)磕道,判斷從哪里啟動(dòng)(Nandflash)
    [3] iROM中的程序驅(qū)動(dòng)Nandflash
    [4] iROM中的程序會(huì)拷貝Nandflash前16k到iRAM
    [5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷貝完整的BootLoader到SDRAM并運(yùn)行
    [6] BootLoader拷貝內(nèi)核到SDRAM行冰,并運(yùn)行它
    [7] 內(nèi)核運(yùn)行起來后溺蕉,掛載rootfs伶丐,并且運(yùn)行系統(tǒng)初始化腳本

八、u-boot移植(基于****cortex_a8****的****s5pc100****為例****)
1.建立自己的平臺(tái)
(1).下載源碼包2010.03版本疯特,比較穩(wěn)定
(2).解壓后添加我們自己的平臺(tái)信息哗魂,以smdkc100為參考版,移植自己s5pc100的開發(fā)板
(3).修改相應(yīng)目錄的文件名漓雅,和相應(yīng)目錄的Makefile录别,指定交叉工具鏈。
(4).編譯
(5).針對(duì)我們的平臺(tái)進(jìn)行相應(yīng)的移植邻吞,主要包括修改SDRAM的運(yùn)行地址组题,從0x20000000
(6).“開關(guān)”相應(yīng)的宏定義
(7).添加Nand和網(wǎng)卡的驅(qū)動(dòng)代碼
(8).優(yōu)化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發(fā)板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設(shè)置環(huán)境變量,即啟動(dòng)參數(shù)吃衅,把編譯好的u-boot下載到內(nèi)存中運(yùn)行往踢,過程如下:
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ò)測(cè)試:
   在開發(fā)開發(fā)板上ping虛擬機(jī):
   $ ping 192.168.0.157(虛擬機(jī)的ip地址)

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

2\. 在開發(fā)板上徘层,配置tftp服務(wù)器(虛擬機(jī))的ip地址
   $setenv serverip 192.168.0.157(虛擬機(jī)的ip地址)
   $saveenv
3\. 拷貝u-boot.bin到/tftpboot(虛擬機(jī)上的目錄)
4\. 通過tftp下載u-boot.bin到開發(fā)板內(nèi)存
   $ tftp 20008000([內(nèi)存地址](https://www.baidu.com/s?wd=%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)即可) u-boot.bin(要下載的文件名)

   如果上面的命令無法正常下載:
   1\. serverip配置是否正確
   2\. tftp服務(wù)啟動(dòng)失敗,重啟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ā)板的啟動(dòng)方式到nandflash
   1\. 關(guān)閉開發(fā)板
   2\. 把SW1的開關(guān)4撥到4的那邊
   3\. 啟動(dòng)開發(fā)板利职,它就從nandflash啟動(dòng) **第三部分:****kernel的配置趣效、編譯、和移植** **一猪贪、將下載好的linux-2.6.35.tar.bz2拷貝到主目錄下解壓** 

二跷敬、修改頂層目錄下的Makefile,主要修改平臺(tái)的體系架構(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平臺(tái)的
注意:這兩個(gè)變量值會(huì)直接影響頂層Makefile的編譯行為西傀,即選擇編譯哪些代碼,用什么編譯器進(jìn)行編譯桶癣。

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

$ cp arch/arm/configs/s5pc100_defconfig .config
這里拷貝arch/arm/configs/s5pc100_defconfig到 .config文件是選取跟我們開發(fā)板相關(guān)的代碼饺鹃。因?yàn)長(zhǎng)inux支持的平臺(tái)非常非常多,不僅僅是ARM處理器间雀,當(dāng)然我們編譯的時(shí)候只需要編譯跟我們平臺(tái)相關(guān)的代碼就可以了悔详,平臺(tái)相關(guān)的不需要編譯,那么就有個(gè)問題惹挟,Linux系統(tǒng)中的源代碼文件有一萬多以個(gè)茄螃,面對(duì)這么龐大的文件數(shù)量,我們?nèi)绾稳ミx擇呢连锯?
其實(shí)归苍,我們擔(dān)心的問題也是寫操作系統(tǒng)的那哥們?cè)缇蛽?dān)心過的問題了党巾,只不過人家已經(jīng)把這個(gè)問題幫我們解決了,我們只需進(jìn)行很簡(jiǎn)單的操作霜医,就可以選擇出我們要編譯的代碼齿拂,具體的方法就是把相應(yīng)平臺(tái)的_deconfig直接拷貝到頂層目錄的.config文件中,這樣.config文件中就記錄了我們要移植平臺(tái)的平臺(tái)信息肴敛,因?yàn)樵谂渲脙?nèi)核時(shí)署海,系統(tǒng)會(huì)把所有的配置信息都保存在頂層目錄的.config文件中。注意在第一次医男,進(jìn)行make menuconfig時(shí)砸狞,系統(tǒng)會(huì)根據(jù)我們選取的平臺(tái)信息自動(dòng)選取相關(guān)的代碼和模塊,因此我們只需要進(jìn)入然后再退出镀梭,選擇保存配置信息就行了刀森,系統(tǒng)會(huì)把這些跟我們移植平臺(tái)相關(guān)的所有配置信息全部保存在頂層目錄的.config文件中。

四报账、配置內(nèi)核
$make menuconfig
注意:第一次進(jìn)去研底,不做任何操作,直接推出透罢,在推出時(shí)提示是否保存配置信息榜晦,一定要保存配置信息,點(diǎn)擊“YES”羽圃。這樣我們的.config中就已經(jīng)保存了我們開發(fā)平臺(tái)的信息乾胶。
在這個(gè)環(huán)節(jié),我們需要關(guān)心一個(gè)問題朽寞,make menuconfig時(shí)识窿,系統(tǒng)到低都做了哪些事情?為什么會(huì)出現(xiàn)圖形化的界面脑融?圖形化的界面中的相關(guān)內(nèi)容是從哪里來的喻频?
圖形化的界面當(dāng)然是由一個(gè)特殊的圖形庫來實(shí)現(xiàn)的,還記得第一次make menuconfig時(shí)吨掌,系統(tǒng)并沒有出現(xiàn)圖形化的界面半抱,而是報(bào)錯(cuò)了,并且提示我們?nèi)鄙?ncurses-devel ,此時(shí)只需要按照要求安裝一個(gè)libncurses5-dev就行了膜宋,sudo apt-get install libncurses5-dev窿侈,有了這個(gè)圖形化庫的支持,我們才能夠正常顯示圖形化界面秋茫。
好了史简,圖形化界面的問題解決了,那還有另外一個(gè)問題就是圖形化界面里面的內(nèi)容是從哪里來的?要回答這個(gè)問題圆兵,我們就要提一下Linux內(nèi)核的設(shè)計(jì)思想了跺讯,Linux 內(nèi)核是以模塊的方式來組織這個(gè)操作系統(tǒng)的,那么殉农,為什么要用模塊的方式來組織呢刀脏?模塊的概念又是什么呢?在此來一一回答這個(gè)問題超凳。
Linux2.6內(nèi)核的源碼樹目錄下一般都會(huì)有兩個(gè)文件:Kconfig和Makefile愈污。分布在各目錄下的Kconfig構(gòu)成了一個(gè)分布式的內(nèi)核配置數(shù)據(jù)庫,每個(gè)Kconfig分別描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單轮傍。每個(gè)目錄都會(huì)存放功能相對(duì)獨(dú)立的信息暂雹,在每個(gè)目錄中會(huì)存放各個(gè)不同的模塊信息,比如在/dev/char/目錄下就存放了所有字符設(shè)備的驅(qū)動(dòng)程序创夜,而這些程序代碼在內(nèi)核中是以模塊的形式存在的杭跪,也就是說當(dāng)系統(tǒng)需要這個(gè)驅(qū)動(dòng)的時(shí)候,會(huì)把這個(gè)驅(qū)動(dòng)以模塊的方式編譯到系統(tǒng)的內(nèi)核中驰吓,編譯分為靜態(tài)編譯和動(dòng)態(tài)編譯涧尿,靜態(tài)編譯內(nèi)核體積比動(dòng)態(tài)編譯的體積要大,前面已經(jīng)說了每個(gè)目錄下面都會(huì)有一個(gè)Kconfig的文件,我們還會(huì)問,這個(gè)文件中都存放了什么信息讨阻?前面說了料按,每個(gè)目錄的Kconfig文件描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單,有其特殊的語法格式瞬内,圖形化界面的文字正是從這個(gè)文件中讀取出來的迷雪,如果把這個(gè)文件中的相應(yīng)目錄文件的信息全部刪除,那么在圖形化界面中將看不到該模塊的信息虫蝶,因此也不能進(jìn)行模塊的配置章咧。
在內(nèi)核配置make menuconfig(或xconfig等)時(shí),系統(tǒng)會(huì)自動(dòng)從Kconfig中讀出配置菜單能真,用戶配置完后保存到.config(在頂層目錄下生成)中赁严。在內(nèi)核編譯時(shí),主Makefile調(diào)用這個(gè).config粉铐,(.config的重要性就體現(xiàn)在疼约,它保存了我們的所有的配置信息,是我們選取源代碼并且進(jìn)行編譯源代碼的最終依據(jù)r谩3贪!)就知道了用戶對(duì)內(nèi)核的配置情況汤踏。上面的內(nèi)容說明:Kconfig就是對(duì)應(yīng)著內(nèi)核的配置菜單织鲸。假如要想添加新的驅(qū)動(dòng)到內(nèi)核的源碼中舔腾,可以通過修改Kconfig來增加對(duì)我們驅(qū)動(dòng)的配置菜單,這樣就有途徑選擇我們的驅(qū)動(dòng)搂擦,假如想使這個(gè)驅(qū)動(dòng)被編譯稳诚,還要修改該驅(qū)動(dòng)所在目錄下的Makefile。因此瀑踢,一般添加新的驅(qū)動(dòng)時(shí)需要修改的文件有兩種采桃,即:Kconfig 和相應(yīng)目錄的Makefile(注意不只是兩個(gè)),系統(tǒng)移植的重要內(nèi)容就是給內(nèi)核添加和刪除相應(yīng)的模塊丘损,因此主要修改的內(nèi)核文件就是Kconfig 和相應(yīng)目錄的Makefile這兩個(gè)文件普办。

五、編譯內(nèi)核
$make zImage
通過上述操作我們能夠在 arch/arm/boot 目錄下生成一個(gè) zImage 文件徘钥,這就是經(jīng)過壓縮的內(nèi)核鏡像衔蹲。
內(nèi)核的編譯過程是非常復(fù)雜的,注意這里的編譯是靜態(tài)編譯呈础,此時(shí)會(huì)執(zhí)行頂層目錄下的Makefile中的zImage命令舆驶,在執(zhí)行的過程中,會(huì)根據(jù)當(dāng)前目錄的.config文件去選擇編譯源代碼而钞。編譯內(nèi)核的具體步驟比較復(fù)雜沙廉,有時(shí)間會(huì)另寫文章詳細(xì)描述。

六臼节、通過tftp網(wǎng)絡(luò)服務(wù)下載測(cè)試內(nèi)核
setenv bootcmd tftp 20008000(內(nèi)存地址) zImage;go 20008000
setenv bootargs nfs nfsroot=192.168.1.199(虛擬機(jī)的ip):/source/rootfs ip=192.168.1.200(開發(fā)板的ip) init=/linuxrc(第一個(gè)要啟動(dòng)的用戶進(jìn)程) ttySAC0,115200(設(shè)置中斷為串口1撬陵,波特率為:115200)
保存環(huán)境變量,復(fù)位開發(fā)板网缝,測(cè)試是否能夠正常啟動(dòng)(注意:在此之前應(yīng)設(shè)置好需要nfs掛載的文件系統(tǒng)巨税,最后才能看到效果).內(nèi)核測(cè)試和啟動(dòng)過程也是比較復(fù)雜的,在后續(xù)的文章中會(huì)詳細(xì)介紹粉臊。

第四部分:****根文件系統(tǒng)的介紹
由本文的第一張圖:Flash存儲(chǔ)中存放文件的分布圖可知草添,文件系統(tǒng)的制作和移植是系統(tǒng)移植的最后一道工序了,在這里首先要提幾個(gè)問題:
** 1.****什么是文件系統(tǒng)扼仲?**
2.****如何實(shí)現(xiàn)文件系統(tǒng)远寸?
** 3.****常用的文件系統(tǒng)有哪些?為什么需要這些文件系統(tǒng)屠凶?**
下面來一一回答這些問題:

文件系統(tǒng)我們?cè)谌粘I钪袆t很少聽說驰后,但是它確實(shí)存在,只是名字不叫文件系統(tǒng)罷了阅畴,一般叫資料庫倡怎。資料庫里面的文件眾多,我們?nèi)绾慰焖贉?zhǔn)確的找到我們要的那份文件呢?資料庫采用了分類索引的方法來實(shí)現(xiàn)快速查找监署。類似于我們學(xué)校圖書館的管理方式颤专,一樓可能是哲學(xué)類,二樓是社科類的钠乏,三樓是電子類的栖秕,四樓是計(jì)算機(jī)類的…………等等,我們把這種進(jìn)行了分類索引的資料庫叫文件系統(tǒng)晓避。
對(duì)于計(jì)算機(jī)而言簇捍,文件其實(shí)就是資料數(shù)據(jù),只能存儲(chǔ)在物理介質(zhì)上面俏拱,比如:硬盤暑塑,但是我們?nèi)瞬豢赡茏约鹤x取物理介質(zhì)上的文件,或者自己把文件寫入物理介質(zhì)锅必,物理介質(zhì)上文件的讀寫只能采用程序來完成事格,為了方便實(shí)現(xiàn),程序又被分成了物理介質(zhì)驅(qū)動(dòng)程序搞隐、內(nèi)容存儲(chǔ)程序和文件內(nèi)容存儲(chǔ)程序驹愚。物理介質(zhì)驅(qū)動(dòng)程序?qū)iT用于從物理介質(zhì)上存取數(shù)據(jù);內(nèi)容存儲(chǔ)程序用于把文件內(nèi)容和文件屬性信息打包劣纲;文件內(nèi)容存儲(chǔ)程序用于把用戶輸入形成文件內(nèi)容逢捺,或者取得文件內(nèi)容顯示出來。

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

“在Linux系統(tǒng)中一切皆是文件”這句話是我們學(xué)習(xí)Linux系統(tǒng)的時(shí)候常常聽到的一句話蕊退。雖然有些夸張郊楣,但是它揭示了文件系統(tǒng)對(duì)于Linux系統(tǒng)的重要性;實(shí)際上文件系統(tǒng)對(duì)于所有的操作系統(tǒng)都很重要瓤荔,因?yàn)樗鼈儼汛蟛糠值挠布O(shè)備和軟件數(shù)據(jù)以文件的形式進(jìn)行管理净蚤。Linux系統(tǒng)對(duì)設(shè)備和數(shù)據(jù)的管理框架圖如下:

[圖片上傳失敗...(image-ec0349-1553392681583)]

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

[說明]

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

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

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

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

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

** 為什么會(huì)有不同的文件類型挺份?**

由于存儲(chǔ)介質(zhì)有很多種,所以沒有辦法用一種統(tǒng)一的格式存放文件系統(tǒng)到各種不同的存儲(chǔ)介質(zhì)上贮懈,而是需要多種不同的存儲(chǔ)格式來適應(yīng)各種存儲(chǔ)介質(zhì)的特性匀泊,以求達(dá)到存取效率和空間利用率的最優(yōu)化,這樣就需要對(duì)每種存儲(chǔ)格式制定一個(gè)規(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

常用的存儲(chǔ)介質(zhì)理論上都可以用于存儲(chǔ)Linux支持的文件系統(tǒng)濒生;因?yàn)槲覀冞@里只研究嵌入式系統(tǒng)埋泵,而嵌入式系統(tǒng)由于體積和移動(dòng)特性的限制,不能采用磁盤和光盤罪治,所以只能采用flash類的存儲(chǔ)設(shè)備丽声、內(nèi)存和虛擬存儲(chǔ)設(shè)備作為文件系統(tǒng)的存儲(chǔ)介質(zhì);

flash芯片的驅(qū)動(dòng)程序是由系統(tǒng)來提供觉义,所以它的存取特點(diǎn)完全是flash自身的特點(diǎn)雁社,這時(shí)最好有更加適合flash的文件系統(tǒng)——Jffs、Yaffs晒骇、Cramfs和Romfs霉撵。這些文件系統(tǒng)都是嵌入式Linux系統(tǒng)中常用的文件系統(tǒng),可以根據(jù)特點(diǎn)來選擇使用它們洪囤,特點(diǎn)如下:
共同點(diǎn)
基于MTD驅(qū)動(dòng)
Jffs
A.針對(duì)NOR Flash的實(shí)現(xiàn)
B.基于哈希表的日志型文件系統(tǒng)
C.采取損耗平衡技術(shù)徒坡,每次寫入時(shí)都會(huì)盡量使寫入的位置均勻分布
D.可讀寫,支持?jǐn)?shù)據(jù)壓縮
E.崩潰/掉電安全保護(hù)
F.當(dāng)文件系統(tǒng)已滿或接近滿時(shí)瘤缩,因?yàn)槔占年P(guān)系喇完,運(yùn)行速度大大放慢
Yaffs
A.針對(duì)Nand Flash的實(shí)現(xiàn)
B.日志型文件系統(tǒng)
C.采取損耗平衡技術(shù),每次寫入時(shí)都會(huì)盡量使寫入的位置均勻分布
D.可讀寫剥啤,不支持?jǐn)?shù)據(jù)壓縮
E.掛載時(shí)間短锦溪,占用內(nèi)存小
F.自帶Nandflash驅(qū)動(dòng),可以不使用VFS和MTD
Cramfs
A.單頁壓縮府怯,支持隨機(jī)訪問刻诊,壓縮比高達(dá)2:1
B.速度快,效率高
C.只讀牺丙,有利于保護(hù)文件系統(tǒng)免受破壞则涯,提高了系統(tǒng)的可靠性,但是無法對(duì)其內(nèi)容進(jìn)行擴(kuò)充
Romfs
A.簡(jiǎn)單的赘被、緊湊的是整、只讀的文件系統(tǒng)
B.順序存放數(shù)據(jù),因而支持應(yīng)用程序以XIP(execute In Place民假,片內(nèi)運(yùn)行)方式運(yùn)行,在系統(tǒng)運(yùn)行時(shí)龙优,節(jié)省RAM空間
特有的文件系統(tǒng)類型:****Ramdisk文件系統(tǒng)
在Linux系統(tǒng)中羊异,內(nèi)存經(jīng)常用于存儲(chǔ)文件系統(tǒng)事秀,這種叫做Ramdisk,Ramdisk有兩種野舶,一種是完全把內(nèi)存看成物理存儲(chǔ)介質(zhì)易迹,利用內(nèi)存模擬磁盤,運(yùn)用磁盤的文件系統(tǒng)類型平道;另一種只是在內(nèi)存中存儲(chǔ)了文件系統(tǒng)邏輯結(jié)構(gòu)睹欲,運(yùn)用tmpfs & ramfs文件系統(tǒng)類型:
** tmpfs & ramfs**
** 1. ****概述**
用物理內(nèi)存模擬磁盤分區(qū),掛載這種分區(qū)后一屋,就可以跟讀寫磁盤文件一樣讀寫這里面的文件窘疮,但是操作速度要比磁盤文件快得多;所以一般應(yīng)用在下面幾個(gè)方面:
1)讀寫速度要求快的文件應(yīng)該放在這種文件系統(tǒng)中
2)磁盤分區(qū)為flash的情況下冀墨,把需要經(jīng)常讀寫的文件放在這種文件系統(tǒng)中闸衫,然后定期寫回flash
3)系統(tǒng)中的臨時(shí)文件,如/tmp诽嘉、/var目錄下的文件應(yīng)該放在這種文件系統(tǒng)中
4)/dev設(shè)備文件(因?yàn)樵O(shè)備文件隨驅(qū)動(dòng)和設(shè)備的加載和卸載而變化)蔚出,應(yīng)該放在這種文件系統(tǒng)中
** 2. ****特點(diǎn) **
1)由于數(shù)據(jù)都存放在物理內(nèi)存中,所以系統(tǒng)重啟后虫腋,這個(gè)文件系統(tǒng)中的數(shù)據(jù)會(huì)全部丟失
2)ramfs在沒有指定最大的大小值情況下骄酗,會(huì)自動(dòng)增長(zhǎng),直到用掉系統(tǒng)中所有的物理內(nèi)存為止悦冀,這時(shí)會(huì)導(dǎo)致系統(tǒng)的崩潰趋翻,建議掛載時(shí)最好限定其最大的大小值
3)tmpfs如果指定了大小值,自動(dòng)增長(zhǎng)至大小值后雏门,系統(tǒng)會(huì)限定它的大泻俑琛;這個(gè)文件系統(tǒng)占用的物理內(nèi)存頁可以背置換到swap分區(qū)茁影,但是ramfs不行

不同的文件系統(tǒng)具有不同的制作方法宙帝,有的比較復(fù)雜,有的比較簡(jiǎn)單募闲,在此由于篇幅限制步脓,先不做介紹,在后續(xù)的文章中會(huì)單獨(dú)介紹文件系統(tǒng)的制作浩螺。
寫了一天靴患,終于寫完了,總結(jié)了一下最近學(xué)的系統(tǒng)移植方面的知識(shí)要出,不是很詳細(xì)鸳君,只是從宏觀上去把握和理解系統(tǒng)移植的過程,在此做一個(gè)記錄患蹂,以備后忘

https://blog.csdn.net/victorwjw/article/details/72864770
http://www.maiziedu.com/wiki/embed/step/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末或颊,一起剝皮案震驚了整個(gè)濱河市砸紊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱挑,老刑警劉巖醉顽,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異平挑,居然都是意外死亡游添,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門通熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唆涝,“玉大人,你說我怎么就攤上這事棠隐∈眨” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵助泽,是天一觀的道長(zhǎng)啰扛。 經(jīng)常有香客問我,道長(zhǎng)嗡贺,這世上最難降的妖魔是什么隐解? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮诫睬,結(jié)果婚禮上煞茫,老公的妹妹穿的比我還像新娘。我一直安慰自己摄凡,他們只是感情好续徽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亲澡,像睡著了一般钦扭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上床绪,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天客情,我揣著相機(jī)與錄音,去河邊找鬼癞己。 笑死膀斋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痹雅。 我是一名探鬼主播仰担,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绩社!你這毒婦竟也來了惰匙?” 一聲冷哼從身側(cè)響起技掏,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤铃将,失蹤者是張志新(化名)和其女友劉穎项鬼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲阎,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绘盟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悯仙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄毡。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锡垄,靈堂內(nèi)的尸體忽然破棺而出沦零,到底是詐尸還是另有隱情,我是刑警寧澤货岭,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布路操,位于F島的核電站,受9級(jí)特大地震影響千贯,放射性物質(zhì)發(fā)生泄漏屯仗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一搔谴、第九天 我趴在偏房一處隱蔽的房頂上張望魁袜。 院中可真熱鬧,春花似錦敦第、人聲如沸峰弹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞠呈。三九已至,卻和暖如春师幕,著一層夾襖步出監(jiān)牢的瞬間粟按,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工霹粥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灭将,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓后控,卻偏偏與公主長(zhǎng)得像庙曙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浩淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 拽不住夜色隱沒 讀不透黎明涼薄 走一個(gè)輪回 桃花是否還在
    三十四閱讀 189評(píng)論 0 1
  • 一大早捌朴,李寧宇走進(jìn)南山區(qū)民政局吴攒。 大廳很敞亮,地板很干凈砂蔽。北側(cè)是休息區(qū)洼怔,大大小小的圓柱形沙發(fā)五顏六色,零散而不凌亂...
    堂吉訶德的那個(gè)桑丘閱讀 1,100評(píng)論 6 7
  • 第八章分析哲學(xué)和教育 分析哲學(xué)不是一種系統(tǒng)化的哲學(xué)左驾,這就是它與理念論镣隶、實(shí)在論或者實(shí)用主義哲學(xué)的不同之處。分析哲學(xué)的...
    CHINASYDH閱讀 478評(píng)論 0 0
  • (國(guó)醫(yī)館劉老師推薦) 牛先生 1988年 屬龍 身高178 學(xué)歷 本科诡右,父母姐姐安岂,太原本地人有車房;畢業(yè)后在江蘇央...
    太原家老馮閱讀 229評(píng)論 0 0