Linux 系統(tǒng)課程設(shè)計報告_第1頁
Linux 系統(tǒng)課程設(shè)計報告_第2頁
Linux 系統(tǒng)課程設(shè)計報告_第3頁
Linux 系統(tǒng)課程設(shè)計報告_第4頁
Linux 系統(tǒng)課程設(shè)計報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Linux 系統(tǒng)課程設(shè)計報告 專業(yè)班級: 學(xué)號: 姓名: 同組成員: 2016年6月2日星期四序論 實驗要求實驗?zāi)康牧私釲inux內(nèi)核源代碼的目錄結(jié)構(gòu)及各目錄的相關(guān)內(nèi)容。了解Linux內(nèi)核各配置選項內(nèi)容和作用。掌握Linux內(nèi)核配置文件的作用。掌握Linux內(nèi)核的編譯過程。掌握將新增內(nèi)核代碼加入到Linux內(nèi)核結(jié)構(gòu)中的方法。實驗指引盡管目前Linux 2.6版本內(nèi)核已經(jīng)增加了很多對ARM體系甚至是S3C2440 CPU的支持,但仍然需要對內(nèi)核作一些小的修改來適應(yīng)我們的開發(fā)板,并且需要重新配置、編譯和重新生成新的內(nèi)核映像。本實驗從軟硬件準(zhǔn)備到下載到開發(fā)板等一系列連貫的操作來進(jìn)行嵌入式Linux內(nèi)

2、核的移植。本實驗的內(nèi)核版本為。第一章 Linux內(nèi)核基礎(chǔ)知識1.1 Linux版本Linux主要的版本定義為“主.次.發(fā)布.修改”的樣式,次版本為奇數(shù)表示此版本為開發(fā)中版本,次版本為偶數(shù)表示此版本為穩(wěn)定版本。Linux內(nèi)核的版本號可以從源代碼的頂層目錄下的Makefile中看到,比如內(nèi)核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRAVERSION = .1 其中的“VERSION”和“PATCHLEVEL”組成主版本號,比如2.4、2.5、2.

3、6等,穩(wěn)定版本的德主版本號用偶數(shù)表示(比如2.6的內(nèi)核), 開發(fā)中的版本號用奇數(shù)表示(比如2.5),它是下一個穩(wěn)定版本內(nèi)核的前身?!癝UBLEVEL”稱為次版本號,它不分奇偶,順序遞增,每隔12個月發(fā)布 一個穩(wěn)定版本?!癊XTRAVERSION”稱為擴展版本號,它不分奇偶,順序遞增,每周發(fā)布幾次擴展本版號。1.2 什么是標(biāo)準(zhǔn)內(nèi)核按照資料上的習(xí)慣說法,標(biāo)準(zhǔn)內(nèi)核(或稱基礎(chǔ)內(nèi)核)就是指主要在/維 護(hù)和獲取的內(nèi)核,實際上它也有平臺屬性的。這些linux內(nèi)核并不總是適用于所有l(wèi)inux支持的體系結(jié)構(gòu)。實際上,這些內(nèi)核版本很多時候并不是為一些流 行的嵌入式linux

4、系統(tǒng)開發(fā)的,也很少運行于這些嵌入式linux系統(tǒng)上,這個站點上的內(nèi)核首先確保的是在Intel X86體系結(jié)構(gòu)上可以正常運行,它是基于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/Celeron/Pentium-II、Pentium-III /Celeron(Coppermine)、Pentium-4、K6/K6-I

5、I/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 選項,而沒有類似Samsun 2410等其他芯片的選擇。如果需要用在其他特定的處理器平臺上就需要對內(nèi)核進(jìn)行打補丁,形成不同的嵌入式內(nèi)核。實際上,不同處理器系統(tǒng)的內(nèi)核下載站點中 提供的也往往是補丁patch而已,故原x86平臺上的內(nèi)核變成了基礎(chǔ)內(nèi)核,也被稱為標(biāo)準(zhǔn)內(nèi)核了。1.3 Linux操作系統(tǒng)的分類1.3.1 以功能和發(fā)行組織區(qū)分第一種分類:以主要功能差異和發(fā)行組織區(qū)分(基礎(chǔ)linux系統(tǒng)/內(nèi)核)。&#

6、160;1、標(biāo)準(zhǔn)linux 。2、Clinux,Clinux無MMU支持的linux系統(tǒng),運行在無MMU的CPU上。 3、Linux-RT ,Linux-RT是最早在linux上實現(xiàn)硬實時支持的linux發(fā)行版本。 4、Linux/RTAI ,Linux/RTAI支持硬實時的linux,于RT-linux最大的不同之處在于RTAI定義了RTHAL,它將RTAI需要在linux中修改的部分定義成一組API接口,RTAI只使用API接口與linux交互。 5、Embedix ,Embedix 是由Lineo公司開發(fā),基

7、于PowerPC和x86平臺開發(fā)的。 6、Blue Cat Linux 。7、Hard Hat Linux 。8、其他。 1.3.2 以應(yīng)用的嵌入式平臺區(qū)分第二種分類:以應(yīng)用的嵌入式平臺區(qū)分。由于嵌入式系統(tǒng)的發(fā)展與linux內(nèi)核的發(fā)展是不同步的,所以為了要找一個能夠運行于目標(biāo)系統(tǒng)上的內(nèi)核,需要對內(nèi)核進(jìn)行選擇、配置和定制。因為每一種系統(tǒng)都是國際上不同的內(nèi)核開發(fā)小組維護(hù)的,因此選擇linux內(nèi)核源碼的站點也不盡相同。第二種分類中的linux系統(tǒng)/內(nèi)核相對于第一層分類的標(biāo)準(zhǔn)內(nèi)核來說,也可以稱為嵌入式linxu系統(tǒng)/內(nèi)核。如應(yīng)用在ARM平臺上的嵌入式Linux系

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

9、#160;    下載方式 x86           /              ftp, http, rsync ARM        .uk/develop

10、er/    ftp, rsync PowerPC    /         ftp,http,rsync,BitKeeper MIPS           /       

11、0;   ftp, cvs SuperH          cvs, BitKeeper M68K           /               ftp, http non-MMU C

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

13、訪問.uk/ 并訂閱該網(wǎng)站上提供的maillist就可以了。如果覺得查閱郵箱中的郵件列表耗費太多時間,那么至少每周訪問所關(guān)心的內(nèi)核網(wǎng)站,并閱讀Kernel Traffic提供的過去一周中在內(nèi)核郵件清單中發(fā)生的重要的摘要,網(wǎng)址為在本課程設(shè)計中我們選擇的內(nèi)核版本是.此版本的內(nèi)核源碼可以在/主頁中找到對應(yīng)的下載鏈接后下載下來。第二章 Linux內(nèi)核啟動過程概述一個嵌入式 Linux 系統(tǒng)從軟件角度看可以分為四個部分:引導(dǎo)加載程序(Bootloader),Linux 內(nèi)核,

14、文件系統(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īng)用軟件所需要的庫。應(yīng)用程序可以說是嵌入式系統(tǒng)的“靈魂”,它所實現(xiàn)的功能通常就是設(shè)計該嵌入式系統(tǒng)所要達(dá)到的目標(biāo)。如果沒有應(yīng)用程序的支持,任何硬件上設(shè)計精良的嵌入式系統(tǒng)

15、都沒有實用意義。2.1 Bootloader啟動過程Bootloader在運行過程中雖然具有初始化系統(tǒng)和執(zhí)行用戶輸入的命令等作用,但它最根本的功能就是為了啟動 Linux 內(nèi)核。2.1.1 Bootloader概念和作用Bootloader 是嵌入式系統(tǒng)的引導(dǎo)加載程序,它是系統(tǒng)上電后運行的第一段程序,其作用類似于 PC 機上的 BIOS。在完成對系統(tǒng)的初始化任務(wù)之后,它會將非易失性存儲器(通常是Flash或DOC等)中的Linux 內(nèi)核拷貝到 RAM 中去,然后跳轉(zhuǎn)到內(nèi)核的第一條指令處繼續(xù)執(zhí)行,從而啟動 Linux 內(nèi)核。由此可見,Bootloader 和 Linux 內(nèi)核有著密不可分的聯(lián)系,

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

17、采用的非易失性存儲器通常 是 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í)行。2.1.3 Bootloader的功能實際應(yīng)用中的 Bootloader根據(jù)所需功能的不同可以設(shè)計得很復(fù)雜,除完成基本的初始化系統(tǒng)和調(diào)用 Linux 內(nèi)核等基本任務(wù)外,還可以執(zhí)

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

19、的方式之一。Linux 在啟動過程中可以將信息通過串口輸出,這樣便可清楚的了解 Linux 的啟動過程。雖然它并不是 Bootloader 必須要完成的工作,但是通過串口輸出信息是調(diào)試Bootloader 和Linux 內(nèi)核的強有力的工具,所以一般的 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è)置 Linux啟動參數(shù)。Bootloader 在執(zhí)行過程中必須

20、設(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ù)傳遞方式,它必須以 ATAG_CORE 開始,并以ATAG_NO

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

22、00,r1處理器類型,r2標(biāo)記列表在 RAM中的地址。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)核有兩種映像:一種是非壓縮內(nèi)核,叫 Image,另一種是它的壓縮版本,叫 zI

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

24、作:開啟 MMU 和 Cache,調(diào)用 decompress_kernel()解壓內(nèi)核,最后通過調(diào)用 call_kernel()進(jìn)入非壓縮內(nèi)核 Image 的啟動。下面將具體分析在此之后 Linux 內(nèi)核的啟動過程。2.2.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 后將直接跳到該地址處,從而啟動 Linux 內(nèi)核。不同體系結(jié)構(gòu)的 Linux 系統(tǒng)的入口文件

25、是不同的,而且因為該文件與具體體系結(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中完成的。通 過以下代碼可實現(xiàn)對它的調(diào)用:bl _lookup_processor_type。_lookup_processor_type調(diào)用結(jié)束返回原程序時,會將返回結(jié)果保存到寄存器中。其中r8 保存了頁表的標(biāo)志位,r9 保存了處理

26、器的 ID 號,r10 保存了與處理器相關(guān)的 stru proc_info_list 結(jié)構(gòu)地址。檢 測處理器類型是在匯編子函數(shù) _lookup_architecture_type 中完成的。與 _lookup_processor_type類似,它通過代碼:“bl _lookup_processor_type”來實現(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)用_create_page_tables 子函數(shù)來建立頁

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

28、rt_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)核的初始化,然后通過 bootmem_init()函數(shù)根據(jù)系統(tǒng)定義的 meminfo 結(jié)構(gòu)進(jìn)

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

30、系統(tǒng)的進(jìn)程間通信機制(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_init)e

31、xecve("/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)部工作機制,只要適當(dāng)修改Linux

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

33、取方法:1、 Linux系統(tǒng) 我是在虛擬機上安裝的Redhat9.0。XP系統(tǒng)下虛擬機設(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)核壓縮包和補丁,選中Linux-.tar.bz2下載。3、 交叉編譯工具鏈 使用友善之臂提供的a

34、rm-linux-4.3.2工具鏈,沒有的到4、 硬件平臺 友善之臂的mini2440 。5、 yaffs2代碼 進(jìn)入http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/,點擊“Download GNU tarball”,下載后出現(xiàn)cvs-root.tar.gz壓縮包。3.2 修改Linux源碼中的參數(shù)3.2.1 解壓內(nèi)核源碼mkdir /opt/studyarmcd /mnt/hgfs/sharetar jxvf linux-.tar.bz2 C /opt/studyarm3.2.2 進(jìn)入內(nèi)核目錄,修改makef

35、ile,并對內(nèi)核的默認(rèn)配置進(jìn)行修改193行,修改 ARCH ?=arm CROSS_COMPILE ?=arm-linux- 3.2.3 修改平臺時鐘 找到內(nèi)核源碼arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函數(shù) static void _init smdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。3.2.4 修改Nand flash分區(qū)信息修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。第一,修改分區(qū)

36、信息: static struct mtd_partition smdk_default_nand_part =  0 =   .name = "bootloader",  .offset = 0x00000000,  .size = 0x00030000,  , 1 =   .name = "kernel",  .offset = 0x00050000,  .size = 0x0020

37、0000,  , 2 =   .name = "root",  .offset = 0x00250000,  .size = 0x03dac000,   第二,再修改s3c2410_platform_nand_smdk_nand_info smdk_nand_info = .tacls = 0, .twrph0 = 30, .twrph1=0, 3.2.5 修改LCD背光修改文件/arch/arm/mach-s3c2440/m

38、ach-smdk2440.c,因為友善的3.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,S3C2410_GPG4_OUTP);  s3c2410_gpio_setpin(S3C2410

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

40、,  .lower_margin = 6,  .vsync_len =2,   static struct s3c2410fb_mach_info smdk2440_fb_info _initdata  =  .default_display =0 .gpccon = 0xaa955699, .gpccon_mask = 0xffc003cc, .gpcup = 0x0000ffff, .gpcup_mask = 0xffffffff, .gpd

41、con = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff, .lpcsel = 0xf82,   3.2.7 給內(nèi)核打yaffs2文件系統(tǒng)的補丁cd /mnt/hgfs/share tar zxvf /mnt/hgfs/share/cvs-root.tar.gz C /opt/studyarm cd /opt/stdudyarm/cvs/yaffs2/ ./patch-ke

42、r.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/目錄下創(chuàng)建yaffs2目錄 將yaffs2源碼目錄下面的Makefile.kernel文件復(fù)制為內(nèi)核fs/yaffs2/Makefie;將yaf

43、fs2 源碼目錄的Kconfig文件復(fù)制到內(nèi)核fs/yaffs2目錄下; 將yaffs2源碼目錄下的*.c *.h文件復(fù)制到內(nèi)核fs/yaffs2目錄下.3.2.8 修改s3c2440的機器號由于Bootloader傳遞給Linux內(nèi)核的機器號為782,為與Bootloader傳遞參數(shù)一致,修改 arch/arm/tools/math-types文件。 s3c2440 ARCH_S3C2440 S3C2440 362 修改為: s3c2440 ARCH_S3C2440 S3C2440 782 另外,還可以不修改內(nèi)核中的S3C2440機器號,只需

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

45、) make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用) make oldconfig(文本配置方式,在原內(nèi)核配置的基礎(chǔ)修改時使用) 這里使用make menuconfig命令。配置信息如下:*Enable loadable module support-> *Forced module loading *Module unloading System Type-> S3C2410 Machines-> *SMDK2410/A9M2410選上

46、 其余不選 S3C2440 Machines-> *SMDK2440 *SMDK2440 with S3C2440 CPU module,其余不選 其余的Machines下選項全部不選(如2400,2412,2442,2443) Kernel Features-> *Use the ARM EABI to compile the kernel noinitrd root=/dev/mtdblock2 init=/linuxrc  console=ttySAC0 Userspace binary

47、 formats-> *Kernel support for ELF binaries 其它的可以全部不選。選擇支持yaffs2文件系統(tǒng) 。Filesystem-> Miscellaneous filesystems-> <*>YAFFS2 file system support * Lets Yaffs do its own ECC Native language support <*> Codepage 437 (United States,Canada) <*>Simplified Chinese charset(GB2312) <*>Traditional Chinese charset(Big5) <*>NLS ISO 8859-1(Latin1:Western European Languages) <*>NLS UTF-8 Device Drivers-> Graphics support-> <

溫馨提示

  • 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

提交評論