基于A(yíng)RM的嵌入式linux 內核的裁剪與移植
0引言
微處理器的產(chǎn)生為價(jià)格低廉、結構小巧的CPU和外設的連接提供了穩定可靠的硬件架構,這樣,限制嵌入式系統發(fā)展的瓶頸就突出表現在了軟件方面。盡管從八十年代末開(kāi)始,已經(jīng)陸續出現了一些嵌入式操作系統(比較著(zhù)名的有Vxwork、pSOS、Neculeus和Windows CE)。但這些專(zhuān)用操作系統都是商業(yè)化產(chǎn)品,其高昂的價(jià)格使許多低端產(chǎn)品的小公司望而卻步;而且,源代碼封閉性也大大限制了開(kāi)發(fā)者的積極性。而Linux的開(kāi)放性,使得許多人都認為L(cháng)inux非常適合多數Intemet設備。Linux操作系統可以支持不同的設備和不同的配置。Linux對廠(chǎng)商不偏不倚,而且成本極低,因而很快成為用于各種設備的操作系統。嵌入式linux是大勢所趨,其巨大的市場(chǎng)潛力與醞釀的無(wú)限商機必然會(huì )吸引眾多的廠(chǎng)商進(jìn)入這一領(lǐng)域。
1 嵌入式linux操作系統
Linux為嵌入操作系統提供了一個(gè)極有吸引力的選擇,它是個(gè)和Unix相似、以核心為基礎、全內存保護、多任務(wù)、多進(jìn)程的操作系統??梢灾С謴V泛的計算機硬件,包括X86、Alpha、Sparc、MIPS、PPC、ARM、NEC、MOTOROLA等現有的大部分芯片。Linux的程序源碼全部公開(kāi),任何人都可以根據自己的需要裁剪內核,以適應自己的系統。文章以將linux移植到ARM920T內核的s3c2410處理器芯片為例,介紹了嵌入式linux內核的裁剪以及移植過(guò)程,文中介紹的基本原理與方法技巧也可用于其它芯片。
2 內核移植過(guò)程
2.1 建立交叉編譯環(huán)境
交叉編譯的任務(wù)主要是在一個(gè)平臺上生成可以在另一個(gè)平臺上執行的程序代碼。不同的CPU需要有不同的編譯器,交叉編譯如同翻譯一樣,它可以把相同的程序代碼翻譯成不同的CPU對應語(yǔ)言。
交叉編譯器完整的安裝涉及到多個(gè)軟件安裝,最重要的有binutils、gcc、glibc三個(gè)。其中,binutils主要用于生成一些輔助工具;gcc則用來(lái)生成交叉編譯器,主要生成arm―linux―gcc交叉編譯工具;glibc主要是提供用戶(hù)程序所使用的一些基本的函數庫。
自行搭建交叉編譯環(huán)境通常比較復雜,而且很容易出錯。本文使用的是開(kāi)發(fā)板自帶的交叉編譯器,即CROSS一3.3.4.交叉編譯器,該編譯只需將光盤(pán)中的arm―linux一3.3.4.bar.bz2用tar ixvf arm―linux一3.3.4.bar.bz2命令解壓到/usr/local/arm下即可。
2.2 修改Makefile
修改內核目錄樹(shù)根下的Makefile時(shí),可先指明交叉編譯器。設計時(shí),可向Makefile中添加如下內容:
ARCH ?=arm
CROSS_COMPILE?=arm-linux-然后設置PATH環(huán)境變量,使其可以找到其交叉編譯工具鏈,然后運行vi~/.bashrc,再添加如下內容:
export PATH=/usr/local/arln―linux一3.4.4/bin:$PATH
2.3 設置Flash分區
此處一共要修改3個(gè)文件,分別如下:
(1)在arch/arm/machs3c2410/devs.c文件中添加如下內容:
#includelinux/mtd/partitions.h>
#includelinux/mtd/nand.h>
#includeasm/arch/nand.h>
然后再建立Nand Flash分區表;同時(shí)建立Nand F1ash芯片支持,最后加入Nand Flash芯片并支持到Nand Flash驅動(dòng)。
另外,還要修改arch/arm/machs3c2410/devs.C文件中的s3c_device_nand結構體變量,同時(shí)添加對dev成員的賦值。
(2)指定啟動(dòng)時(shí)初始化
內核啟動(dòng)時(shí),可以依據對分區的設置進(jìn)行初始配置,然后修改arch/am4mach―s3c2410/machsmdk2410.e文件下的smdk2410_devices[],指明初始化時(shí)包括在前面所設置的flash分區信息,并添加如下語(yǔ)句:
s3c_device_nand,
(3)禁止Flash ECC校驗
內核一般都是通過(guò)UBOOT寫(xiě)到Nand Flash的。UBOOT則通過(guò)軟件ECC算法來(lái)產(chǎn)生ECC校驗碼,這與內核校驗的ECC碼不一樣,內核中的ECC碼是由S3C2410中Nand Flash控制器產(chǎn)生的。所以,這里選擇禁止內核ECC校驗。
修改drivers/mtd/nand/s3c2410.C 下的s3c2410_nand_init_chip ()函數,可在該函數體最后加上如下一條語(yǔ)句:
chip->eccmode=NAND_ECC_NONE;
3 內核配置過(guò)程
評論