1.Linux內(nèi)核獲取
Linux由 Linux基金會(huì)管理與發(fā)布,Linux官網(wǎng)為 https://www.kernel.org ,所以若想獲取最新的 Linux版本就可以在這個(gè)網(wǎng)站上下載,網(wǎng)站界面如下圖所示:

一般半導(dǎo)體廠商會(huì)從 Linux內(nèi)核官網(wǎng)下載某個(gè)版本,將其移植到自己的 CPU上,測(cè)試成功后就會(huì)將其開(kāi)放給該半導(dǎo)體廠商的 CPU開(kāi)發(fā)者。 開(kāi)發(fā)者下載其提供的 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 -j16
給予該腳本可執(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專(zhuān)用的鏡像文件,uImag是在zImage前面加了一個(gè)長(zhǎng)度為 64字節(jié)的“頭” ,這個(gè)頭信息描述了該鏡像文件的類(lèi)型、加載位置、生成時(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),可以看出多出了一些編譯文件

編譯后的內(nèi)核源碼比未編譯的源碼多了許多文件,這些文件或文件夾的含義見(jiàn)下表:

上表中很多文件夾和文件可以不需要去關(guān)心,要關(guān)注的文件夾或文件如下示
arch目錄 :和架構(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目錄 :存放著加密文件,比如常見(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)類(lèi)型的不同,分門(mén)別類(lèi)進(jìn)行整理,比如drivers/i2c就是I2C相關(guān)驅(qū)動(dòng)目錄,drivers/gpio就是GPIO相關(guān)的驅(qū)動(dòng)目錄,需要重點(diǎn)關(guān)注
firmware目錄 :此目錄用于存放固件
fs目錄 :存放文件系統(tǒng),比如fs/ext2、fs/ext4、fs/f2fs等,分別是ext2、ext4 和 f2fs等文件系統(tǒng)
include目錄 :頭文件目錄
init目錄 :存放 Linux內(nèi)核啟動(dòng)的時(shí)候初始化代碼
ipc目錄 :IPC為進(jìn)程間通信,ipc目錄是進(jìn)程間通信的具體實(shí)現(xiàn)代碼
kernel目錄 :Linux 內(nèi)核代碼
lib目錄 :lib是庫(kù)的意思,lib目錄都是一些公用的庫(kù)函
mm目錄 :存放內(nèi)存管理相關(guān)代碼
net目錄 :存放網(wǎng)絡(luò)相關(guān)代碼
samples目錄 :存放一些示例代碼文件
scripts目錄 :腳本目錄,Linux 編譯的時(shí)候會(huì)用到很多腳本文件,這些腳本文件就保存在此目錄中
security目錄 :存放安全相關(guān)的文件
sound目錄 :存放音頻相關(guān)驅(qū)動(dòng)文件,音頻驅(qū)動(dòng)文件并沒(méi)有存放到 drivers目錄中,而是單獨(dú)的目錄
tools目錄 :存放一些編譯的時(shí)候使用到的工具
usr目錄 :存放與 initramfs 有關(guān)的代碼
virt目錄 :存放虛擬機(jī)相關(guān)文件
.config文件 :跟 uboot一樣,.config保存著 Linux最終的配置信息,編譯 時(shí)候會(huì)讀取此文件中的配置信息。 最終根據(jù)配置信息來(lái)選擇編譯 Linux 哪些模塊,哪些功能
Kbuild文件 :有些 Makefile會(huì)讀取此文件
Kconfig文件 :圖形化配置界面的配置文件
Makefile文件 :Linux 頂層 Makefile 文件,建議好好閱讀一下此文件
README文件 :此文件詳細(xì)講解了如何編譯 Linux 源碼,以及 Linux 源碼的目錄信息
-
NXP
+關(guān)注
關(guān)注
61文章
1375瀏覽量
194444 -
內(nèi)核
+關(guān)注
關(guān)注
4文章
1436瀏覽量
42470 -
Linux
+關(guān)注
關(guān)注
88文章
11622瀏覽量
217830 -
源碼
+關(guān)注
關(guān)注
8文章
682瀏覽量
31065 -
編譯
+關(guān)注
關(guān)注
0文章
686瀏覽量
34934
發(fā)布評(píng)論請(qǐng)先 登錄
一文詳解Linux內(nèi)核源碼組織結(jié)構(gòu)
linux內(nèi)核源碼編譯
淺談Linux內(nèi)核源碼的Makefile、Kconfig和.config文件
Linux內(nèi)核源碼目錄結(jié)構(gòu)
以linux 5.4.31為例來(lái)介紹一下linux內(nèi)核目錄結(jié)構(gòu)
如何才能編譯Linux的內(nèi)核
Linux內(nèi)核的編譯與運(yùn)行
STM32MP157 Linux系統(tǒng)移植開(kāi)發(fā)篇8:Linux內(nèi)核配置方法及編譯
STM32MP157 Linux系統(tǒng)移植開(kāi)發(fā)篇7:Linux內(nèi)核目錄結(jié)構(gòu)詳解
Linux內(nèi)核的編譯和運(yùn)行

Linux內(nèi)核初次編譯和源碼結(jié)構(gòu)
評(píng)論