S5PV210(TQ210)學習筆記——內(nèi)核移植與文件系統(tǒng)構(gòu)建
內(nèi)核移植其實很簡單,因為內(nèi)核是linus率領的linux內(nèi)核開發(fā)團隊開發(fā)并維護的,我們只需要跟我們的平臺交叉編譯一下即可使用,但是,內(nèi)核移植也不簡單,因為內(nèi)核移植起見出現(xiàn)任何問題都可能會被卡住,因為內(nèi)核代碼非常龐大,我們無法通讀內(nèi)核代碼,下面是我移植期間遇到的各種悲催的問題和解決方案,首先是必備的開發(fā)環(huán)境:
本文引用地址:http://m.butianyuan.cn/article/201611/322806.htma) Linux內(nèi)核代碼,版本3.8.3
b) S5PV210開發(fā)板(我的是TQ210)
c) HOST環(huán)境是WIN7(64位)下安裝的Ubuntu虛擬機(12.10)
一 內(nèi)核編譯
從Linux內(nèi)核網(wǎng)站(kernel.org)下載內(nèi)核代碼、解壓并進入內(nèi)核目錄
(1)修改Makefile,將195行和196行改為:
- ARCH=arm
- CROSS_COMPILE?=arm-linux-
- makes5pv210_defconfig
- makezImage
- makeuImage
a. 編譯的內(nèi)核類型錯誤,比如您的uboot使用的是uImage,而您編譯的是zImage。
b. 移植的uboot存在問題,沒能正確的拷貝內(nèi)核到正確的內(nèi)存地址并啟動。
c. 內(nèi)核存在某些配置,我們沒有配置。
經(jīng)過查看內(nèi)核配置項知道,內(nèi)核默認采用的UART1打印調(diào)試信息,因此,執(zhí)行:
- makemenuconfig
編譯完內(nèi)核之后再次下載并嘗試運行,這時,可以看到內(nèi)核打印的信息了,如果您不幸只看到“Uncompressing Linux... done, booting the kernel.”就沒有任何輸出了,那么請檢查uboot傳入的機器碼跟內(nèi)核機器碼是否匹配,如果不匹配請修正,然后重新編譯運行內(nèi)核或者uboot,如果修正之后仍然看不到其他輸出,那么請檢查uboot的bootargs參數(shù),bootargs中必須配置console=ttySAC0,否則也看不到打印信息。
如果沒有出現(xiàn)上面的錯誤,那么您的內(nèi)核已經(jīng)可以打印出很多信息,但是由于內(nèi)核默認沒有提供對Nand或網(wǎng)卡的支持,無法掛接文件系統(tǒng),所以仍然無法正常運行。為了能使內(nèi)核進入控制臺,為后面的驅(qū)動開發(fā)提供環(huán)境,我們先制作文件系統(tǒng),然后來移植網(wǎng)卡驅(qū)動,讓內(nèi)核NFS方式掛接文件系統(tǒng),然后我們就可以開發(fā)其他驅(qū)動了,如Nand、LCD、聲卡等等。
二 構(gòu)建文件系統(tǒng)
其實構(gòu)建文件系統(tǒng)還是比較簡單的,注意幾個地方,然后按部就班的來就可以了。
(1)創(chuàng)建根文件系統(tǒng)目錄結(jié)構(gòu),可以使用如下腳本:
- #!/bin/sh
- echo"------Createrootfsdirectonsstart...--------"
- mkdirrootfs
- cdrootfs
- echo"--------Createroot,dev....----------"
- mkdirrootdevetcboottmpvarsysproclibmnthomeusr
- mkdiretc/init.detc/rc.detc/sysconfig
- mkdirusr/sbinusr/binusr/libusr/modules
- echo"makenodeindev/consoledev/null"
- sudomknod-m600dev/consolec51
- sudomknod-m600dev/nullc13
- mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
- mkdirvar/libvar/lockvar/runvar/tmp
- chmod1777tmp
- chmod1777var/tmp
- echo"-------makedirectiondone---------"
在這里我將腳本命名為mkrootfs.sh,接下來給腳本加可執(zhí)行權(quán)限(即chmod a+x mkrootfs)并運行腳本。我的腳本是在/nfsroot目錄下運行的,所以我的根文件系統(tǒng)的根目錄為/nfsroot/rootfs,后面均以該目錄為例闡述。
(2)編譯Busybox
到Busybox下載最新版的Busybox源碼,我是用的是1.21.0版本,下載完后解壓并進入busybox目錄,首先是配置busybox
- makemenuconfig
配置菜單跟配置內(nèi)核時的差不多,依次進入Busybox Settings =>Build Options =>Cross Compiler prefix (NEW),設置為編譯器的前綴,我的是arm-linux-。網(wǎng)上有些朋友還推薦選擇Busybox Settings => Build Options =>Build BusyBox as a static binary (no shared libs),但是如果我們正確拷貝編譯器了運行庫的話,不設置也可以?,F(xiàn)在可以編譯Busybox了,執(zhí)行
- make
編譯過程很順利,我這里沒有遇到任何錯誤,接下來將編譯好的Busybox安裝到/nfsroot/rootfs就可以了,執(zhí)行
- makeCONFIG_PREFIX=/nfsroot/rootfsinstall
(3)拷貝編譯器運行庫
我的編譯器是4.5.1版本的,拷貝arm-none-linux-gnueabi/sys-root/lib的所有動態(tài)庫到/nfsroot/rootfs/lib下,為了不拷貝連接,應該加上”-d"選項,執(zhí)行
- cp*so*/nfsroot/rootfs/lib-d
同樣拷貝arm-none-linux-gnueabi/sys-root/usr/lib下的所有動態(tài)庫到/nfsroot/rootfs/usr/lib下,執(zhí)行
- cp*so*/nfsroot/rootfs/usr/lib-d
(4)構(gòu)建etc目錄
評論