基于S3C2440的linux操作系統(tǒng)內(nèi)核移植和yaffs2文件系統(tǒng)的制作_第1頁
基于S3C2440的linux操作系統(tǒng)內(nèi)核移植和yaffs2文件系統(tǒng)的制作_第2頁
基于S3C2440的linux操作系統(tǒng)內(nèi)核移植和yaffs2文件系統(tǒng)的制作_第3頁
基于S3C2440的linux操作系統(tǒng)內(nèi)核移植和yaffs2文件系統(tǒng)的制作_第4頁
基于S3C2440的linux操作系統(tǒng)內(nèi)核移植和yaffs2文件系統(tǒng)的制作_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Linux內(nèi)核移植和根文件系統(tǒng)制作第一章 移植內(nèi)核. 21.1 Linux內(nèi)核基礎(chǔ)知識. 21.1.1 Linux版本. 21.1.2 什么是標(biāo)準(zhǔn)內(nèi)核. 21.1.3 Linux操作系統(tǒng)的分類. 31.1.4 linux內(nèi)核的選擇. 41.2 Linux內(nèi)核啟動過程概述. 51.2.1 Bootloader啟動過程. 51.2.2 Linux啟動過程. 71.3 Linux內(nèi)核移植. 101.3.1 移植內(nèi)核和根文件系統(tǒng)準(zhǔn)備工作. 101.3.2 修改Linux源碼中參數(shù). 111.3.3 配置Linux內(nèi)核. 151.3.4、編譯內(nèi)核. 17第二章 制作根文件系統(tǒng). 192.1 根文件系統(tǒng)預(yù)

2、備知識. 192.2、構(gòu)建根文件按系統(tǒng). 192.2.1、建立根文件系統(tǒng)目錄. 192.2.2、建立動態(tài)鏈接庫. 212.2.3 交叉編譯Bosybox. 212.2.4 建立etc目錄下的配置文件. 242.2.5 制作根文件系統(tǒng)映像文件. 26第三章 啟動系統(tǒng). 26第四章 總結(jié). 34 第一章 移植內(nèi)核1.1 Linux內(nèi)核基礎(chǔ)知識在動手進(jìn)行Linux內(nèi)核移植之前,非常有必要對Linux內(nèi)核進(jìn)行一定的了解,下面從Linux內(nèi)核的版本和分類說起。1.1.1 Linux版本Linux內(nèi)核的版本號可以從源代碼的頂層目錄下的Makefile中看到,比如內(nèi)核的Makefile中:VERSION =

3、 2PATCHLEVEL = 6SUBLEVEL = 29EXTRAVERSION = .1 其中的“VERSION”和“PATCHLEVEL”組成主版本號,比如2.4、2.5、2.6等,穩(wěn)定版本的德主版本號用偶數(shù)表示(比如2.6的內(nèi)核),開發(fā)中的版本號用奇數(shù)表示(比如2.5),它是下一個穩(wěn)定版本內(nèi)核的前身?!癝UBLEVEL”稱為次版本號,它不分奇偶,順序遞增,每隔12個月發(fā)布一個穩(wěn)定版本?!癊XTRAVERSION”稱為擴(kuò)展版本號,它不分奇偶,順序遞增,每周發(fā)布幾次擴(kuò)展本版號。1.1.2 什么是標(biāo)準(zhǔn)內(nèi)核按照資料上的習(xí)慣說法,標(biāo)準(zhǔn)內(nèi)核(或稱基礎(chǔ)內(nèi)核)就是指主要在/維護(hù)和獲取的內(nèi)核,實(shí)際上它也

4、有平臺屬性的。這些linux內(nèi)核并不總是適用于所有l(wèi)inux支持的體系結(jié)構(gòu)。實(shí)際上,這些內(nèi)核版本很多時候并不是為一些流行的嵌入式linux系統(tǒng)開發(fā)的,也很少運(yùn)行于這些嵌入式linux系統(tǒng)上,這個站點(diǎn)上的內(nèi)核首先確保的是在Intel X86體系結(jié)構(gòu)上可以正常運(yùn)行,它是基于X86處理器的內(nèi)核,如對 linux-2.4.18.tar.bz2的配置make menuconfig時就可以看到,Processor type and features中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celer

5、on/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 選項(xiàng),而沒有類似Samsun 2410等其他芯片的選擇。如果需要用在其他特定的處理器平臺上就需要對內(nèi)核進(jìn)行打補(bǔ)丁,形成不同的嵌入式內(nèi)核。實(shí)際上,不同處理器系統(tǒng)的內(nèi)核下載站點(diǎn)中提供的也往往是補(bǔ)丁patch而已,故原x86平臺上的內(nèi)核變成了基礎(chǔ)內(nèi)核,也被稱為標(biāo)準(zhǔn)內(nèi)核了。1.1.3 L

6、inux操作系統(tǒng)的分類第一層次分類:以主要功能差異和發(fā)行組織區(qū)分(基礎(chǔ)linux系統(tǒng)/內(nèi)核)。1、標(biāo)準(zhǔn)linux2、Clinux無MMU支持的linux系統(tǒng),運(yùn)行在無MMU的CPU上。3、Linux-RT是最早在linux上實(shí)現(xiàn)硬實(shí)時支持的linux發(fā)行版本。4、Linux/RTAI支持硬實(shí)時的linux,于RT-linux最大的不同之處在于RTAI定義了RTHAL,它將RTAI需要在linux中修改的部分定義成一組API接口,RTAI只使用API接口與linux交互。5、Embedix由Lineo公司開發(fā),基于PowerPC和x86平臺開發(fā)的。6、Blue Cat Linux7、Hard H

7、at Linux8、其他第二層分類:以應(yīng)用的嵌入式平臺區(qū)分(嵌入式linux系統(tǒng)/內(nèi)核,使上面第一類中的各種linux系統(tǒng)擴(kuò)展為對特定目標(biāo)硬件的支持,成為一種具體的嵌入式linux系統(tǒng))由于嵌入式系統(tǒng)的發(fā)展與linux內(nèi)核的發(fā)展是不同步的,所以為了要找一個能夠運(yùn)行于目標(biāo)系統(tǒng)上的內(nèi)核,需要對內(nèi)核進(jìn)行選擇、配置和定制。因?yàn)槊恳环N系統(tǒng)都是國際上不同的內(nèi)核開發(fā)小組維護(hù)的,因此選擇linux內(nèi)核源碼的站點(diǎn)也不盡相同。第二層分類中的linux系統(tǒng)/內(nèi)核相對于第一層分類的標(biāo)準(zhǔn)內(nèi)核來說,也可以稱為嵌入式linxu系統(tǒng)/內(nèi)核。如應(yīng)用在ARM平臺上的嵌入式Linux系統(tǒng)通常有arm-linux(常運(yùn)行在arm9平

8、臺上),Clinux(常用在arm7平臺上),在標(biāo)準(zhǔn)linux基礎(chǔ)上擴(kuò)展對其他的平臺的支持往往通過安裝patch實(shí)現(xiàn),如armlinux就是對linux安裝rmk補(bǔ)丁(如patch-2.4.18-rmk7.bz2)形成的,只有安裝了這些補(bǔ)丁,內(nèi)核才能順利地移植到ARM Linux上。也有些是已經(jīng)安裝好補(bǔ)丁的內(nèi)核源碼包,如linux-2.4.18-rmk7.tar.bz2。不同處理器系統(tǒng)的內(nèi)核/內(nèi)核補(bǔ)丁下載站點(diǎn):處理器系統(tǒng) 適合的內(nèi)核站點(diǎn) 下載方式x86 / ftp, http, rsyncARM .uk/developer/ ftp, rsyncPowerPC / ftp, http, rsy

9、nc, BitKeeperMIPS / ftp, cvsSuperH / cvs, BitKeeperM68K / ftp, httpnon-MMU CPUs / ftp, http 這些站點(diǎn)不僅僅是linux內(nèi)核站點(diǎn),它們可能直接提供了針對你的目標(biāo)硬件系統(tǒng)的linux內(nèi)核版本。1.1.4 linux內(nèi)核的選擇選擇內(nèi)核版本是很困難的,應(yīng)該與負(fù)責(zé)維護(hù)該內(nèi)核的小組保持聯(lián)系,方法是通過訂閱一些合適的郵件列表(maillist)并查看郵件中相關(guān)的重要新聞,以及瀏覽一些主要站點(diǎn),可以得到該內(nèi)核的最新發(fā)展動態(tài)。如針對ARM的Linux內(nèi)核,可以訪問.uk/ 并訂閱該網(wǎng)站上提供的maillist就可以了。如

10、果覺得查閱郵箱中的郵件列表耗費(fèi)太多時間,那么至少每周訪問所關(guān)心的內(nèi)核網(wǎng)站,并閱讀Kernel Traffic提供的過去一周中在內(nèi)核郵件清單中發(fā)生的重要的摘要,網(wǎng)址為/kernel-traffic 這樣就可以得到相關(guān)Linux內(nèi)核的最新信息。 并不是Linux的每個版本都適合ARM-Linux的移植,可以加入其郵件列表(maillist)以獲得內(nèi)核版本所支持硬件的相關(guān)信息,表中列出的資源可以幫助你找到哪些沒有列出的功能可以被你的系統(tǒng)支持。ARM Linux的移植,建議使用2.4.x或2.6.x版本。Linux內(nèi)核補(bǔ)丁可以到ARM Linux的ftp(.uk )下載。1.2 Linux內(nèi)核啟動過程

11、概述一個嵌入式 Linux 系統(tǒng)從軟件角度看可以分為四個部分:引導(dǎo)加載程序(Bootloader),Linux 內(nèi)核,文件系統(tǒng),應(yīng)用程序。其中 Bootloader是系統(tǒng)啟動或復(fù)位以后執(zhí)行的第一段代碼,它主要用來初始化處理器及外設(shè),然后調(diào)用 Linux 內(nèi)核。Linux 內(nèi)核在完成系統(tǒng)的初始化之后需要掛載某個文件系統(tǒng)做為根文件系統(tǒng)(Root Filesystem)。根文件系統(tǒng)是 Linux 系統(tǒng)的核心組成部分,它可以做為Linux 系統(tǒng)中文件和數(shù)據(jù)的存儲區(qū)域,通常它還包括系統(tǒng)配置文件和運(yùn)行應(yīng)用軟件所需要的庫。應(yīng)用程序可以說是嵌入式系統(tǒng)的“靈魂”,它所實(shí)現(xiàn)的功能通常就是設(shè)計(jì)該嵌入式系統(tǒng)所要達(dá)到的

12、目標(biāo)。如果沒有應(yīng)用程序的支持,任何硬件上設(shè)計(jì)精良的嵌入式系統(tǒng)都沒有實(shí)用意義。1.2.1 Bootloader啟動過程Bootloader在運(yùn)行過程中雖然具有初始化系統(tǒng)和執(zhí)行用戶輸入的命令等作用,但它最根本的功能就是為了啟動 Linux 內(nèi)核。1 、Bootloader的概念和作用 Bootloader是嵌入式系統(tǒng)的引導(dǎo)加載程序,它是系統(tǒng)上電后運(yùn)行的第一段程序,其作用類似于 PC 機(jī)上的 BIOS。在完成對系統(tǒng)的初始化任務(wù)之后,它會將非易失性存儲器(通常是Flash或DOC等)中的Linux 內(nèi)核拷貝到 RAM 中去,然后跳轉(zhuǎn)到內(nèi)核的第一條指令處繼續(xù)執(zhí)行,從而啟動 Linux 內(nèi)核。由此可見,B

13、ootloader 和 Linux 內(nèi)核有著密不可分的聯(lián)系,要想清楚的了解 Linux內(nèi)核的啟動過程,我們必須先得認(rèn)識 Bootloader的執(zhí)行過程,這樣才能對嵌入式系統(tǒng)的整個啟動過程有清晰的掌握。 2 、Bootloader的執(zhí)行過程 不同的處理器上電或復(fù)位后執(zhí)行的第一條指令地址并不相同,對于 ARM 處理器來說,該地址為 0 x00000000。對于一般的嵌入式系統(tǒng),通常把 Flash 等非易失性存儲器映射到這個地址處,而 Bootloader就位于該存儲器的最前端,所以系統(tǒng)上電或復(fù)位后執(zhí)行的第一段程序便是Bootloader。而因?yàn)榇鎯?Bootloader的存儲器不同,Bootloa

14、der的執(zhí)行過程也并不相同,下面將具體分析。 嵌入式系統(tǒng)中廣泛采用的非易失性存儲器通常是 Flash,而 Flash 又分為 Nor Flash 和Nand Flash 兩種。 它們之間的不同在于:Nor Flash 支持芯片內(nèi)執(zhí)行(XIP, eXecute In Place),這樣代碼可以在Flash上直接執(zhí)行而不必拷貝到RAM中去執(zhí)行。而Nand Flash并不支持XIP,所以要想執(zhí)行 Nand Flash 上的代碼,必須先將其拷貝到 RAM中去,然后跳到 RAM 中去執(zhí)行。 3、Bootloader的功能實(shí)際應(yīng)用中的 Bootloader根據(jù)所需功能的不同可以設(shè)計(jì)得很復(fù)雜,除完成基本的初

15、始化系統(tǒng)和調(diào)用 Linux 內(nèi)核等基本任務(wù)外,還可以執(zhí)行很多用戶輸入的命令,比如設(shè)置 Linux 啟動參數(shù),給 Flash 分區(qū)等;也可以設(shè)計(jì)得很簡單,只完成最基本的功能。但為了能達(dá)到啟動Linux 內(nèi)核的目的,所有的 Bootloader都必須具備以下功能: (1)、初始化 RAM 因?yàn)?Linux 內(nèi)核一般都會在 RAM 中運(yùn)行,所以在調(diào)用 Linux 內(nèi)核之前 bootloader 必須設(shè)置和初始化 RAM,為調(diào)用 Linux內(nèi)核做好準(zhǔn)備。初始化 RAM 的任務(wù)包括設(shè)置CPU 的控制寄存器參數(shù),以便能正常使用 RAM 以及檢測RAM 大小等。 (2)、初始化串口 串口在 Linux 的啟

16、動過程中有著非常重要的作用,它是 Linux內(nèi)核和用戶交互的方式之一。Linux 在啟動過程中可以將信息通過串口輸出,這樣便可清楚的了解 Linux 的啟動過程。雖然它并不是 Bootloader 必須要完成的工作,但是通過串口輸出信息是調(diào)試Bootloader 和Linux 內(nèi)核的強(qiáng)有力的工具,所以一般的 Bootloader 都會在執(zhí)行過程中初始化一個串口做為調(diào)試端口。 (3)、檢測處理器類型 Bootloader在調(diào)用 Linux內(nèi)核前必須檢測系統(tǒng)的處理器類型,并將其保存到某個常量中提供給 Linux 內(nèi)核。Linux 內(nèi)核在啟動過程中會根據(jù)該處理器類型調(diào)用相應(yīng)的初始化程序。 (4)、設(shè)

17、置 Linux啟動參數(shù) Bootloader在執(zhí)行過程中必須設(shè)置和初始化 Linux 的內(nèi)核啟動參數(shù)。目前傳遞啟動參數(shù)主要采用兩種方式:即通過 struct param_struct 和struct tag(標(biāo)記列表,tagged list)兩種結(jié)構(gòu)傳遞。struct param_struct 是一種比較老的參數(shù)傳遞方式,在 2.4 版本以前的內(nèi)核中使用較多。從 2.4 版本以后 Linux 內(nèi)核基本上采用標(biāo)記列表的方式。但為了保持和以前版本的兼容性,它仍支持 struct param_struct 參數(shù)傳遞方式,只不過在內(nèi)核啟動過程中它將被轉(zhuǎn)換成標(biāo)記列表方式。標(biāo)記列表方式是種比較新的參數(shù)傳遞

18、方式,它必須以 ATAG_CORE 開始,并以ATAG_NONE 結(jié)尾。中間可以根據(jù)需要加入其他列表。Linux內(nèi)核在啟動過程中會根據(jù)該啟動參數(shù)進(jìn)行相應(yīng)的初始化工作。 (5)、調(diào)用 Linux內(nèi)核映像 Bootloader完成的最后一項(xiàng)工作便是調(diào)用 Linux內(nèi)核。如果 Linux 內(nèi)核存放在 Flash 中,并且可直接在上面運(yùn)行(這里的 Flash 指 Nor Flash),那么可直接跳轉(zhuǎn)到內(nèi)核中去執(zhí)行。但由于在 Flash 中執(zhí)行代碼會有種種限制,而且速度也遠(yuǎn)不及 RAM 快,所以一般的嵌入式系統(tǒng)都是將 Linux內(nèi)核拷貝到 RAM 中,然后跳轉(zhuǎn)到 RAM 中去執(zhí)行。 不論哪種情況,在跳到

19、 Linux 內(nèi)核執(zhí)行之前 CPU的寄存器必須滿足以下條件:r00,r1處理器類型,r2標(biāo)記列表在 RAM中的地址。1.2.2 Linux啟動過程在Bootloader將 Linux 內(nèi)核映像拷貝到 RAM 以后,可以通過下例代碼啟動 Linux 內(nèi)核: call_linux(0, machine_type, kernel_params_base)。 其中,machine_tpye 是Bootloader檢測出來的處理器類型, kernel_params_base 是啟動參數(shù)在 RAM 的地址。通過這種方式將 Linux 啟動需要的參數(shù)從 bootloader傳遞到內(nèi)核。Linux 內(nèi)核有兩種

20、映像:一種是非壓縮內(nèi)核,叫 Image,另一種是它的壓縮版本,叫 zImage。根據(jù)內(nèi)核映像的不同,Linux 內(nèi)核的啟動在開始階段也有所不同。zImage 是 Image經(jīng)過壓縮形成的,所以它的大小比 Image 小。但為了能使用 zImage,必須在它的開頭加上解壓縮的代碼,將 zImage 解壓縮之后才能執(zhí)行,因此它的執(zhí)行速度比 Image 要慢。但考慮到嵌入式系統(tǒng)的存儲空容量一般比較小,采用 zImage 可以占用較少的存儲空間,因此犧牲一點(diǎn)性能上的代價(jià)也是值得的。所以一般的嵌入式系統(tǒng)均采用壓縮內(nèi)核的方式。對于ARM 系列處理器來說,zImage 的入口程序即為 arch/arm/bo

21、ot/compressed/head.S。它依次完成以下工作:開啟 MMU 和 Cache,調(diào)用 decompress_kernel()解壓內(nèi)核,最后通過調(diào)用 call_kernel()進(jìn)入非壓縮內(nèi)核 Image 的啟動。下面將具體分析在此之后 Linux 內(nèi)核的啟動過程。1、 Linux內(nèi)核入口 Linux 非壓縮內(nèi)核的入口位于文件/arch/arm/kernel/head-armv.S 中的stext 段。該段的基地址就是壓縮內(nèi)核解壓后的跳轉(zhuǎn)地址。如果系統(tǒng)中加載的內(nèi)核是非壓縮的 Image,那么bootloader將內(nèi)核從 Flash中拷貝到 RAM 后將直接跳到該地址處,從而啟動 Lin

22、ux 內(nèi)核。不同體系結(jié)構(gòu)的 Linux 系統(tǒng)的入口文件是不同的,而且因?yàn)樵撐募c具體體系結(jié)構(gòu)有關(guān),所以一般均用匯編語言編寫。對基于 ARM 處理的 Linux 系統(tǒng)來說,該文件就是head-armv.S。該程序通過查找處理器內(nèi)核類型和處理器類型調(diào)用相應(yīng)的初始化函數(shù),再建立頁表,最后跳轉(zhuǎn)到 start_kernel()函數(shù)開始內(nèi)核的初始化工作。檢測處理器內(nèi)核類型是在匯編子函數(shù)_lookup_processor_type中完成的。通過以下代碼可實(shí)現(xiàn)對它的調(diào)用: bl _lookup_processor_type。 _lookup_processor_type調(diào)用結(jié)束返回原程序時,會將返回結(jié)果保存到

23、寄存器中。其中r8 保存了頁表的標(biāo)志位,r9 保存了處理器的 ID 號,r10 保存了與處理器相關(guān)的 stru proc_info_list 結(jié)構(gòu)地址。 檢測處理器類型是在匯編子函數(shù) _lookup_architecture_type 中完成的。與 _lookup_processor_type類似,它通過代碼:“bl _lookup_processor_type”來實(shí)現(xiàn)對它的調(diào)用。該函數(shù)返回時,會將返回結(jié)構(gòu)保存在 r5、r6 和 r7 三個寄存器中。其中 r5 保存了 RAM 的起始基地址,r6 保存了 I/O基地址,r7 保存了 I/O的頁表偏移地址。當(dāng)檢測處理器內(nèi)核和處理器類型結(jié)束后,將調(diào)

24、用_create_page_tables 子函數(shù)來建立頁表,它所要做的工作就是將 RAM 基地址開始的 4M 空間的物理地址映射到 0 xC0000000 開始的虛擬地址處。對筆者的 S3C2410 開發(fā)板而言,RAM 連接到物理地址 0 x30000000 處,當(dāng)調(diào)用 _create_page_tables 結(jié)束后 0 x30000000 0 x30400000 物理地址將映射到 0 xC00000000 xC0400000 虛擬地址處。當(dāng)所有的初始化結(jié)束之后,使用如下代碼來跳到 C 程序的入口函數(shù) start_kernel()處,開始之后的內(nèi)核初始化工作:b SYMBOL_NAME(sta

25、rt_kernel) 2 、start_kernel函數(shù) start_kernel是所有 Linux 平臺進(jìn)入系統(tǒng)內(nèi)核初始化后的入口函數(shù),它主要完成剩余的與硬件平臺相關(guān)的初始化工作,在進(jìn)行一系列與內(nèi)核相關(guān)的初始化后,調(diào)用第一個用戶進(jìn)程init 進(jìn)程并等待用戶進(jìn)程的執(zhí)行,這樣整個 Linux 內(nèi)核便啟動完畢。該函數(shù)所做的具體工作有:調(diào)用 setup_arch()函數(shù)進(jìn)行與體系結(jié)構(gòu)相關(guān)的第一個初始化工作;對不同的體系結(jié)構(gòu)來說該函數(shù)有不同的定義。對于 ARM 平臺而言,該函數(shù)定義在arch/arm/kernel/Setup.c。它首先通過檢測出來的處理器類型進(jìn)行處理器內(nèi)核的初始化,然后通過 boot

26、mem_init()函數(shù)根據(jù)系統(tǒng)定義的 meminfo 結(jié)構(gòu)進(jìn)行內(nèi)存結(jié)構(gòu)的初始化,最后調(diào)用paging_init()開啟 MMU,創(chuàng)建內(nèi)核頁表,映射所有的物理內(nèi)存和 IO空間。創(chuàng)建異常向量表和初始化中斷處理函數(shù);初始化系統(tǒng)核心進(jìn)程調(diào)度器和時鐘中斷處理機(jī)制;初始化串口控制臺(serial-console);ARM-Linux 在初始化過程中一般都會初始化一個串口做為內(nèi)核的控制臺,這樣內(nèi)核在啟動過程中就可以通過串口輸出信息以便開發(fā)者或用戶了解系統(tǒng)的啟動進(jìn)程。創(chuàng)建和初始化系統(tǒng) cache,為各種內(nèi)存調(diào)用機(jī)制提供緩存,包括;動態(tài)內(nèi)存分配,虛擬文件系統(tǒng)(VirtualFile System)及頁緩存。初

27、始化內(nèi)存管理,檢測內(nèi)存大小及被內(nèi)核占用的內(nèi)存情況;初始化系統(tǒng)的進(jìn)程間通信機(jī)制(IPC);當(dāng)以上所有的初始化工作結(jié)束后,start_kernel()函數(shù)會調(diào)用 rest_init()函數(shù)來進(jìn)行最后的初始化,包括創(chuàng)建系統(tǒng)的第一個進(jìn)程init 進(jìn)程來結(jié)束內(nèi)核的啟動。init 進(jìn)程首先進(jìn)行一系列的硬件初始化,然后通過命令行傳遞過來的參數(shù)掛載根文件系統(tǒng)。最后 init 進(jìn)程會執(zhí)行用戶傳遞過來的“init”啟動參數(shù)執(zhí)行用戶指定的命令,或者執(zhí)行以下幾個進(jìn)程之一: execve(/sbin/init,argv_init,envp_init)execve(/etc/init,argv_init,envp_ini

28、t)execve(/bin/init,argv_init,envp_init)execve(/bin/sh,argv_init,envp_init) 當(dāng)所有的初始化工作結(jié)束后,cpu_idle()函數(shù)會被調(diào)用來使系統(tǒng)處于閑置(idle)狀態(tài)并等待用戶程序的執(zhí)行。至此,整個 Linux 內(nèi)核啟動完畢。Linux 內(nèi)核是一個非常龐大的工程,經(jīng)過十多年的發(fā)展,它已從從最初的幾百 KB 大小發(fā)展到現(xiàn)在的幾百兆。清晰的了解它執(zhí)行的每一個過程是件非常困難的事。但是在嵌入式開發(fā)過程中,我們并不需要十分清楚Linux 的內(nèi)部工作機(jī)制,只要適當(dāng)修改Linux 內(nèi)核中那些與硬件相關(guān)的部分,就可以將Linux 移植

29、到其它目標(biāo)平臺上。通過對Linux 的啟動過程的分析,我們可以看出哪些是和硬件相關(guān)的,哪些是Linux 內(nèi)核內(nèi)部已實(shí)現(xiàn)的功能,這樣在移植Linux 的過程中便有所針對。而Linux內(nèi)核的分層設(shè)計(jì)將使Linux 的移植變得更加容易。1.3 Linux內(nèi)核移植1.3.1 移植內(nèi)核和根文件系統(tǒng)準(zhǔn)備工作移植內(nèi)核前,保證你已經(jīng)裝上了Linux系統(tǒng),建立好了交叉編譯環(huán)境,我用的是虛擬機(jī),裝的Redhat9.0系統(tǒng),交叉編譯工具用的是友善之臂的arm-linux-gcc-4.3.2。開始移植Linux內(nèi)核了,下面是我我使用的內(nèi)核和文件系統(tǒng),以及所用到的工具及獲取方法:1、Linux系統(tǒng)我是在虛擬機(jī)上安裝的R

30、edhat9.0。XP系統(tǒng)下虛擬機(jī)設(shè)置的共享目錄是D:share,對應(yīng)的Linux系統(tǒng)的目錄是/mnt/hgfs/share。我將下面準(zhǔn)備的壓縮包和文件都統(tǒng)一放到該目錄下。2、Linux內(nèi)核到/主頁,進(jìn)入該網(wǎng)站中鏈接FTP /pub/,在里面進(jìn)入文件夾“l(fā)inux-kernel-v2.6”,會出現(xiàn)很多版本的內(nèi)核壓縮包和補(bǔ)丁,選中Linux-.tar.bz2下載。3、交叉編譯工具鏈?zhǔn)褂糜焉浦厶峁┑腶rm-linux-4.3.2工具鏈,沒有的到/下載。工具鏈也可以自己做,可以參考構(gòu)建嵌入式Linux系統(tǒng)一書或其它資料。4、yaffs2代碼進(jìn)入http:/www.aleph1.co.uk/cgi-

31、bin/viewcvs.cgi/,點(diǎn)擊“Download GNU tarball”,下載后出現(xiàn)cvs-root.tar.gz壓縮包。5、busybox-1.13.3從/downloads/下載busybox,這里下載的是busy busybox-1.13.3.tar.gz。6、根文件系統(tǒng)制作工具到友善之臂/ 網(wǎng)站下載根文件系統(tǒng)制作工具mkyaffs2image.tgz。7、友善之臂的根文件系統(tǒng)在制作根文件系統(tǒng)時,需要用到鏈接庫,為保證鏈接庫能用直接用友善之臂的根文件系統(tǒng)root_qtopia中的鏈接庫lib,到友善之臂網(wǎng)站/ 下載root_qtopia.tgz。這些文件都下載到D:share中

32、,通過虛擬機(jī)進(jìn)入Redhat9.0系統(tǒng),進(jìn)入/mnt/hgfs/share目錄便可訪問這些與XP共享的文件。8、硬件平臺 友善之臂的mini24401.3.2 修改Linux源碼中參數(shù)1、解壓內(nèi)核源碼mkdir /opt/studyarmcd /mnt/hgfs/sharetar jxvf linux-.tar.bz2 C /opt/studyarm2、 進(jìn)入內(nèi)核目錄,修改makefile,并對內(nèi)核進(jìn)行默認(rèn)配置進(jìn)行修改 193行,修改 ARCH ?=arm CROSS_COMPILE ?=arm-linux-3、 修改平臺輸入時鐘 找到內(nèi)核源碼arch/arm/mach-s3c2440/mac

33、h-smdk2440.c文件,在函數(shù) static void _init smdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。4、 修改machine名稱(可以不改)修改文件arch/arm/mach-s3c2440/mach-smdk2440.c,在文件中找到MACHINE_START( ),修改為MACHINE_START(S3C2440, “Study-S3C2440”)。5、 修改Nand flash分區(qū)信息修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。第一,修改分區(qū)信息

34、:static struct mtd_partition smdk_default_nand_part = 0 = .name = bootloader, .offset = 0 x00000000, .size = 0 x00030000, , 1 = .name = kernel, .offset = 0 x00050000, .size = 0 x00200000, , 2 = .name = root, .offset = 0 x00250000, .size = 0 x03dac000, ;第二,再修改s3c2410_platform_nand_smdk_nand_info smdk

35、_nand_info = .tacls = 0,.twrph0 = 30,.twrph1=0,;6、 修改LCD背光修改文件/arch/arm/mach-s3c2440/mach-smdk2440.c,因?yàn)橛焉频?.5寸液晶的背光控制是由S3C2440的GPG4引腳來控制的,故下面的改動將開啟背光。static void _init smdk2440_machine_init(void) s3c24xx_fb_set_platdata(&smdk2440_fb_info); platform_add_devices(); s3c2410_gpio_cfgpin(S3C2410_GPG4,S3C

36、2410_GPG4_OUTP); s3c2410_gpio_setpin(S3C2410_GPG4,1); smdk_machine_init();6、 LCD參數(shù)修改 這里用的是NEC3.5英寸屏液晶屏,大小為320 x240,需要修改修改文件arch/arm/mach-s3c2440/mach-smdk2440.c。static struct s3c2410fb_display smdk2440_lcd_cfg _initdata = .right_margin = 37, .hsync_len = 6, .upper_margin =2, .lower_margin = 6, .vsyn

37、c_len =2, ;static struct s3c2410fb_mach_info smdk2440_fb_info _initdata =.default_display =0 .gpccon = 0 xaa955699, .gpccon_mask = 0 xffc003cc, .gpcup = 0 x0000ffff, .gpcup_mask = 0 xffffffff, .gpdcon = 0 xaa95aaa1, .gpdcon_mask = 0 xffc0fff0, .gpdup = 0 x0000faff, .gpdup_mask = 0 xffffffff,.lpcsel

38、= 0 xf82, ;7、 給內(nèi)核打yaffs2文件系統(tǒng)的補(bǔ)丁cd /mnt/hgfs/sharetar zxvf /mnt/hgfs/share/cvs-root.tar.gz C /opt/studyarm cd /opt/stdudyarm/cvs/yaffs2/./patch-ker.sh c /opt/studyarm/linux-/ 上面命令完成下面三件事情:(1) 修改內(nèi)核fs/Kconfig 增加一行:source fs/yaffs2/Kconfig(2) 修改內(nèi)核fs/Kconfig 增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/(3) 在內(nèi)核fs

39、/目錄下創(chuàng)建yaffs2目錄 將yaffs2源碼目錄下面的Makefile.kernel文件復(fù)制為內(nèi)核fs/yaffs2/Makefie; 將yaffs2 源碼目錄的Kconfig文件復(fù)制到內(nèi)核fs/yaffs2目錄下; 將yaffs2源碼目錄下的*.c *.h文件復(fù)制到內(nèi)核fs/yaffs2目錄下.8、修改S3C2440的機(jī)器號由于Bootloader傳遞給Linux內(nèi)核的機(jī)器號為782,為與Bootloader傳遞參數(shù)一致,修改 arch/arm/tools/math-types文件。s3c2440 ARCH_S3C2440 S3C2440 362修改為:s3c2440 ARCH_S3C2

40、440 S3C2440 782另外,還可以不修改內(nèi)核中的S3C2440機(jī)器號,只需修改修改Bootloader傳遞給內(nèi)核的參數(shù)中的機(jī)器號就可以了。在VIVI中菜單中,按s,再按s,輸入mach_type,回車,輸入362,w,保存。1.3.3 配置Linux內(nèi)核1、 進(jìn)入Linux-內(nèi)核主目錄,通過以下命令將2410的默認(rèn)配置文件寫到當(dāng)前目錄下的.config。S3C2410的配置和S3C2440差不多,在這基礎(chǔ)上進(jìn)行修改。make s3c2410_defconfig 2、 配置內(nèi)核模塊的功能,有幾種方式可以進(jìn)行界面選擇:make menuconfig(文本選單的配置方式,在有字符終端下才能使

41、用)make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用)make oldconfig(文本配置方式,在原內(nèi)核配置的基礎(chǔ)修改時使用)這里使用make menuconfig命令。3、*Enable loadable module support *Forced module loading *Module unloading4、System Type S3C2410 Machines *SMDK2410/A9M2410選上 其余不選 S3C2440 Machines *SMDK2440 *SMDK2440 with S3C2440 CPU m

42、odule,其余不選其余的Machines下選項(xiàng)全部不選(如2400,2412,2442,2443)5、Kernel Features*Use the ARM EABI to compile the kernel 注:由于所使用的的交叉編譯arm-linux-gcc-4.3.2是符合EABI標(biāo)準(zhǔn)交叉編譯器,對于浮點(diǎn)運(yùn)行會預(yù)設(shè)硬浮點(diǎn)運(yùn)算FPA(Float Point Architecture),而沒有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,會使用FPE(Float Point Emulation 即軟浮點(diǎn)),這樣在速度上就會遇到極大的限制,使用EABI(Embedde

43、d Application Binary Interface)則可以對此改善處理,ARM EABI有許多革新之處,其中最突出的改進(jìn)就是Float Point Performance,它使用Vector Float Point(矢量浮點(diǎn)),因此可以極大提高涉及到浮點(diǎn)運(yùn)算的程序。參考:/bbs/viewthread.php?tid=130&extra=page%3D16、Boot options-noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC07、Userspace binary formats *Kernel support f

44、or ELF binaries其它的可以全部不選。8、 選擇支持yaffs2文件系統(tǒng)Filesystem Miscellaneous filesystemsYAFFS2 file system support* Lets Yaffs do its own ECC*Autoselect yaffs2 format*Disable lazy loading*Turn off wide tnodes*Force chunk erase check Native language support Codepage 437 (United States,Canada)Simplified Chinese

45、 charset(GB2312)Traditional Chinese charset(Big5)NLS ISO 8859-1(Latin1:Western European Languages)NLS UTF-89、Device Drivers Graphics support Support for frame buffer devices*Enable firmware EDID*Enable Video Mode Handling HelpersS3C2410 LCD framebuffer support 上一級 Console display driver support Fram

46、ebuffer Console support *Select compiled-in fonts * VGA8x8 font *VGA8x16 font*Bootup logo *Standard black and white Linux logo *Standard 16-color Linux logo *Standard 224-color Linux logo在Bootup logo選擇的那幾項(xiàng),將會在系統(tǒng)啟動時在液晶上顯示開機(jī)logo。1.3.4、編譯內(nèi)核編譯內(nèi)核需要遵守以下步驟:1、make depmake dep的意思就是說:如果你使用程序A(比如支持特殊設(shè)備),而A需用到B

47、(比如B是A的一 個模塊/子程序)。而你在做make config的時候?qū)⒁粋€設(shè)備的驅(qū)動 由內(nèi)核支持改為module,或取消支持,這將可能影響到B的一個參數(shù)的設(shè)置,需重新編譯B,重新編譯或連接A如果程序數(shù)量非常多, 你是很難手工完全做好此工作的。make dep實(shí)際上讀取配置過程生成的配置文件,來創(chuàng)建對應(yīng)于配置的依賴關(guān)系樹,從而決定哪些需要編譯而那些不需要編譯。所以,你要make dep。2、make clean清除一些以前留下的文件,比如以前編譯生成的目標(biāo)文件,這一步必須要進(jìn)行。否則,即使內(nèi)核配置改動過,編譯內(nèi)核時還是將原來生成的目標(biāo)文件進(jìn)行連接,而不生成改動后的文件。3、make zIma

48、geLinux內(nèi)核有兩種映像:一種是非壓縮內(nèi)核,叫 Image,另一種是它的壓縮版本,叫zImage。根據(jù)內(nèi)核映像的不同,Linux內(nèi)核的啟動在開始階段也有所不同。zImage是Image經(jīng)過壓縮形成的,所以它的大小比 Image小。但為了能使用zImage,必須在它的開頭加上解壓縮的代碼,將 zImage解壓縮之后才能執(zhí)行,因此它的執(zhí)行速度比Image要慢。但考慮到嵌入式系統(tǒng)的存儲空容量一般比較小,采用zImage可以占用較少的存儲空間,因此犧牲一點(diǎn)性能上的代價(jià)也是值得的,所以一般的嵌入式系統(tǒng)均采用壓縮內(nèi)核的方式。編譯完成后,會在內(nèi)核目錄arch/arm/boot/下生成zImage內(nèi)核映像

49、文件。 第二章 制作根文件系統(tǒng)2.1 根文件系統(tǒng)預(yù)備知識嵌入式Linux中都需要構(gòu)建根文件系統(tǒng),構(gòu)建根文件系統(tǒng)的規(guī)則在FHS(Filesystem Hierarchy Standard)文檔中,下面是根文件系統(tǒng)頂層目錄。目錄 內(nèi)容 bin 存放所有用戶都可以使用的、基本的命令。 sbin 存放的是基本的系統(tǒng)命令,它們用于啟動系統(tǒng)、修復(fù)系統(tǒng)等。 usr 里面存放的是共享、只讀的程序和數(shù)據(jù)。 proc 這是個空目錄,常作為proc文件系統(tǒng)的掛載點(diǎn)。 dev 該目錄存放設(shè)備文件和其它特殊文件。 etc 存放系統(tǒng)配置文件,包括啟動文件。 lib 存放共享庫和可加載塊(即驅(qū)動程序),共享庫用于啟動系統(tǒng)、

50、運(yùn)行根文件系統(tǒng)中的可執(zhí)行程序。 boot 引導(dǎo)加載程序使用的靜態(tài)文件 home 用戶主目錄,包括供服務(wù)賬號鎖使用的主目錄,如FTP mnt 用于臨時掛接某個文件系統(tǒng)的掛接點(diǎn),通常是空目錄。也可以在里面創(chuàng)建空的子目錄。 opt 給主機(jī)額外安裝軟件所擺放的目錄。 root root用戶的主目錄 tmp 存放臨時文件,通常是空目錄。 var 存放可變的數(shù)據(jù)。 2.2、構(gòu)建根文件按系統(tǒng)2.2.1、建立根文件系統(tǒng)目錄進(jìn)入到/opt/studyarm目錄,新建建立根文件系統(tǒng)目錄的腳本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash改變文件的可執(zhí)行權(quán)限

51、,./create_rootfs_bash運(yùn)行腳本,就完成了根文件系統(tǒng)目錄的創(chuàng)建。#!/bin/shecho Create rootfs directons start.mkdir rootfscd rootfsecho Create root,devmkdir root dev etc boot tmp var sys proc lib mnt home optmkdir etc/init.d etc/rc.d etc/sysconfigmkdir usr/sbin usr/bin usr/lib usr/modules mkdir mnt/usb mnt/nfs mnt/sd mkdir

52、var/lib var/lock var/run var/tmp chmod 1777 tmpchmod 1777 var/tmp echo make direction done 改變了tmp目錄的使用權(quán),讓它開啟sticky位,為tmp目錄的使用權(quán)開啟此位,可確保tmp目錄底下建立的文件,只有建立它的用戶有權(quán)刪除。盡管嵌入式系統(tǒng)多半是單用戶,不過有些嵌入式應(yīng)用不一定用root的權(quán)限來執(zhí)行,因此需要遵照根文件系統(tǒng)權(quán)限位的基本規(guī)定來設(shè)計(jì)。2.2.2、建立動態(tài)鏈接庫動態(tài)鏈接庫直接用友善之臂的,先解壓友善之臂的根文件包,拷貝lib的內(nèi)容到新建的根文件目錄lib內(nèi)。cd /mnt/hgfs/shar

53、etar zxvf root_qtopia.tgz C /opt/studyarmcp rfd /opt/studyarm/root_qtopia/lib/* /opt/studyarm/rootfs/lib/*2.2.3 交叉編譯BosyboxBosybox是一個遵循GPL v2協(xié)議的開源項(xiàng)目,它在編寫過程總對文件大小進(jìn)行優(yōu)化,并考慮了系統(tǒng)資源有限(比如內(nèi)存等)的情況,使用Busybox可以自動生成根文件系統(tǒng)所需的bin、sbin、usr目錄和linuxrc文件。1、解壓busyboxcd /mnt/hgfs/sharetar zxvf busybox-1.13.3.tar.tgz C /o

54、pt/studyarm2、進(jìn)入源碼,修改Makefile文件:cd /opt/studyarm/busybox-1.13.3修改: CROSS_COMPILE ?=arm-linux- /第164行 ARCH ?=arm /第189行3、配置busybox輸入make menuconfig進(jìn)行配置(1)、Busybox Settings General Configuration * Show verbose applet usage messages * Store applet usage messages in compressed form * Support install -s t

55、o install applet links at runtime * Enable locale support(system needs locale for this to work) * Support for long-options * Use the devpts filesystem for unix98 PTYs * Support writing pidfiles * Runtime SUID/SGID configuration via /etc/busybox.config * Suppress warning message if /etc/busybox.conf

56、is not readableBuild Options * Build BusyBox as a static binary(no shared libs) * Build with Large File Support(for accessing files2GB)Installation Options- Dont use /usr Applets links (as soft-links) (./_install) BusyBox installation prefixBusybox Library Tuning (6)Minimum password legth (2)MD5:Tra

57、de Bytes for Speed *Fsater /proc scanning code(+100bytes) *Command line editing (1024)Maximum length of input * vi-style line editing commands (15) History size * History saving * Tab completion *Fancy shell prompts (4) Copy buffer size ,in kilobytes *Use ioctl names rather than hex values in error

58、messages*Support infiniband HW(2)、Linux Module Utilities (/lib/modules)Default directory containing modules (modules.dep)Default name of modules.dep* insmod* rmmod* lsmod* modprobeoptions common to multiple modutils support version 2.2/2.4 Linux kernels*Support tainted module checking with new kerne

59、ls*Support for module .aliases file* support for modules.symbols file(3)、在busybox中配置對dev下設(shè)備類型的支持dev的創(chuàng)建有三種方法:手動創(chuàng)建:在制作根文件系統(tǒng)的時候,就在dev目錄下創(chuàng)建好要使用的設(shè)備文件,系統(tǒng)掛接根文件系統(tǒng)后,就可以使用dev目錄下的設(shè)備文件了。使用devfs文件系統(tǒng):這種方法已經(jīng)過時,具有不確定的設(shè)備映射、沒有足夠的主/次設(shè)備號、devfs消耗大量的內(nèi)存。udev:它是個用戶程序,能根據(jù)系統(tǒng)中硬件設(shè)備的狀態(tài)動態(tài)的更新設(shè)備文件,包括設(shè)備文件的創(chuàng)建、刪除等。它的操作相對復(fù)雜,但靈活性很高mdev

60、是busybox自帶的一個簡化版的udev,適合于嵌入式的應(yīng)用埸合。其具有使用簡單的特點(diǎn)。它的作用,就是在系統(tǒng)啟動和熱插拔或動態(tài)加載驅(qū)動程序時,自動產(chǎn)生驅(qū)動程序所需的節(jié)點(diǎn)文件。在以busybox為基礎(chǔ)構(gòu)建嵌入式linux的根文件系統(tǒng)時,使用它是最優(yōu)的選擇。下面的選項(xiàng)將增加對mdev的支持。Linux System Utilities *Support /etc/mdev.conf *Support command execution at device addition/removalmdev的配置參考bosybox目錄下decs/mdev.txt,首先mdev有兩個主要的應(yī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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論