0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

i.MX6ULL嵌入式Linux開發(fā)3-Kernel移植

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-03-14 08:36 ? 次閱讀

本文進行Linux內(nèi)核的移植。

1 Linux內(nèi)核簡介

NXP 會從linux內(nèi)核官網(wǎng)下載某個版本,然后將其移植到自己的 CPU上,測試成功后就會將其開放給NXP的CPU開發(fā)者。開發(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庫,另外,圖形化配置工具還需要ncurses庫支持,安裝命令為:

sudo apt-get install lzop
sudo apt-get install build-essential 
sudo apt-get install libncurses5-dev 

在Ubuntu中新建一個文件夾,然后將linux內(nèi)核壓縮包拷貝到文件夾中并解壓,解壓命令為:

tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

解壓完成后

進入該文件夾,新建一個build.sh腳本文件來編譯,腳本中的內(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)限,然后運行,編譯的時候會彈出Linux圖形配置界面, 這里不需要做任何的配置, 直接按兩下ESC鍵退出圖形界面

之后會自動開始編譯Linux內(nèi)核。

編譯完成以后就會在arch/arm/boot這個目錄下生成一個zImage文件,該文件就是要用的Linux鏡像文件。另外也會在arch/arm/boot/dts下生成很多.dtb 文件,這些.dtb 就是設(shè)備樹文件。

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了。

3 Linux內(nèi)核源碼結(jié)構(gòu)

Linux內(nèi)核編譯過程會生成一些文件,下面來看一下編譯后的內(nèi)核源碼結(jié)構(gòu),可以看出多出了一些編譯文件

具體描述如下:

arch目錄

這個目錄是和架構(gòu)有關(guān)的目錄,比如arm、arm64、avr32、x86等等架構(gòu)。每種架構(gòu)都對應(yīng)一個目錄,在這些目錄中又有很多子目錄,比如boot、common、configs等等。

block目錄 block是Linux下塊設(shè)備目錄, 像SD卡、EMMC、NAND、硬盤等存儲設(shè)備就屬于塊設(shè)備,block目錄中存放著管理塊設(shè)備的相關(guān)文件。

crypto目錄 crypto目錄里面存放著加密文件,比如常見的crc、crc32、md4、md5、hash等加密算法。

Documentation目錄 此目錄里面存放著Linux相關(guān)的文檔,如果要想了解Linux某個功能模塊或驅(qū)動架構(gòu)的功能,就可以在Documentation目錄中查找有沒有對應(yīng)的文檔。

drivers目錄 驅(qū)動目錄文件,此目錄根據(jù)驅(qū)動類型的不同,分門別類進行整理,比如drivers/i2c就是I2C相關(guān)驅(qū)動目錄,drivers/gpio就是GPIO相關(guān)的驅(qū)動目錄,這是我們學(xué)習(xí)的重點。

firmware 目錄 此目錄用于存放固件。

fs目錄 此目錄存放文件系統(tǒng),比如fs/ext2、fs/ext4、fs/f2fs等,分別是ext2、ext4 和 f2fs等文件系統(tǒng)。

4 Linux內(nèi)核啟動測試

將編譯出來的zImage和imx6ull-14x14-evk.dtb復(fù)制到Ubuntu中的tftp目錄下,之后會通過uboot 的tftp命令將其下載到開發(fā)板中。

在測試之前確保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

然后可以測試了,啟動開發(fā)板,串口中進入uboot命令行模式,然后輸入如下命令將zImage和imx6ull-14x14-evk.dtb下載到開發(fā)板中并啟動:

tftp 80800000 zImage   
tftp 83000000 imx6ull-14x14-evk.dtb 
bootz 80800000 - 83000000  

可以看到內(nèi)核啟動了

pYYBAGIuABOALPHAAAFTAW9ilIA490.png

最后到了系統(tǒng)登錄處,說明Linux系統(tǒng)正常啟動了(這次LCD上沒有了野火的圖形界面,可能是某些固件不匹配吧,先忽略)

pYYBAGIuABqABpwJAAEgTQI9bnE679.png

4.1 根文件系統(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中。

因為上一篇的測試時,EMMC的分區(qū)2中燒寫好了根文件系統(tǒng),所以設(shè)置root=/dev/mmcblk1p2,并且內(nèi)核正常啟動。如果我們不設(shè)置根文件系統(tǒng)路徑,或者說根文件系統(tǒng)路徑設(shè)置錯誤的話會出現(xiàn)什么問題?

我們將uboot中的bootargs環(huán)境變量改為“console=ttymxc0,115200” ,也就是不填寫root的內(nèi)容了,命令如下:

setenv bootargs 'console=ttymxc0,115200' 
saveenv      

修改完成以后重新從網(wǎng)絡(luò)啟動,可以看到也是先啟動了內(nèi)核:

pYYBAGIuACKAehbbAAEXR-f7qEU106.png

但啟動以后會有類似如下的錯誤:

poYBAGIuACiAQSkVAAE5D4JJaug678.png

最后會有下面這一行:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 

提示內(nèi)核崩潰,因為VFS(虛擬文件系統(tǒng))不能掛載根文件系統(tǒng),目錄不存在。即使目錄存在,如果根文件系統(tǒng)目錄里面是空的依舊會提示內(nèi)核崩潰。

5 Linux中添加自己的開發(fā)板

編譯NXP官方I.MX6ULL EVK開發(fā)板對應(yīng)的Linux內(nèi)核,發(fā)現(xiàn)其可以在野火的EMMC版本開發(fā)板啟動。為了進一步了解Linux內(nèi)核,我們可以參考官方開發(fā)板的設(shè)置,在Linux內(nèi)核中添加自己的開發(fā)板。

5.1 添加開發(fā)板默認配置文件

arch/arm/configs目錄下的imx_v7_mfg_defconfig重新復(fù)制一份 , 命名為自己開發(fā)板,如imx_myboard_defconfig。

5.2 添加開發(fā)板對應(yīng)的設(shè)備樹文件

進入arch/arm/boot/dts目錄中,復(fù)制一份imx6ull-14x14-evk.dts,然后將其重命名為imx6ull-myboard.dts。

然后還需要修改文件arch/arm/boot/dts/Makefile,找到 dtb-$(CONFIG_SOC_IMX6ULL)配置項,在此配置項中加入“imx6ull-myboard.dtb” :

poYBAGIuADCAWtJ7AAGKQk_K8UM881.png

這樣編譯Linux的時候就可以從imx6ull-myboard.dts 編譯出 imx6ull-myboard.dtb 文件了。

總結(jié)一下以上的修改主要包括:

pYYBAGIuADWAb4aVAACdByBSXsw903.png

主要就是對文件復(fù)制一份并重命名,唯一修改的是Makefile文件。

5.3 添加新的編譯腳本

新建一個build_myboard.sh,寫入如下內(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目錄)后再次進行Linux啟動測試,可以到登錄提示,說明Linux內(nèi)核啟動成功。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18975

    瀏覽量

    302085
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208721
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    376

    瀏覽量

    28098
收藏 人收藏

    評論

    相關(guān)推薦

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)移植篇第六十九章uboot移植

    【北京迅為】i.mx8mm嵌入式linux開發(fā)指南第四篇 嵌入式Linux系統(tǒng)
    的頭像 發(fā)表于 10-22 14:46 ?456次閱讀
    【北京迅為】<b class='flag-5'>i.mx</b>8mm<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>開發(fā)</b>指南第四篇 <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>移植</b>篇第六十九章uboot<b class='flag-5'>移植</b>

    i.MX Linux開發(fā)實戰(zhàn)指南—基于野火i.MX系列開發(fā)

    電子發(fā)燒友網(wǎng)站提供《i.MX Linux開發(fā)實戰(zhàn)指南—基于野火i.MX系列開發(fā)板.pdf》資料免費下載
    發(fā)表于 10-10 17:23 ?7次下載

    使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電

    電子發(fā)燒友網(wǎng)站提供《使用TPS6521815 PMIC為NXP i.MX 6ULL、6UltraLite供電.pdf》資料免費下載
    發(fā)表于 09-13 09:44 ?1次下載
    使用TPS6521815 PMIC為NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>6ULL</b>、<b class='flag-5'>6</b>UltraLite供電

    嵌入式linux開發(fā)的基本步驟有哪些?

    嵌入式Linux開發(fā)是一個復(fù)雜的過程,涉及到硬件選擇、操作系統(tǒng)移植、驅(qū)動開發(fā)、應(yīng)用程序開發(fā)等多個
    的頭像 發(fā)表于 09-02 09:11 ?349次閱讀

    嵌入式linux開發(fā)板怎么操作

    嵌入式Linux開發(fā)板是一種基于Linux操作系統(tǒng)的嵌入式系統(tǒng)開發(fā)平臺。它通常包括一個處理器、內(nèi)
    的頭像 發(fā)表于 09-02 09:09 ?305次閱讀

    嵌入式linux開發(fā)板芯片的工作原理

    嵌入式Linux開發(fā)板是一種基于Linux操作系統(tǒng)的嵌入式系統(tǒng)開發(fā)平臺,它廣泛應(yīng)用于工業(yè)控制、智
    的頭像 發(fā)表于 09-02 09:07 ?302次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的按鍵功能

    本次源碼適配工作是在NXP i.MX6ULL EVK評估板的Linux內(nèi)核源碼(特定版本:Linux-imx_4.1.15)基礎(chǔ)上進行的。主要目標是調(diào)整功能接口引腳配置,以適應(yīng)ELF 1開發(fā)
    發(fā)表于 07-04 09:11

    Linux平臺移植音頻芯片實戰(zhàn)記錄

    本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
    的頭像 發(fā)表于 05-17 14:28 ?1013次閱讀
    <b class='flag-5'>Linux</b>平臺<b class='flag-5'>移植</b>音頻芯片實戰(zhàn)記錄

    淺析在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程

    本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
    的頭像 發(fā)表于 05-17 11:33 ?1139次閱讀
    淺析在NXP <b class='flag-5'>I.MX6ULL+Linux</b>平臺下進行WM8960音頻芯片<b class='flag-5'>移植</b>的過程

    正點原子i.MX93開發(fā)

    我計劃申請正點原子i.MX93開發(fā)板,因為我希望利用其強大的NXP i.MX9352處理器進行中高端嵌入式Linux
    發(fā)表于 05-16 14:57

    基于飛凌嵌入式i.MX6ULL核心板的電梯智能物聯(lián)網(wǎng)關(guān)方案

    使用飛凌嵌入式FETMX6ULL-S核心板作為智能電梯物聯(lián)網(wǎng)關(guān)的主控平臺,為智能電梯的變革提供了強有力的技術(shù)支持。
    的頭像 發(fā)表于 03-22 10:45 ?1372次閱讀
    基于飛凌<b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX6ULL</b>核心板的電梯智能物聯(lián)網(wǎng)關(guān)方案

    嵌入式軟件開發(fā)應(yīng)該掌握哪些知識?

    的控制,如GPIO、串口、SPI、I2C 等。這使得嵌入式軟件開發(fā)人員能夠充分利用硬件資源,滿足特定的需求。 1.2數(shù)據(jù)結(jié)構(gòu)與算法 嵌入式系統(tǒng)通常具有有限的內(nèi)存資源。通過使用合適的數(shù)據(jù)
    發(fā)表于 02-19 11:23

    如何在飛凌嵌入式T113-i開發(fā)板的Buildroot中移植MQTT協(xié)議?

    飛凌嵌入式OK113i-S開發(fā)板上市一段時間以來收獲了很多關(guān)注,也成為了許多客戶項目選型的優(yōu)質(zhì)之選。在實際的項目開發(fā)中,工程師朋友們可能會需要在文件系統(tǒng)中
    的頭像 發(fā)表于 01-26 08:02 ?460次閱讀
    如何在飛凌<b class='flag-5'>嵌入式</b>T113-<b class='flag-5'>i</b><b class='flag-5'>開發(fā)</b>板的Buildroot中<b class='flag-5'>移植</b>MQTT協(xié)議?

    嵌入式Linux開發(fā)的三種方式

    嵌入式Linux開發(fā)主要有三種方式:裸機開發(fā)、SDK開發(fā)和驅(qū)動開發(fā)
    的頭像 發(fā)表于 01-22 14:22 ?900次閱讀

    嵌入式Linux應(yīng)用程序開發(fā)詳解-第3

    電子發(fā)燒友網(wǎng)站提供《嵌入式Linux應(yīng)用程序開發(fā)詳解-第3章.pdf》資料免費下載
    發(fā)表于 11-16 11:19 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>應(yīng)用程序<b class='flag-5'>開發(fā)</b>詳解-第<b class='flag-5'>3</b>章