• 正文
    • Linux內(nèi)核裁剪步驟
    • xxxdeconfig、menuconfig、.config的關(guān)系
    • Uboot的修改裁剪及區(qū)別
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式Linux內(nèi)核和Uboot的裁剪方式和區(qū)別

2023/02/22
1854
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

此處只記錄大概的裁剪方式,不介紹具體的文件的修改。

Linux內(nèi)核裁剪步驟

1 在makefile中修改ARCH 和 CROSS_COMPILE 這兩個(gè)環(huán)境變量

ARCH ?= arm
CROSS_COMPILE ?= XXX(自己的交叉編譯器)

2 在arch/arm/configs文件夾下找到配置文件xxxdeconfig,并可適當(dāng)修改,在根目錄下運(yùn)行

make xxxdeconfig

3 在根目錄下運(yùn)行make menuconfig,如果在xxxdeconfig中新增了內(nèi)容,需要修改Kconfig來(lái)匹配xxxdeconfig。

4 在根目錄下運(yùn)行make

這樣就完成了對(duì)內(nèi)核的編譯。運(yùn)行xxxdeconfig和menuconfig的過(guò)程中的修改就是一種裁剪。

xxxdeconfig、menuconfig、.config的關(guān)系

之前提到了運(yùn)行xxxdeconfig、menuconfig。這倆啥關(guān)系呢。運(yùn)行xxxdeconfig會(huì)產(chǎn)生一個(gè).config文件,這里的.config文件最終會(huì)被變成頭文件并被其他的函數(shù)使用。部分內(nèi)容如下:

//舉個(gè)例子
CONFIG_CREATE_ARCH_SYMLINK=y
# CONFIG_ARC is not set
CONFIG_ARM=y
# CONFIG_M68K is not set
# CONFIG_MICROBLAZE is not set
# CONFIG_MIPS is not set
# CONFIG_NDS32 is not set
# CONFIG_NIOS2 is not set
# CONFIG_PPC is not set
# CONFIG_SANDBOX is not set
# CONFIG_SH is not set
# CONFIG_X86 is not set
# CONFIG_XTENSA is not set
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="armv7"
CONFIG_SYS_SOC="zynq"
。。。

相當(dāng)于通過(guò)宏文件進(jìn)行裁剪修改,可在此處添加或者刪減相關(guān)內(nèi)容。

menuconfig是對(duì).config這個(gè)文件的繼續(xù)補(bǔ)充,運(yùn)行make menuconfig會(huì)產(chǎn)生一個(gè)圖形畫界面,它會(huì)先讀取.config內(nèi)容并圖形化顯示出來(lái)。然后通過(guò)操作圖形化界面繼續(xù)修改.config文件作為補(bǔ)充。

如果在xxxdeconfig中新增加了內(nèi)容,為了使make menuconfig的圖形化界面可以顯示出來(lái),需要修改Kconfig文件來(lái)匹配,Kconfig文件相當(dāng)于menuconfig的后臺(tái)文件。

如果編譯運(yùn)行后看不到.config文件可能是這個(gè)文件被隱藏了。按ctrl+h會(huì)顯示隱藏文件,應(yīng)該就能看到了。

Uboot的修改裁剪及區(qū)別

uboot的裁剪和內(nèi)核基本沒什么大的區(qū)別,就是一般要多一步(修改一個(gè)板級(jí)頭文件)

1 在makefile中修改ARCH 和 CROSS_COMPILE 這兩個(gè)環(huán)境變量

ARCH ?= arm
CROSS_COMPILE ?= XXX(自己的交叉編譯器)

2 在arch/arm/configs文件夾下找到配置文件xxxdeconfig,并可適當(dāng)修改,在根目錄下運(yùn)行

make xxxdeconfig

3 在根目錄下運(yùn)行make menuconfig,如果在xxxdeconfig中新增了內(nèi)容,需要修改Kconfig來(lái)匹配xxxdeconfig。

4 修改板級(jí)頭文件 ?XXX.h

5 在根目錄下運(yùn)行make

這樣就完成了對(duì)內(nèi)核的編譯。運(yùn)行xxxdeconfig和menuconfig的過(guò)程中的修改就是一種裁剪。

為什么要多這一修改頭文件的步驟是因?yàn)槌绦驎?huì)引用這個(gè)頭文件,截取一段.config文件如下

...
CONFIG_SYS_VENDOR="xilinx"
CONFIG_SYS_BOARD="zynq"
CONFIG_SYS_CONFIG_NAME="zynq_zc70x"
...

這個(gè)zynq_zc70x.h就是要引用的頭文件(一般在include文件夾下)。打開這個(gè)文件

...
#include <configs/zynq-common.h>
...

繼續(xù)打開/zynq-common.h

#ifndef __CONFIG_ZYNQ_COMMON_H
#define __CONFIG_ZYNQ_COMMON_H

/* CPU clock */
#ifndef CONFIG_CPU_FREQ_HZ
# define CONFIG_CPU_FREQ_HZ 800000000
#endif

/* Cache options */
#define CONFIG_SYS_L2CACHE_OFF
#ifndef CONFIG_SYS_L2CACHE_OFF
# define CONFIG_SYS_L2_PL310
# define CONFIG_SYS_PL310_BASE 0xf8f02000
#endif

#define ZYNQ_SCUTIMER_BASEADDR 0xF8F00600
#define CONFIG_SYS_TIMERBASE ZYNQ_SCUTIMER_BASEADDR
#define CONFIG_SYS_TIMER_COUNTS_DOWN
#define CONFIG_SYS_TIMER_COUNTER (CONFIG_SYS_TIMERBASE + 0x4)

/* Serial drivers */
/* The following table includes the supported baudrates */
#define CONFIG_SYS_BAUDRATE_TABLE
{300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}

#define CONFIG_ARM_DCC

/* Ethernet driver */
#if defined(CONFIG_ZYNQ_GEM)
# define CONFIG_MII
# define CONFIG_SYS_FAULT_ECHO_LINK_DOWN
# define CONFIG_BOOTP_BOOTPATH
# define CONFIG_BOOTP_GATEWAY
# define CONFIG_BOOTP_HOSTNAME
...

可以看到包含了很多參數(shù),在這個(gè)文件中可以對(duì)相應(yīng)的參數(shù)進(jìn)行修改。

相關(guān)推薦