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上,測試成功后就會(huì)將其開放給該半導(dǎo)體廠商的 CPU開發(fā)者。 開發(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庫,另外,圖形化配置工具還需要ncurses庫支持,安裝命令為:
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腳本文件來編譯,腳本中的內(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)開始編譯Linux內(nèi)核,等待編譯完成,完成以后如下圖所示
編譯完成以后就會(huì)在arch/arm/boot這個(gè)目錄下生成一個(gè)zImage文件,該文件就是要用的Linux鏡像文件。 另外也會(huì)在arch/arm/boot/dts下生成很多.dtb文件,這些.dtb就是設(shè)備樹文件
vmlinux、Image、zImage、uImage 的區(qū)別:
- vmlinux是ELF格式的文件,是編譯出來的最原始的內(nèi)核文件,編譯出來 差不多有16MB,是未壓縮的。 在實(shí)際中我們不會(huì)使用vmlinux,而是使用zImage或uImage這樣的 Linux 內(nèi)核鏡像文件
- Image是Linux內(nèi)核鏡像文件,但是Image僅包含可執(zhí)行的二進(jìn)制數(shù)據(jù)。 Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符號表什么的。 但是 Image 是沒有壓縮過的,Image保存在arch/arm/boot目錄下,其大小大概在12MB
- zImage是經(jīng)過gzip壓縮后的Image,經(jīng)過壓縮以后其大小大概在6MB左右
- uImage是老版本uboot專用的鏡像文件,uImag是在zImage前面加了一個(gè)長度為 64字節(jié)的“頭” ,這個(gè)頭信息描述了該鏡像文件的類型、加載位置、生成時(shí)間、大小等信息。 但是新的uboot已經(jīng)支持了 zImage 啟動(dòng)! 所以已經(jīng)很少用到uImage了
3.Linux內(nèi)核源碼結(jié)構(gòu)
Linux內(nèi)核編譯過程會(huì)生成一些文件,下面來看一下編譯前后的內(nèi)核源碼結(jié)構(gòu),可以看出多出了一些編譯文件
編譯后的內(nèi)核源碼比未編譯的源碼多了許多文件,這些文件或文件夾的含義見下表:
上表中很多文件夾和文件可以不需要去關(guān)心,要關(guān)注的文件夾或文件如下示
arch目錄 :和架構(gòu)有關(guān)的目錄,比如arm、arm64、avr32、x86等等架構(gòu)。 每種架構(gòu)都對應(yīng)一個(gè)目錄,在這些目錄中又有很多子目錄,比如boot、common、configs等等
block目錄 :block是Linux下塊設(shè)備目錄,像SD卡、EMMC、NAND、硬盤等存儲(chǔ)設(shè)備就屬于塊設(shè)備,block目錄中存放著管理塊設(shè)備的相關(guān)文件
crypto目錄 :存放著加密文件,比如常見的crc、crc32、md4、md5、hash等加密算法
Documentation目錄 :存放著Linux相關(guān)的文檔,如果要想了解Linux某個(gè)功能模塊或驅(qū)動(dòng)架構(gòu)的功能,就可以在Documentation目錄中查找有沒有對應(yīng)的文檔
drivers目錄 :驅(qū)動(dòng)目錄文件,此目錄根據(jù)驅(qū)動(dòng)類型的不同,分門別類進(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是庫的意思,lib目錄都是一些公用的庫函
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)文件并沒有存放到 drivers目錄中,而是單獨(dú)的目錄
tools目錄 :存放一些編譯的時(shí)候使用到的工具
usr目錄 :存放與 initramfs 有關(guān)的代碼
virt目錄 :存放虛擬機(jī)相關(guān)文件
.config文件 :跟 uboot一樣,.config保存著 Linux最終的配置信息,編譯 時(shí)候會(huì)讀取此文件中的配置信息。 最終根據(jù)配置信息來選擇編譯 Linux 哪些模塊,哪些功能
Kbuild文件 :有些 Makefile會(huì)讀取此文件
Kconfig文件 :圖形化配置界面的配置文件
Makefile文件 :Linux 頂層 Makefile 文件,建議好好閱讀一下此文件
README文件 :此文件詳細(xì)講解了如何編譯 Linux 源碼,以及 Linux 源碼的目錄信息
-
NXP
+關(guān)注
關(guān)注
60文章
1264瀏覽量
182900 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1360瀏覽量
40185 -
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208717 -
源碼
+關(guān)注
關(guān)注
8文章
632瀏覽量
29110 -
編譯
+關(guān)注
關(guān)注
0文章
648瀏覽量
32774
發(fā)布評論請先 登錄
相關(guān)推薦
評論