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

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

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

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

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-19 11:20 ? 次閱讀

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 源碼的目錄信息

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

    評論

    相關(guān)推薦

    一文詳解Linux內(nèi)核源碼組織結(jié)構(gòu)

    概要:本文內(nèi)容包含Linux源碼結(jié)構(gòu)分析、Linux Makefile分析、Kconfig文件分析、Linux
    的頭像 發(fā)表于 05-10 19:28 ?5704次閱讀

    linux內(nèi)核源碼編譯

    Linux是一種開源的操作系統(tǒng)內(nèi)核。它是一個(gè)用C語言寫成,符合POSIX標(biāo)準(zhǔn)的類Unix操作系統(tǒng)。Linux最早是由芬蘭大學(xué)生Linus Torvalds于1991年開發(fā)的一款全新的操作系統(tǒng)。那時(shí)
    發(fā)表于 06-27 15:37 ?768次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>編譯</b>

    Linux內(nèi)核編譯主要過程

    Linux內(nèi)核編譯主要過程: 配置、編譯、安裝 。
    發(fā)表于 08-08 16:02 ?701次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的<b class='flag-5'>編譯</b>主要過程

    淺談Linux內(nèi)核源碼的Makefile、Kconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,
    發(fā)表于 10-17 16:19 ?3664次閱讀
    淺談<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>的Makefile、Kconfig和.config文件

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

    Linux體系結(jié)構(gòu)Linux內(nèi)核結(jié)構(gòu)Linux內(nèi)核
    發(fā)表于 12-30 07:22

    linux 5.4.31為例來介紹一下linux內(nèi)核目錄結(jié)構(gòu)

    Linux內(nèi)核目錄結(jié)構(gòu)Linux內(nèi)核源代碼非常龐大,隨著版本的發(fā)展不斷增加。它使用目錄樹結(jié)構(gòu),并
    發(fā)表于 02-16 07:30

    Linux內(nèi)核編譯詳談

    Linux內(nèi)核編譯詳談
    發(fā)表于 10-30 09:51 ?7次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>編譯</b>詳談

    基于Arm的Linux內(nèi)核編譯指導(dǎo)

    基于Arm的Linux內(nèi)核編譯指導(dǎo)
    發(fā)表于 10-30 10:13 ?15次下載
    基于Arm的<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>編譯</b>指導(dǎo)

    如何才能編譯Linux內(nèi)核

    內(nèi)核的bug ,并增加了許多新的特性。如果用戶想要使用這些新特性, 或想根據(jù)自己的系統(tǒng)度身定制一個(gè)更高效, 更穩(wěn)定的內(nèi)核, 就需要重新編譯內(nèi)核。本文將以RedHat
    發(fā)表于 11-04 18:04 ?8次下載

    Linux內(nèi)核編譯與運(yùn)行

    本文檔的主要內(nèi)容詳細(xì)介紹的是Linux內(nèi)核編譯與運(yùn)行免費(fèi)下載。
    發(fā)表于 03-25 13:48 ?11次下載

    嵌入式Linux內(nèi)核編譯

    編譯工具鏈,在此就不再贅述。編寫Linux內(nèi)核需要內(nèi)核源碼內(nèi)核
    發(fā)表于 11-01 17:07 ?16次下載
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)核</b><b class='flag-5'>編譯</b>

    STM32MP157 Linux系統(tǒng)移植開發(fā)篇8:Linux內(nèi)核配置方法及編譯

    Linux內(nèi)核配置及編譯解壓內(nèi)核建立源碼目錄該目錄下以patch結(jié)尾的文件為ST官方提供的補(bǔ)丁文件,li
    發(fā)表于 12-04 21:06 ?9次下載
    STM32MP157 <b class='flag-5'>Linux</b>系統(tǒng)移植開發(fā)篇8:<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>配置方法及<b class='flag-5'>編譯</b>

    STM32MP157 Linux系統(tǒng)移植開發(fā)篇7:Linux內(nèi)核目錄結(jié)構(gòu)詳解

    Linux內(nèi)核目錄結(jié)構(gòu)Linux內(nèi)核源代碼非常龐大,隨著版本的發(fā)展不斷增加。它使用目錄樹結(jié)構(gòu),并
    發(fā)表于 12-17 18:29 ?10次下載
    STM32MP157 <b class='flag-5'>Linux</b>系統(tǒng)移植開發(fā)篇7:<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>目錄<b class='flag-5'>結(jié)構(gòu)</b>詳解

    Linux內(nèi)核編譯和運(yùn)行

    想讓Linux內(nèi)核代碼跑起來,得先搭建編譯和運(yùn)行代碼的環(huán)境。
    發(fā)表于 06-23 11:56 ?1255次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的<b class='flag-5'>編譯</b>和運(yùn)行

    Linux內(nèi)核編譯腳本

    獲得編譯命令及選項(xiàng) 編譯linux時(shí),默認(rèn)不會(huì)顯示編譯的命令,如果你要獲得編譯命令及其選項(xiàng),可以在make命令后面加上宏定義: make V
    的頭像 發(fā)表于 09-27 11:52 ?599次閱讀