本文進(jìn)行Linux內(nèi)核的移植。
1 Linux內(nèi)核簡(jiǎn)介
NXP 會(huì)從linux內(nèi)核官網(wǎng)下載某個(gè)版本,然后將其移植到自己的 CPU上,測(cè)試成功后就會(huì)將其開(kāi)放給NXP的CPU開(kāi)發(fā)者。開(kāi)發(fā)者下載 NXP 提供的 Linux 內(nèi)核,然后將其移植到自己的產(chǎn)品上。
本文我們就使用NXP提供的Linux源碼,文件名為:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
2 Linux內(nèi)核編譯
編譯內(nèi)核之前需要先在ubuntu上安裝lzop庫(kù),另外,圖形化配置工具還需要ncurses庫(kù)支持,安裝命令為:
sudo apt-get install lzop
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
在Ubuntu中新建一個(gè)文件夾,然后將linux內(nèi)核壓縮包拷貝到文件夾中并解壓,解壓命令為:
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
解壓完成后
進(jìn)入該文件夾,新建一個(gè)build.sh腳本文件來(lái)編譯,腳本中的內(nèi)容如下:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
給予該腳本可執(zhí)行權(quán)限,然后運(yùn)行,編譯的時(shí)候會(huì)彈出Linux圖形配置界面, 這里不需要做任何的配置, 直接按兩下ESC鍵退出圖形界面
之后會(huì)自動(dòng)開(kāi)始編譯Linux內(nèi)核。
編譯完成以后就會(huì)在arch/arm/boot
這個(gè)目錄下生成一個(gè)zImage
文件,該文件就是要用的Linux鏡像文件。另外也會(huì)在arch/arm/boot/dts
下生成很多.dtb 文件,這些.dtb 就是設(shè)備樹(shù)文件。
vmlinux 、Image ,zImage 、uImage 的區(qū)別
vmlinux
是ELF格式的文件,是編譯出來(lái)的最原始的內(nèi)核文件,編譯出來(lái) 差不多有16MB,是未壓縮的。在實(shí)際中我們不會(huì)使用vmlinux,而是使用zImage或uImage這樣的 Linux 內(nèi)核鏡像文件。
Image
是Linux內(nèi)核鏡像文件,但是Image僅包含可執(zhí)行的二進(jìn)制數(shù)據(jù)。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符號(hào)表什么的。但是 Image 是沒(méi)有壓縮過(guò)的,Image保存在arch/arm/boot目錄下,其大小大概在12MB 。
zImage
是經(jīng)過(guò)gzip壓縮后的Image,經(jīng)過(guò)壓縮以后其大小大概在6MB左右。
uImage
是老版本uboot專用的鏡像文件,uImag是在zImage前面加了一個(gè)長(zhǎng)度為 64字節(jié)的“頭” ,這個(gè)頭信息描述了該鏡像文件的類型、加載位置、生成時(shí)間、大小等信息。但是新的uboot已經(jīng)支持了 zImage 啟動(dòng)! 所以已經(jīng)很少用到uImage了。
3 Linux內(nèi)核源碼結(jié)構(gòu)
Linux內(nèi)核編譯過(guò)程會(huì)生成一些文件,下面來(lái)看一下編譯后的內(nèi)核源碼結(jié)構(gòu),可以看出多出了一些編譯文件
具體描述如下:
arch目錄
這個(gè)目錄是和架構(gòu)有關(guān)的目錄,比如arm、arm64、avr32、x86等等架構(gòu)。每種架構(gòu)都對(duì)應(yīng)一個(gè)目錄,在這些目錄中又有很多子目錄,比如boot、common、configs等等。
block目錄 block是Linux下塊設(shè)備目錄, 像SD卡、EMMC、NAND、硬盤(pán)等存儲(chǔ)設(shè)備就屬于塊設(shè)備,block目錄中存放著管理塊設(shè)備的相關(guān)文件。
crypto目錄 crypto目錄里面存放著加密文件,比如常見(jiàn)的crc、crc32、md4、md5、hash等加密算法。
Documentation目錄 此目錄里面存放著Linux相關(guān)的文檔,如果要想了解Linux某個(gè)功能模塊或驅(qū)動(dòng)架構(gòu)的功能,就可以在Documentation目錄中查找有沒(méi)有對(duì)應(yīng)的文檔。
drivers目錄 驅(qū)動(dòng)目錄文件,此目錄根據(jù)驅(qū)動(dòng)類型的不同,分門(mén)別類進(jìn)行整理,比如drivers/i2c就是I2C相關(guān)驅(qū)動(dòng)目錄,drivers/gpio就是GPIO相關(guān)的驅(qū)動(dòng)目錄,這是我們學(xué)習(xí)的重點(diǎn)。
firmware 目錄 此目錄用于存放固件。
fs目錄 此目錄存放文件系統(tǒng),比如fs/ext2、fs/ext4、fs/f2fs等,分別是ext2、ext4 和 f2fs等文件系統(tǒng)。
4 Linux內(nèi)核啟動(dòng)測(cè)試
將編譯出來(lái)的zImage和imx6ull-14x14-evk.dtb復(fù)制到Ubuntu中的tftp目錄下,之后會(huì)通過(guò)uboot 的tftp命令將其下載到開(kāi)發(fā)板中。
在測(cè)試之前確保uboot中的環(huán)境變量bootargs內(nèi)容如下(使用print指令查看):
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
如果不是的話,可以使用如下指令設(shè)置一下:
setenv bootargs
'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
然后可以測(cè)試了,啟動(dòng)開(kāi)發(fā)板,串口中進(jìn)入uboot命令行模式,然后輸入如下命令將zImage和imx6ull-14x14-evk.dtb下載到開(kāi)發(fā)板中并啟動(dòng):
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
可以看到內(nèi)核啟動(dòng)了
最后到了系統(tǒng)登錄處,說(shuō)明Linux系統(tǒng)正常啟動(dòng)了(這次LCD上沒(méi)有了野火的圖形界面,可能是某些固件不匹配吧,先忽略)
4.1 根文件系統(tǒng)缺失的錯(cuò)誤
Linux內(nèi)核啟動(dòng)以后是需要根文件系統(tǒng)的,根文件系統(tǒng)存在哪里是由uboot的bootargs環(huán)境變量指定, bootargs會(huì)傳遞給Linux內(nèi)核作為命令行參數(shù) 。 比如之前設(shè)置的root=/dev/mmcblk1p2,也就是說(shuō)根文件系統(tǒng)存儲(chǔ)在/dev/mmcblk1p2中,即EMMC的分區(qū)2中。
因?yàn)樯弦黄臏y(cè)試時(shí),EMMC的分區(qū)2中燒寫(xiě)好了根文件系統(tǒng),所以設(shè)置root=/dev/mmcblk1p2,并且內(nèi)核正常啟動(dòng)。如果我們不設(shè)置根文件系統(tǒng)路徑,或者說(shuō)根文件系統(tǒng)路徑設(shè)置錯(cuò)誤的話會(huì)出現(xiàn)什么問(wèn)題?
我們將uboot中的bootargs環(huán)境變量改為“console=ttymxc0,115200” ,也就是不填寫(xiě)root的內(nèi)容了,命令如下:
setenv bootargs 'console=ttymxc0,115200'
saveenv
修改完成以后重新從網(wǎng)絡(luò)啟動(dòng),可以看到也是先啟動(dòng)了內(nèi)核:
但啟動(dòng)以后會(huì)有類似如下的錯(cuò)誤:
最后會(huì)有下面這一行:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
提示內(nèi)核崩潰,因?yàn)閂FS(虛擬文件系統(tǒng))不能掛載根文件系統(tǒng),目錄不存在。即使目錄存在,如果根文件系統(tǒng)目錄里面是空的依舊會(huì)提示內(nèi)核崩潰。
5 Linux中添加自己的開(kāi)發(fā)板
編譯NXP官方I.MX6ULL EVK開(kāi)發(fā)板對(duì)應(yīng)的Linux內(nèi)核,發(fā)現(xiàn)其可以在野火的EMMC版本開(kāi)發(fā)板啟動(dòng)。為了進(jìn)一步了解Linux內(nèi)核,我們可以參考官方開(kāi)發(fā)板的設(shè)置,在Linux內(nèi)核中添加自己的開(kāi)發(fā)板。
5.1 添加開(kāi)發(fā)板默認(rèn)配置文件
將arch/arm/configs
目錄下的imx_v7_mfg_defconfig
重新復(fù)制一份 , 命名為自己開(kāi)發(fā)板,如imx_myboard_defconfig
。
5.2 添加開(kāi)發(fā)板對(duì)應(yīng)的設(shè)備樹(shù)文件
進(jìn)入arch/arm/boot/dts
目錄中,復(fù)制一份imx6ull-14x14-evk.dts
,然后將其重命名為imx6ull-myboard.dts
。
然后還需要修改文件arch/arm/boot/dts/Makefile
,找到 dtb-$(CONFIG_SOC_IMX6ULL)
配置項(xiàng),在此配置項(xiàng)中加入“imx6ull-myboard.dtb” :
這樣編譯Linux的時(shí)候就可以從imx6ull-myboard.dts 編譯出 imx6ull-myboard.dtb 文件了。
總結(jié)一下以上的修改主要包括:
主要就是對(duì)文件復(fù)制一份并重命名,唯一修改的是Makefile文件。
5.3 添加新的編譯腳本
新建一個(gè)build_myboard.sh,寫(xiě)入如下內(nèi)容:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
編譯出zImage(arch/arm/boot目錄)和imx6ull-myboard.dtb (arch/arm/boot/dts目錄)后再次進(jìn)行Linux啟動(dòng)測(cè)試,可以到登錄提示,說(shuō)明Linux內(nèi)核啟動(dòng)成功。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5092文章
19177瀏覽量
307647 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210385 -
移植
+關(guān)注
關(guān)注
1文章
383瀏覽量
28193
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論