基于S3C2440的linux操作系統內核移植和yaffs2文件系統的制作_第1頁
基于S3C2440的linux操作系統內核移植和yaffs2文件系統的制作_第2頁
基于S3C2440的linux操作系統內核移植和yaffs2文件系統的制作_第3頁
基于S3C2440的linux操作系統內核移植和yaffs2文件系統的制作_第4頁
基于S3C2440的linux操作系統內核移植和yaffs2文件系統的制作_第5頁
已閱讀5頁,還剩39頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、有平臺屬性的。這些linux內核并不總是適用于所有linux支持的體系結構。實際上,這些內核版本很多時候并不是為一些流行的嵌入式linux系統開發的,也很少運行于這些嵌入式linux系統上,這個站點上的內核首先確保的是在Intel X86體系結構上可以正常運行,它是基于X86處理器的內核,如對 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 選項,而沒有類似Samsun 2410等其他芯片的選擇。如果需要用在其他特定的處理器平臺上就需要對內核進行打補丁,形成不同的嵌入式內核。實際上,不同處理器系統的內核下載站點中提供的也往往是補丁patch而已,故原x86平臺上的內核變成了基礎內核,也被稱為標準內核了。1.1.3 L

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

7、at Linux8、其他第二層分類:以應用的嵌入式平臺區分(嵌入式linux系統/內核,使上面第一類中的各種linux系統擴展為對特定目標硬件的支持,成為一種具體的嵌入式linux系統)由于嵌入式系統的發展與linux內核的發展是不同步的,所以為了要找一個能夠運行于目標系統上的內核,需要對內核進行選擇、配置和定制。因為每一種系統都是國際上不同的內核開發小組維護的,因此選擇linux內核源碼的站點也不盡相同。第二層分類中的linux系統/內核相對于第一層分類的標準內核來說,也可以稱為嵌入式linxu系統/內核。如應用在ARM平臺上的嵌入式Linux系統通常有arm-linux(常運行在arm9平

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

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

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

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

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

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

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

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

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

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

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

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

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

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

22、ux 內核。不同體系結構的 Linux 系統的入口文件是不同的,而且因為該文件與具體體系結構有關,所以一般均用匯編語言編寫。對基于 ARM 處理的 Linux 系統來說,該文件就是head-armv.S。該程序通過查找處理器內核類型和處理器類型調用相應的初始化函數,再建立頁表,最后跳轉到 start_kernel()函數開始內核的初始化工作。檢測處理器內核類型是在匯編子函數_lookup_processor_type中完成的。通過以下代碼可實現對它的調用: bl _lookup_processor_type。 _lookup_processor_type調用結束返回原程序時,會將返回結果保存到

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

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

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

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

27、始化內存管理,檢測內存大小及被內核占用的內存情況;初始化系統的進程間通信機制(IPC);當以上所有的初始化工作結束后,start_kernel()函數會調用 rest_init()函數來進行最后的初始化,包括創建系統的第一個進程init 進程來結束內核的啟動。init 進程首先進行一系列的硬件初始化,然后通過命令行傳遞過來的參數掛載根文件系統。最后 init 進程會執行用戶傳遞過來的“init”啟動參數執行用戶指定的命令,或者執行以下幾個進程之一: 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) 當所有的初始化工作結束后,cpu_idle()函數會被調用來使系統處于閑置(idle)狀態并等待用戶程序的執行。至此,整個 Linux 內核啟動完畢。Linux 內核是一個非常龐大的工程,經過十多年的發展,它已從從最初的幾百 KB 大小發展到現在的幾百兆。清晰的了解它執行的每一個過程是件非常困難的事。但是在嵌入式開發過程中,我們并不需要十分清楚Linux 的內部工作機制,只要適當修改Linux 內核中那些與硬件相關的部分,就可以將Linux 移植

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

30、edhat9.0。XP系統下虛擬機設置的共享目錄是D:share,對應的Linux系統的目錄是/mnt/hgfs/share。我將下面準備的壓縮包和文件都統一放到該目錄下。2、Linux內核到/主頁,進入該網站中鏈接FTP /pub/,在里面進入文件夾“linux-kernel-v2.6”,會出現很多版本的內核壓縮包和補丁,選中Linux-.tar.bz2下載。3、交叉編譯工具鏈使用友善之臂提供的arm-linux-4.3.2工具鏈,沒有的到/下載。工具鏈也可以自己做,可以參考構建嵌入式Linux系統一書或其它資料。4、yaffs2代碼進入http:/www.aleph1.co.uk/cgi-

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

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

33、h-smdk2440.c文件,在函數 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分區信息修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。第一,修改分區信息

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,因為友善的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,S3C

36、2410_GPG4_OUTP); s3c2410_gpio_setpin(S3C2410_GPG4,1); smdk_machine_init();6、 LCD參數修改 這里用的是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、 給內核打yaffs2文件系統的補丁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) 修改內核fs/Kconfig 增加一行:source fs/yaffs2/Kconfig(2) 修改內核fs/Kconfig 增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/(3) 在內核fs

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

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

41、用)make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用)make oldconfig(文本配置方式,在原內核配置的基礎修改時使用)這里使用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下選項全部不選(如2400,2412,2442,2443)5、Kernel Features*Use the ARM EABI to compile the kernel 注:由于所使用的的交叉編譯arm-linux-gcc-4.3.2是符合EABI標準交叉編譯器,對于浮點運行會預設硬浮點運算FPA(Float Point Architecture),而沒有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,會使用FPE(Float Point Emulation 即軟浮點),這樣在速度上就會遇到極大的限制,使用EABI(Embedde

43、d Application Binary Interface)則可以對此改善處理,ARM EABI有許多革新之處,其中最突出的改進就是Float Point Performance,它使用Vector Float Point(矢量浮點),因此可以極大提高涉及到浮點運算的程序。參考:/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文件系統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選擇的那幾項,將會在系統啟動時在液晶上顯示開機logo。1.3.4、編譯內核編譯內核需要遵守以下步驟:1、make depmake dep的意思就是說:如果你使用程序A(比如支持特殊設備),而A需用到B

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

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

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

50、運行根文件系統中的可執行程序。 boot 引導加載程序使用的靜態文件 home 用戶主目錄,包括供服務賬號鎖使用的主目錄,如FTP mnt 用于臨時掛接某個文件系統的掛接點,通常是空目錄。也可以在里面創建空的子目錄。 opt 給主機額外安裝軟件所擺放的目錄。 root root用戶的主目錄 tmp 存放臨時文件,通常是空目錄。 var 存放可變的數據。 2.2、構建根文件按系統2.2.1、建立根文件系統目錄進入到/opt/studyarm目錄,新建建立根文件系統目錄的腳本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash改變文件的可執行權限

51、,./create_rootfs_bash運行腳本,就完成了根文件系統目錄的創建。#!/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目錄的使用權,讓它開啟sticky位,為tmp目錄的使用權開啟此位,可確保tmp目錄底下建立的文件,只有建立它的用戶有權刪除。盡管嵌入式系統多半是單用戶,不過有些嵌入式應用不一定用root的權限來執行,因此需要遵照根文件系統權限位的基本規定來設計。2.2.2、建立動態鏈接庫動態鏈接庫直接用友善之臂的,先解壓友善之臂的根文件包,拷貝lib的內容到新建的根文件目錄lib內。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協議的開源項目,它在編寫過程總對文件大小進行優化,并考慮了系統資源有限(比如內存等)的情況,使用Busybox可以自動生成根文件系統所需的bin、sbin、usr目錄和linuxrc文件。1、解壓busyboxcd /mnt/hgfs/sharetar zxvf busybox-1.13.3.tar.tgz C /o

54、pt/studyarm2、進入源碼,修改Makefile文件:cd /opt/studyarm/busybox-1.13.3修改: CROSS_COMPILE ?=arm-linux- /第164行 ARCH ?=arm /第189行3、配置busybox輸入make menuconfig進行配置(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下設備類型的支持dev的創建有三種方法:手動創建:在制作根文件系統的時候,就在dev目錄下創建好要使用的設備文件,系統掛接根文件系統后,就可以使用dev目錄下的設備文件了。使用devfs文件系統:這種方法已經過時,具有不確定的設備映射、沒有足夠的主/次設備號、devfs消耗大量的內存。udev:它是個用戶程序,能根據系統中硬件設備的狀態動態的更新設備文件,包括設備文件的創建、刪除等。它的操作相對復雜,但靈活性很高mdev

60、是busybox自帶的一個簡化版的udev,適合于嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動態加載驅動程序時,自動產生驅動程序所需的節點文件。在以busybox為基礎構建嵌入式linux的根文件系統時,使用它是最優的選擇。下面的選項將增加對mdev的支持。Linux System Utilities *Support /etc/mdev.conf *Support command execution at device addition/removalmdev的配置參考bosybox目錄下decs/mdev.txt,首先mdev有兩個主要的應用:初始化對象和動

溫馨提示

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

最新文檔

評論

0/150

提交評論