ARM在嵌入式linux內核裁剪與移植的應用
微處理器用一片或少數幾片大規模集成電路組成的中央處理器。這些電路執行控制部件和算術(shù)邏輯部件的功能。微處理器與傳統的中央處理器相比,具有體積小,重量輕和容易模塊化等優(yōu)點(diǎn)。微處理器的基本組成部分有:寄存器堆、運算器、時(shí)序控制電路,以及數據和地址總線(xiàn)。微處理器能完成取指令、執行指令,以及與外界存儲器和邏輯部件交換信息等操作,是微型計算機的運算控制部分。它可與存儲器和外圍電路芯片組成微型計算機。但這些專(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)域。
本文引用地址:http://dyxdggzs.com/article/149868.htmLinux是一類(lèi)Unix計算機操作系統的統稱(chēng)。Linux操作系統的內核的名字也是Linux.Linux操作系統也是自由軟件和開(kāi)放源代碼發(fā)展中最著(zhù)名的例子。嚴格來(lái)講,Linux這個(gè)詞本身只表示Linux內核,但在實(shí)際上人們已經(jīng)習慣了用Linux來(lái)形容整個(gè)基于Linux內核,并且使用GNU工程各種工具和數據庫的操作系統。Linux得名于計算機業(yè)余愛(ài)好者LinuSTorvalds.Linux的程序源碼全部公開(kāi),任何人都可以根據自己的需要裁剪內核,以適應自己的系統。文章以將linux移植到ARM920T內核的s3c2410處理器芯片為例,介紹了嵌入式linux內核的裁剪以及移植過(guò)程,文中介紹的基本原理與方法技巧也可用于其它芯片。
2 內核移植過(guò)程
2.1 建立交叉編譯環(huán)境
在一種計算機環(huán)境中運行的編譯程序,能編譯出在另外一種環(huán)境下運行的代碼,我們就稱(chēng)這種編譯器支持交叉編譯。這個(gè)編譯過(guò)程就叫交叉編譯。簡(jiǎn)單地說(shuō),就是在一個(gè)平臺上生成另一個(gè)平臺上的可執行代碼。這里需要注意的是所謂平臺,實(shí)際上包含兩個(gè)概念:體系結構(Architecture)、操作系統(Operating System)。同一個(gè)體系結構可以運行不同的操作系統;同樣,同一個(gè)操作系統也可以在不同的體系結構上運行。舉例來(lái)說(shuō),我們常說(shuō)的x86 Linux平臺實(shí)際上是Intel x86體系結構和Linux for x86操作系統的統稱(chēng);而x86 WinNT平臺實(shí)際上是Intel x86體系結構和Windows NT for x86操作系統的簡(jiǎn)稱(chēng)。
交叉編譯交叉編譯呢,簡(jiǎn)單地說(shuō),就是在一個(gè)平臺上生成另一個(gè)平臺上的可執行代碼。這里需要注意的是所謂 平臺,實(shí)際上包含兩個(gè)概念:體系結構(Architecture)、操作系統(Operating System)。同一個(gè)體系結構可以運行不同的操作系統;同樣,同一個(gè)操作系統也可以在不同的體系結構上運行。
交叉編譯器完整的安裝涉及到多個(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
Makefile文件Makefile一個(gè)工程中的源文件不計數,其按類(lèi)型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規則來(lái)指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復雜的功能操作,因為makefile就像一個(gè)Shell腳本一樣,其中也可以執行操作系統的命令。
修改內核目錄樹(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ò)程
3.1 支持啟動(dòng)時(shí)掛載devfs
為了使內核支持devfs以及在啟動(dòng)且在/sbin/init運行之前能自動(dòng)掛載/dev為devfs文件系統,應修改fs/Keonfig文件,找到menuPseudo filesystems并添加如下語(yǔ)句:
3.2 配置內核產(chǎn)生。config文件
Linux內核裁減的配置菜單命令有好幾個(gè)配置方法,這幾個(gè)方法實(shí)現的功能類(lèi)似,只是與用戶(hù)的交互界面不同。其中:
make config是基于文本的、最為傳統的配置界面,可進(jìn)入命令行;
make menuconfig是基于文本菜單的配置界面;
make xconfig是基于圖形窗口模式的配置界面,在Xwindow下推薦使用該界面。
在這3種方法中,make menuconfig使用最為廣泛,這里選用的是make menuconfig的配置方法。相應的配置有三種選擇,它們分別代表的含義如下:
Y:將該功能編譯進(jìn)內核;
N:不將該功能編譯進(jìn)內核;
M:將該功能編譯成可以在需要時(shí)動(dòng)態(tài)插入到內核中的模塊。
運行make menuconfig時(shí),在smdk2410_defeonfig基礎上,其所增刪的內核配置項如下:
(1)增加對模塊的支持
Loadable module support--->
[*]Enable loadable module support
[*]Automatic kernel module loading
System Type-->
4 內核編譯與下載
4.1 內核編譯
編譯內核時(shí),可運行以下命令:其一是#make clean,即清理環(huán)境,保證沒(méi)有不正確的依賴(lài)文件存在;二是#make dep,即將內核源碼樹(shù)中每個(gè)子目錄產(chǎn)生的.depend文件建立起依賴(lài)關(guān)系;三是#make zImage,用于建立壓縮的linux內核映像。
4.2 下載zImage到開(kāi)發(fā)板
下載zImage到開(kāi)發(fā)板的方法很多,常見(jiàn)的有網(wǎng)絡(luò )下載(如FTP、TFTP等方式)、串口下載、USB下載等。本文采用FTP方式來(lái)移植Linux內核映像文件到目標機NAND FLASH中。代碼如下:
CRANE2410#tftp 0x30008000 zImage至此,該嵌入式Linux的編譯和移植工作便告全部完成。
5 結束語(yǔ)
本文以將linux移植到ARM920T內核的s3c2410處理器芯片為例,介紹了嵌入式linux內核裁剪以及移植的過(guò)程,并對移植中的關(guān)鍵技術(shù)和重要步驟給出了詳細的說(shuō)明。移植后的Linux系統在開(kāi)發(fā)板上運行穩定,性能良好。本文的操作過(guò)程對嵌入式Linux系統在其它處理器上的移植也具有參考意義。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論