IMX6ULL學習筆記(8)——獲取和編譯Linux內(nèi)核

一蜀变、簡介

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)核

【不推薦诅需,僅列出】

【新手推薦使用以下開發(fā)板商提供kernel】

四、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 。
  • 新建編譯腳本文件
    每次編譯 kernel 都要輸入一長串命令壁畸,為了簡單起見贼急,我們可以新建一個 shell 腳本文件茅茂,將這些命令寫到 shell 腳本文件里面,然后每次只需要執(zhí)行 shell 腳本即可完成編譯工作太抓。

    1. 新建名為 imx6ull_kernel.sh 的 shell 腳本文件:
      vim imx6ull_kernel.sh

    2. 然后在里面輸入如下內(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 了
    1. 增加可執(zhí)行權限
      chmod 777 imx6ull_kernel.sh

    2. 執(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)核的編譯

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹋砚,一起剝皮案震驚了整個濱河市扼菠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坝咐,老刑警劉巖循榆,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異墨坚,居然都是意外死亡秧饮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門泽篮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盗尸,“玉大人,你說我怎么就攤上這事帽撑∑酶鳎” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵亏拉,是天一觀的道長扣蜻。 經(jīng)常有香客問我寸癌,道長,這世上最難降的妖魔是什么弱贼? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮磷蛹,結(jié)果婚禮上吮旅,老公的妹妹穿的比我還像新娘。我一直安慰自己味咳,他們只是感情好庇勃,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槽驶,像睡著了一般责嚷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掂铐,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天罕拂,我揣著相機與錄音,去河邊找鬼全陨。 笑死爆班,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辱姨。 我是一名探鬼主播柿菩,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雨涛!你這毒婦竟也來了枢舶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤替久,失蹤者是張志新(化名)和其女友劉穎凉泄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侣肄,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡旧困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稼锅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼具。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矩距,靈堂內(nèi)的尸體忽然破棺而出拗盒,到底是詐尸還是另有隱情,我是刑警寧澤锥债,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布陡蝇,位于F島的核電站痊臭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏登夫。R本人自食惡果不足惜广匙,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恼策。 院中可真熱鬧鸦致,春花似錦、人聲如沸涣楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮斗。三九已至绽乔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碳褒,已是汗流浹背折砸。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沙峻,地道東北人鞍爱。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像专酗,于是被迫代替她去往敵國和親睹逃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容