嵌入式Linux系列第4篇:Kernel編譯下載
1.引言本篇接上一篇,給大家介紹Linux Kernel的編譯和下載運(yùn)行,達(dá)到的預(yù)期效果是都下載到板子后,可以正常通過串口登錄到Linux系統(tǒng)里。2.Linux Kernel編譯NUC972 Linux Kernel下載地址為 github....
1.引言
本篇接上一篇,給大家介紹Linux Kernel的編譯和下載運(yùn)行,達(dá)到的預(yù)期效果是都下載到板子后,可以正常通過串口登錄到Linux系統(tǒng)里。
2.Linux Kernel編譯
NUC972 Linux Kernel下載地址為 github.com/OpenNuvoton/NUC970_Linux_Kernel
下載完成后,放到Ubuntu虛擬機(jī)的~/nuc972/kernel 文件夾下,解壓縮。
編譯前還記得前兩篇文章說的吧,我們先source /home/topsemic/nuc972/toolchain/environment.sh
進(jìn)入到內(nèi)核目錄,第一步先執(zhí)行make nuc972_defconfig 生成.config文件,
這一步是不是很眼熟,和上一講uboot編譯是類似的。
第二步執(zhí)行:make uImage,編譯內(nèi)核,報(bào)錯(cuò)了,錯(cuò)誤是不是和編譯uboot也類似啊。
同樣的我們也是要改Makefile
這次我們用vim來改一次,
提示我們不支持vim這個(gè)指令,那我們安裝一下吧,人家都給提示了,輸入sudo apt install vim
下面是安裝過程
OK,安裝完畢,Ubuntu系統(tǒng)安裝個(gè)東西真是方便啊,一條指令就搞定了。輸入vim Makefile 顯示如下:
花花綠綠的看著不錯(cuò)啊,先找到設(shè)置交叉編譯鏈的地方,具體方法如下圖1、2、3步驟描述
修改方法第一篇博客介紹的大家還記得嗎?先輸入I,進(jìn)入到插入模式,然后修改即可
然后ESC退出插入模式,最后輸入:wq保存退出即可。
以后大家多使用vim吧。
修改完Makefile后,再一次make uImage,
靠,什么情況,又報(bào)錯(cuò)了,我記得之前沒遇到這個(gè)錯(cuò)誤啊。
網(wǎng)上查了下,說是和文件系統(tǒng)有關(guān),是權(quán)限的問題,使用sudo 編譯就行,于是我激動(dòng)的sudo make uImage,咦
這個(gè)命令找不動(dòng),不應(yīng)該啊,我已經(jīng)source了,而且輸入arm-none- Table鍵也能找到啊,
于是又尋求度娘,有人說Makefile路徑問題,于是我再改一次,把絕對路徑加上
再來一次,
這次倒是沒有剛才arm-none-linux-gnueabi-gcc找不到的問題,不過還是有一開始提示的錯(cuò)誤:
這是怎么回事? 我靈機(jī)一動(dòng),上面提示沒有../rootfs
于是,我cd .. ,回到上級目錄,mkdir rootfs 建了一個(gè)rootfs文件夾,再次進(jìn)入到內(nèi)核目錄,輸入sudo make uImage
這一次看起來不太一樣,好像要成功的樣子,
不過最后還是有點(diǎn)小問題,還是目錄沒有的問題,我們再回到上級目錄建個(gè)文件夾image
最后再來一次sudo make uImage
怎么還有錯(cuò)誤,我之前編譯根本沒有這些問題的啊,郁悶了。。。
再次上網(wǎng)搜索,說這個(gè)命令是uboot編譯出來的,因?yàn)闆]有找到它的原因,我看了下我的uboot 里tools目錄,果然是有這個(gè)命令的,
有網(wǎng)友說把它復(fù)制到交叉編譯鏈的bin目錄里就行了,于是我放進(jìn)去嘗試,還是有問題,最后又百度,有網(wǎng)友說還得改個(gè)名字,前面得加上交叉編譯的名字,于是加上arm-none-linux-gnueabi-,
最后再次編譯,終于大功告成,不容易?。?/p>
在image目錄里的970uimage就是我們需要的文件了。
3.燒寫kernel
1)具體怎么燒錄,上一篇已經(jīng)描述過了,這里要注意燒寫地址:
2)另外上一節(jié)已經(jīng)把uboot燒寫進(jìn)去了,這里不再重復(fù)了
3)這里還要再燒個(gè)env.txt
板子里有三個(gè)東西就可以了。
4.運(yùn)行
1)使用debug串口連接上后,會(huì)進(jìn)入如下界面
2)這時(shí)參考官方文檔輸入set bootcmd nboot 0x7fc0 0 0x200000\; bootm 0x7fc0
提示如下:
這什么情況,官方文檔逗我玩呢??
后來發(fā)現(xiàn)把set 改為setenv就好了,寫文檔的人得靠點(diǎn)譜啊,不然真是坑人啊。
然后再輸入 saveenv
3)按下復(fù)位鍵,這時(shí)就呼呼的跑起來了
靠,又出現(xiàn)錯(cuò)誤了,這個(gè)足足卡了我1個(gè)多小時(shí)今天晚上。
最后也是靈光一現(xiàn),定位到是上面編譯內(nèi)核時(shí)提示的rootfs文件夾有問題那里,難道我自己隨便建個(gè)空的rootfs就可以嗎?
另外回憶之前我用別人提供好的bsp包沒出現(xiàn)這個(gè)問題,那里默認(rèn)是有rootfs文件目錄的,于是把那里的rootfs搞過來,解壓后,再重新編譯下(先sudo make clean,再sudo make uImage)并重新下載一次就ok了。我猜測內(nèi)核里用到rootfs文件夾里的東西。 原來都沒有考慮過這個(gè)問題啊我。
最后成功的現(xiàn)象是:
可以成功登陸進(jìn)去,輸入指令了!
至于這個(gè)rootfs文件夾里東西是怎么來的,我們下篇文章再說。
5.結(jié)束語
本篇文章寫下來,自己收獲了很多,本以為之前調(diào)通的東西,很容易就操作出來了,沒想到遇到這么多新的問題,不過遇到問題是好事,會(huì)讓你思考一些原來沒有注意到的地方。
順便提下,這里內(nèi)核默認(rèn)用的ramdisk根文件系統(tǒng),這個(gè)文件系統(tǒng)是存在RAM里的,所以你在里面寫入東西,一斷電就沒有了。這和常規(guī)在NAND上的Yaffs2文件系統(tǒng)不一樣。下一篇介紹如果換成NAND Yaffs2文件系統(tǒng)。
經(jīng)過這一篇的講解,你如果實(shí)際動(dòng)手實(shí)現(xiàn)后,應(yīng)該對嵌入式Linux更加感興趣了吧,相當(dāng)于我們會(huì)重裝系統(tǒng)了。雖然困難重重,但是不要放棄。
有任何問題歡迎大家留言交流討論。
下期會(huì)給大家介紹如何改成NAND Yaffs2文件系統(tǒng)。
該系列往期文章見:
1.從單片機(jī)轉(zhuǎn)Linux系列第1篇:開發(fā)環(huán)境搭建
2.嵌入式Linux系列第2篇:運(yùn)行Hello World
推薦閱讀:天秀時(shí)尚網(wǎng)