上篇講了如何移植 uboot 到 I.MX6ULL開發(fā)板上,現(xiàn)在開始學(xué)習(xí)如何移植 Linux 內(nèi)核。
|獲取Linux 內(nèi)核
Linux 由 Linux 基金會管理與發(fā)布,所以你想獲取最新的Linux 版本就可以在這個網(wǎng)站上下載;
4.x 版本的 Linux 和 5.x 版本沒有本質(zhì)上的區(qū)別,5.x 更多的是加入了一些新的平臺、新的外設(shè)驅(qū)動而已。
NXP 會從 https://www.kernel.org 下載某個版本的 Linux 內(nèi)核,然后將其移植到自己的 CPU上,測試成功以后就會將其開放給 NXP 的 CPU 開發(fā)者。
開發(fā)者下載 NXP 提供的 Linux 內(nèi)核,然后將其移植到自己的產(chǎn)品上。
NXP 提供的 Linux 源碼可以在原子公開資料包中找到,路徑如下:
開發(fā)板光盤->1、例程源碼->4、NXP 官方原版 Uboot和 Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
|編譯Linux內(nèi)核
編譯內(nèi)核之前需要先在 ubuntu 上安裝 lzop 庫,否則內(nèi)核編譯會失??!命令如下:
sudo apt-get install lzop //下面兩個庫如果沒安裝也需要安裝一下 sudoapt-getinstallbuild-essential sudo apt-get install libncurses5-dev // 查看是否安裝 dpkg -s build-essential dpkg -s libncurses5-dev
新建一個文件夾(nxp_linux),然后將linux內(nèi)核壓縮包拷貝到文件夾中并解壓,解壓命令為:
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
解壓后的文件如下:
編譯Linux內(nèi)核之前要先配置Linux內(nèi)核。每個板子都有其對應(yīng)的默認配置文件,這些配置文件保存在“arch/arm/configs”目錄中。
imx_v7_defconfig和imx_v7_mfg_defconfig都可以作為NXP官方開發(fā)板IMX6ULL EVK的默認配置文件,但是一般都使用后者,因為后者編譯出來的zImage可以通過NXP官方提供的MfgTool工具進行燒寫;
在目錄下新建一個腳本文件(build.sh),然后在這個 shell 腳本里面輸入如下所示內(nèi)容:
#!/bin/sh #編譯之前先清理 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean #配置Linux內(nèi)核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig #編譯Linux內(nèi)核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
給予該腳本可執(zhí)行權(quán)限,命令如下:
chmod777build.sh
運行腳本編譯內(nèi)核,命令如下:
. build.sh
編譯完成后,會得到兩個重要文件:
Linux內(nèi)核鏡像文件: 存放路徑為 arch/arm/boot/zImage IMX6ULL EVK開發(fā)板對應(yīng)的設(shè)備樹文件: 存放路徑為 arch/arm/boot/dts/imx6ull-14x14-evk.dtb
vmlinux 、Image ,zImage 、uImage 的區(qū)別:
vmlinux是ELF格式的文件,是編譯出來的最原始的內(nèi)核文件,編譯出來差不多有16MB,是未壓縮的。在實際中我們不會使用vmlinux,而是使用zImage或uImage這樣的 Linux 內(nèi)核鏡像文件。 Image是Linux內(nèi)核鏡像文件,但是Image僅包含可執(zhí)行的二進制數(shù)據(jù)。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符號表什么的。但是 Image 是沒有壓縮過的,Image保存在arch/arm/boot目錄下,其大小大概在12MB 。 zImage是經(jīng)過gzip壓縮后的Image,經(jīng)過壓縮以后其大小大概在6MB左右。 uImage是老版本uboot專用的鏡像文件,uImag是在zImage前面加了一個長度為 64字節(jié)的“頭” ,這個頭信息描述了該鏡像文件的類型、加載位置、生成時間、大小等信息。但是新的uboot已經(jīng)支持了 zImage 啟動!所以已經(jīng)很少用到uImage了
|內(nèi)核啟動測試
將生成的zImage和imx6ull-14x14-evk.dtb這兩個文件下載到IMX6U開發(fā)板上進行測試。
首先檢查uboot中的環(huán)境變量bootargs,如果環(huán)境變量異常請看上一篇推文配置:
然后拷貝zImage和imx6ull-14x14-evk.dtb這兩個文件到Ubuntu的tftp目錄下:
最后啟動開發(fā)板,進入uboot命令行模式,輸入如下命令以上兩個文件下載到開發(fā)板中并啟動:
tftp 80800000 zImage tftp 83000000 imx6ull-14x14-evk.dtb bootz 80800000 - 83000000
啟動成功,但是觸摸不能使用
|根文件系統(tǒng)缺失錯誤
Linux內(nèi)核啟動以后是需要根文件系統(tǒng)的,根文件系統(tǒng)存在哪里是由uboot的 bootargs環(huán)境變量指定,bootargs會傳遞給Linux內(nèi)核作為命令行參數(shù) 。
上一篇推文設(shè)置root=/dev/mmcblk1p2,也就是說根文件系統(tǒng)存儲在/dev/mmcblk1p2 中,也就是 EMMC 的分區(qū)2中。
在實際的工作中開發(fā)一個產(chǎn)品,這個產(chǎn)品的第一版硬件出來以后我們是沒有對應(yīng)的根文件系統(tǒng)可用的,必須要自己做根文件系統(tǒng)。
在構(gòu)建出對應(yīng)的根文件系統(tǒng)之前 Linux 內(nèi)核是沒有根文件系統(tǒng)可用的,此時 Linux 內(nèi)核啟動以后會出現(xiàn)下面提示:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)也就是提示內(nèi)核崩潰,因為 VFS(虛擬文件系統(tǒng))不能掛載根文件系統(tǒng),因為根文件系統(tǒng)目錄不存在。
即使根文件系統(tǒng)目錄存在,如果根文件系統(tǒng)目錄里面是空的依舊會提示內(nèi)核崩潰。這個就是根文件系統(tǒng)缺失導(dǎo)致的內(nèi)核崩潰,但是內(nèi)核是啟動了的,只是根文件系統(tǒng)不存在而已。
|在 Linux 中添加自己的開發(fā)板
通過編譯 NXP 官方 I.MX6ULL EVK 開發(fā)板對應(yīng)的 Linux 內(nèi)核,發(fā)現(xiàn)其可以在野火的 EMMC 版本開發(fā)板啟動,所以就參考 I.MX6ULL EVK 開發(fā)板的設(shè)置,在 Linux 內(nèi)核中添加自己的 I.MX6U 開發(fā)板。
先壓縮備份NXP編譯出來的內(nèi)核源碼文件,避免操作有誤重新編譯內(nèi)核,畢竟編譯一次內(nèi)核比較耗時間;
添加開發(fā)板默認配置文件
將arch/arm/configs目錄下的imx_v7_mfg_defconfig重新復(fù)制一 份, 命名 為imx_myboard_emmc_defconfig,命令如下:
cd arch/arm/configs cp imx_v7_mfg_defconfig imx_myboard_emmc_defconfig
添加開發(fā)板對應(yīng)的設(shè)備樹文件
添加適合正點原子 EMMC 版開發(fā)板的設(shè)備樹文件,進入目錄 arch/arm/boot/dts 中,復(fù)制一份 imx6ull-14x14-evk.dts,然后將其重命名為 imx6ull-myboard-emmc.dts,命令如下:
cd arch/arm/boot/dts cp imx6ull-14x14-evk.dts imx6ull-myboard-emmc.dts
.dts 是設(shè)備樹源碼文件,編譯 Linux 的時候會將其編譯為.dtb 文件。imx6ull-myboard-emmc.dts創(chuàng) 建 好 以 后還 需 要 修 改 文 件Makefile;
路徑:arch/arm/boot/dts/Makefile找到“ dtb-$(CONFIG_SOC_IMX6ULL)”配置項,在此配置項中加入“imx6ull-myboard-emmc.dtb” ,如下所示:
這樣編譯 Linux 的時候就可以從imx6ull-myboard-emmc.dts編譯出 imx6ull-myboard-emmc.dtb 文件了。
添加新的腳本
新建一個腳本文件(build_myboard.sh),腳本內(nèi)容如下:
#!/bin/sh #編譯之前先清理 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean #配置Linux內(nèi)核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_emmc_defconfig #編譯Linux內(nèi)核 makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-all-j16
給予該腳本可執(zhí)行權(quán)限,命令如下:
chmod777build_myboard.sh
運行腳本編譯內(nèi)核,命令如下:
. build_myboard.sh
編譯完成后,會得到兩個重要文件:
Linux內(nèi)核鏡像文件: 存放路徑為 arch/arm/boot/zImage IMX6ULL EVK開發(fā)板對應(yīng)的設(shè)備樹文件: 存放路徑為 arch/arm/boot/dts/imx6ull-myboard-emmc.dtb
然后下載到開發(fā)板,啟動內(nèi)核即可,顯示登陸提示就說明內(nèi)核啟動成功。
審核編輯:劉清
-
Uboot
+關(guān)注
關(guān)注
4文章
124瀏覽量
28055 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
315瀏覽量
21557 -
Ubuntu系統(tǒng)
+關(guān)注
關(guān)注
0文章
85瀏覽量
3859
原文標題:i.MX6ULL|移植內(nèi)核
文章出處:【微信號:玩轉(zhuǎn)單片機,微信公眾號:玩轉(zhuǎn)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論