一蜀变、簡介
1.1 Linux內(nèi)核
Kernel 即是Linux內(nèi)核悄谐,Linux內(nèi)核采用宏內(nèi)核架構,即Linux大部分功能都會在內(nèi)核中實現(xiàn)库北,如進程管理爬舰、內(nèi)存管理、設備管理寒瓦、文件管理以及網(wǎng)絡管理等功能情屹,Linux在發(fā)展的過程中,引入了內(nèi)核模塊(Loadable Kernel Module杂腰,LKM)機制垃你,內(nèi)核模塊全稱為動態(tài)可加載內(nèi)核模塊,就是在內(nèi)核運行時可以動態(tài)加載一組目標代碼來實現(xiàn)某些特定的功能喂很,在這過程中不需要重新編譯內(nèi)核就可以實現(xiàn)動態(tài)擴展惜颇。
1.2 Linux內(nèi)核組成
Linux內(nèi)核主要由5部分組成,分別為:進程管理子系統(tǒng)
恤筛,內(nèi)存管理子系統(tǒng)
,文件子系統(tǒng)
芹橡,網(wǎng)絡子系統(tǒng)
毒坛,設備子系統(tǒng)
。
進程管理
負責進程的創(chuàng)建和銷毀,進程的調(diào)度煎殷。內(nèi)存管理
負責內(nèi)存的分配和回收屯伞,記錄哪些內(nèi)存被哪些進程使用,管理虛擬內(nèi)存豪直,將內(nèi)存的物理地址和邏輯地址做一個映射劣摇,主要由MMU進行轉(zhuǎn)換,頁表的方式弓乙。文件系統(tǒng)
這里的文件系統(tǒng)不僅僅只是硬盤的抽象管理末融,它也可以是某些io口的抽象;文件系統(tǒng)屏蔽了底層的細節(jié)暇韧,為上層提供統(tǒng)一的接口勾习;linux中一切皆文件。網(wǎng)絡功能
網(wǎng)絡功能值的是除了驅(qū)動程序提供的基本硬件操作外懈玻,還有系統(tǒng)提供的機制和功能巧婶,比如TCP協(xié)議,地址解析等涂乌。設備管理
設備管理功能主要由驅(qū)動程序提供艺栈,主要任務是控制設備完成輸入或輸出操作;linux把設備看作是特殊的文件湾盒,系統(tǒng)通過處理文件的接口(虛擬文件系統(tǒng)VFS)來管理和控制各種設備湿右。
二、安裝編譯工具和依賴
sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop vim libncurses5-dev
三历涝、獲取Linux內(nèi)核
【不推薦诅需,僅列出】
- 官方kernel下載:https://git.kernel.org
- NXP提供kernel下載:https://source.codeaurora.org/external/imx/linux-imx
【新手推薦使用以下開發(fā)板商提供kernel】
- 野火提供kernel下載:https://github.com/Embedfire/ebf_linux_kernel.git
- 韋東山提供kernel下載:https://e.coding.net/weidongshan/imx-linux4.9.88.git
四、Linux內(nèi)核工程結(jié)構
此處僅列出一些常見的目錄:
目錄/文件 | 說明 |
---|---|
arch | 硬件架構相關目錄 |
block | 塊設備相關目錄 |
crypto | 加密和散列算法相關目錄 |
Documentation | 內(nèi)核各部分的文檔描述 |
drivers | 設備驅(qū)動相關目錄 |
firmeare | 固件相關目錄 |
fs | 文件系統(tǒng)相關目錄 |
include | 編譯核心所需要的大部分頭文件相關目錄 |
init | 內(nèi)核初始化相關目錄 |
ipc | 進程間通信相關目錄 |
kernel | 內(nèi)核相關目錄 |
lib | 庫相關目錄 |
mm | 內(nèi)存管理相關目錄 |
net | 網(wǎng)絡協(xié)議棧相關目錄 |
samples | 例程相關目錄 |
scripts | 腳本相關目錄 |
security | 內(nèi)核安全相關目錄 |
sound | 音頻處理相關目錄 |
tools | 工具相關目錄 |
usr | 實現(xiàn)用于打包和壓縮的cpio等 |
五荧库、編譯野火提供Linux內(nèi)核
編譯 Kernel 有兩種方法:
- 一種是編譯較為通用的
zImage
堰塌,常用于構建成鏡像固件。 - 另一種則是編譯成
deb
安裝包分衫,將其下載到板子上安裝即可更新 Kernel场刑。
5.1 編譯內(nèi)核zImage
獲取野火提供Linux內(nèi)核源碼
git clone https://gitee.com/Embedfire/ebf_linux_kernel_6ull_depth1
進入工程目錄
cd ebf_linux_kernel_6ull_depth1
清除工程
清除上次生成的編譯環(huán)境,避免之前的環(huán)境干擾影響編譯結(jié)果
sudo make distclean
-
配置工程
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
- ARCH=arm:設置目標為 arm 架構
- CROSS_COMPILE:指定所使用的交叉編譯器
-
配置內(nèi)核選項
sudo make menuconfig KCONFIG_CONFIG=arch/arm/configs/npi_v7_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
這里我們不需要做任何的配置蚪战,直接按兩下ESC
鍵退出牵现。
-
編譯工程
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
- ARCH=arm:設置目標為 arm 架構
- CROSS_COMPILE:指定所使用的交叉編譯器
- -j8:允許8個編譯命令同時執(zhí)行,提高編譯速度
編譯過程中可能出現(xiàn)的錯誤:解決方法:Ubuntu 22.04編譯Linux內(nèi)核提示錯誤multiple definition of `yylloc‘
-
生成文件
-
zImage :編譯得到的 zImage 內(nèi)核在
arch/arm/boot
目錄下邀桑。 -
設備樹 :在
arch/arm/boot/dts
目錄下瞎疼,設備樹分為 emmc 版本 imx6ull-mmc-npi.dtb 以及 nand 版本 imx6ull-nand-npi.dtb 。
-
zImage :編譯得到的 zImage 內(nèi)核在
-
新建編譯腳本文件
每次編譯 kernel 都要輸入一長串命令壁畸,為了簡單起見贼急,我們可以新建一個 shell 腳本文件茅茂,將這些命令寫到 shell 腳本文件里面,然后每次只需要執(zhí)行 shell 腳本即可完成編譯工作太抓。新建名為 imx6ull_kernel.sh 的 shell 腳本文件:
vim imx6ull_kernel.sh
然后在里面輸入如下內(nèi)容:
#!/bin/bash sudo make distclean sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig sudo make menuconfig KCONFIG_CONFIG=arch/arm/configs/npi_v7_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- 第1行:shell 腳本要求的空闲,必須是 “#!/bin/bash” 或者 “#!/bin/sh”。
- 第2行:使用了 make 命令走敌,用于清理工程碴倾,也就是每次在編譯 uboot 之前都清理一下工程。帶有三個參數(shù)掉丽,第一個是 ARCH跌榔,也就是指定架構,這里肯定是 arm机打;第二個參數(shù) CROSS_COMPILE 用于指定編譯器矫户,只需要指明編譯器前綴就行了,比如 arm-linux-gnueabihf-gcc 編譯器的前綴就是 “arm-linux-gnueabihf-”残邀;最后一個參數(shù) distclean 就是清除工程皆辽。
- 第3-4行:也使用了 make 命令,用于配置 kernel芥挣。
- 第5行:用于編譯 kernel驱闷,通過第 3 行配置好 kernel 以后就可以直接 “make” 編譯 kernel 了
增加可執(zhí)行權限
chmod 777 imx6ull_kernel.sh
執(zhí)行腳本文件
./imx6ull_kernel.sh
5.2 編譯內(nèi)核deb安裝包
獲取野火提供U-Boot源碼
git clone https://gitee.com/Embedfire/ebf_linux_kernel_6ull_depth1
安裝必要軟件
sudo apt install build-essential
進入工程目錄
cd ebf_linux_kernel_6ull_depth1
-
運行野火提供的make_deb.sh腳本
sudo ./make_deb.sh
這種編譯方式編譯內(nèi)核,構建出來的 deb 安裝包可直接使用
sudo dpkg -i xxx.deb
命令安裝在魯班貓系統(tǒng)上空免,然后重啟使用cat /proc/version
查看內(nèi)核是否更新空另。編譯成功打印消息如下:
-
生成文件
構成生成的 deb 包在內(nèi)核源碼/build_image
目錄下。
? 由 Leung 寫于 2022 年 9 月 12 日
? 參考:10. Linux內(nèi)核的編譯