linux 內(nèi)核裁剪與編譯

一、Linux 內(nèi)核源碼

www.kernel.org 下載官方內(nèi)內(nèi)核。

1.linux內(nèi)核目錄

$ tree kernel/ -L 1
kernel/
├── android
├── arch
├── backported-features
├── block
├── boot.img
├── build.config.cuttlefish.aarch64
├── build.config.cuttlefish.x86_64
├── certs
├── config.old
├── COPYING
├── CREDITS
├── crypto
├── Documentation
├── drivers
├── firmware
├── fs
├── include
├── init
├── ipc
├── Kbuild
├── Kconfig
├── kernel
├── kernel.img
├── lib
├── logo.bmp
├── MAINTAINERS
├── Makefile
├── mm
├── modules.builtin
├── modules.order
├── Module.symvers
├── net
├── README
├── REPORTING-BUGS
├── resource.img
├── samples
├── scripts
├── security
├── sound
├── System.map
├── tools
├── usr
├── verity_dev_keys.x509
├── virt
├── vmlinux
├── vmlinux.o
└── zboot.img

23 directories, 24 file

目錄說明

  • arch:包含和硬件體系結(jié)構(gòu)相關(guān)的代碼,每種平臺占一個相應(yīng)的目錄,如 i386、arm、arm64、powerpc、mips 等。Linux 內(nèi)核目前已經(jīng)支持30種左右的體系結(jié)構(gòu)。
    • 在 arch 目錄下,存放的是各個平臺以及各個平臺的芯片對 Linux 內(nèi)核進(jìn)程調(diào)度、內(nèi)存管理、中斷等的支持,以及每個具體的 SoC 和電路板的板級支持代碼。
  • block:塊設(shè)備驅(qū)動程序 I/O 調(diào)度。
  • crypto:常用加密和散列算法(如AES、SHA等),還有一些壓縮和 CRC 校驗算法。
  • documentation:內(nèi)核各部分的通用解釋和注釋。
  • drivers:設(shè)備驅(qū)動程序。每個不同的驅(qū)動占用一個子目錄,如 char、block、net、mtd、 i2c 等。
  • fs:所支持的各種文件系統(tǒng),如EXT、FAT、NTFS、JFFS2等。
  • include:內(nèi)核 API 級別頭文件,與系統(tǒng)相關(guān)的頭文件放置在 include/linux 子目錄下。
  • init:內(nèi)核初始化代碼。著名的 stait_kemel() 就位于 init/main.c 文件中。
  • ipc:進(jìn)程間通信的代碼。
  • kernel:內(nèi)核最核心的部分,包括進(jìn)程調(diào)度、定時器等,而和平臺相關(guān)的一部分代碼放在 arch/*/kemel 目錄下。
  • lib:庫文件代碼。
  • mm:內(nèi)存管理代碼,和平臺相關(guān)的一部分代碼放在arch/*/mm目錄下。
  • net:網(wǎng)絡(luò)相關(guān)代碼,實現(xiàn)各種常見的網(wǎng)絡(luò)協(xié)議。
  • scripts:用于配置內(nèi)核的腳本文件。
  • security:主要是一個 SELinux 的模塊。
  • sound:ALSA、OSS 音頻設(shè)備的驅(qū)動核心代碼和常用設(shè)備驅(qū)動。
  • usr:實現(xiàn)用于打包和壓縮的 cpio 等。

2.快速確定主板關(guān)聯(lián)代碼

板級基礎(chǔ)代碼

Linux 移植通常分為體系結(jié)構(gòu)級別移植、處理器級別移植和板級移植 。

  • 確定體系架構(gòu)相關(guān)的文件

    $ tree arch/arm64/ -L 1
    arch/arm64/
    ├── boot
    ├── configs
    ├── crypto
    ├── include
    ├── Kconfig
    ├── Kconfig.debug
    ├── Kconfig.platforms
    ├── kernel
    ├── kvm
    ├── lib
    ├── Makefile
    ├── mm
    ├── net
    └── xen
    
    • 確定內(nèi)核配置文件,決定編譯的內(nèi)核模塊和驅(qū)動。

      • 如:默認(rèn)內(nèi)核配置文件為<arch/arm64/configs/rockchip_linux_defconfig>

        # 部分內(nèi)容
        CONFIG_DEFAULT_HOSTNAME="localhost"
        CONFIG_SYSVIPC=y
        CONFIG_POSIX_MQUEUE=y
        CONFIG_FHANDLE=y
        CONFIG_NO_HZ=y
        CONFIG_HIGH_RES_TIMERS=y
        CONFIG_LOG_BUF_SHIFT=18
        CONFIG_CGROUPS=y
        CONFIG_CGROUP_FREEZER=y
        CONFIG_CGROUP_PIDS=y
        CONFIG_CGROUP_DEVICE=y
        CONFIG_CPUSETS=y
        CONFIG_CGROUP_CPUACCT=y
        CONFIG_MEMCG=y
        CONFIG_MEMCG_SWAP=y
        CONFIG_CGROUP_PERF=y
        CONFIG_CGROUP_SCHED=y
        CONFIG_CFS_BANDWIDTH=y
        CONFIG_RT_GROUP_SCHED=y
        CONFIG_BLK_CGROUP=y
        CONFIG_NAMESPACES=y
        CONFIG_USER_NS=y
        ...
        
    • 確定設(shè)備樹文件,決定板級外設(shè)配置

      • 如:<arch/arm64/boot/dts/rockchip/rk3399-firefly-aioc.dts>
  • 確定對應(yīng)的主板文件(32位板子)。

    • 如:<arch/arm/mach-omap2/board-am335xevm.c>
    • <arch/arm/mach-mxs/mach-mx28evk.c>

驅(qū)動代碼

? 驅(qū)動代碼在drivers 目錄

其它代碼

? 文件系統(tǒng)的實現(xiàn)代碼、網(wǎng)絡(luò)子系統(tǒng)的實現(xiàn)代碼等。

2.Linux 內(nèi)核中的 Makefile 文件

1)頂層 Makefile

源碼目錄樹頂層 Makefile 是整個內(nèi)核源碼管理的入口,對整個內(nèi)核的源碼編譯起著決定性作用。編譯內(nèi)核時,頂層 Makefile 會按規(guī)則遞歸歷遍內(nèi)核源碼的所有子目錄下的Makefile 文件,完成各子目錄下內(nèi)核模塊的編譯。

內(nèi)核版本號

頂層 Makefile,開頭的幾行記錄了內(nèi)核源碼的版本號 。

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION =3
#說明代碼版本為 2.6.35.3

內(nèi)核在目標(biāo)板運(yùn)行后,輸入 uname -a 命令可以得到印證 。

編譯控制
  • 體系結(jié)構(gòu)

    • Linux 是一個支持眾多體系結(jié)構(gòu)的操作系統(tǒng),在編譯過程中需指定體系結(jié)構(gòu),以與實際平臺對應(yīng)。在頂層 Makefile 中,通過變量 ARCH 來指定 。

    • ARCH ?= $(SUBARCH)
      #如果進(jìn)行 ARM 嵌入式 Linux 開發(fā),則必須指定 ARCH 為 arm(注意大小寫,須與 arch/目錄下的 arm 一致)
      #如:$make ARCH=arm
      
  • 編譯器

    • 進(jìn)行 ARM 嵌入式 Linux 開發(fā),必須指定交叉編譯器,可以在內(nèi)核配置通過 CONFIG_CROSS_COMPILE 指定交叉編譯器,也可以通過 CROSS_COMPILE 指定。

    $ make ARCH=arm CROSS_COMPILE= arm-linux-gnueabihf-

    
    ```makefile
    CROSS_COMPILE = arm-linux-gnueabihf-
    #注意: CROSS_COMPILE 指定的交叉編譯器必須事先安裝并正確設(shè)置系統(tǒng)環(huán)境變量; 如果沒有設(shè)置環(huán)境變量, 則需使用絕對地址
    

2)子目錄的 Makefile

幾乎每個子目錄都有相應(yīng)的 Makefile 文件,管理著對應(yīng)目錄下的代碼。

Makefile 中有兩種表示方式:

  • 一種是默認(rèn)選擇編譯,用 obj-y 表示

    • obj-y += usb-host.o # 默認(rèn)編譯 usb-host.c 文件
      obj-y += gpio/ # 默認(rèn)編譯 gpio 目錄
      
  • 另一種表示則與內(nèi)核配置選項相關(guān)聯(lián),編譯與否以及編譯方式取決于內(nèi)核配置 。

    • obj-$(CONFIG_WDT) += wdt.o # wdt.c 編譯控制
      obj-$(CONFIG_PCI) += pci/ # pci 目錄編譯控制
      

      是否編譯 wdt.c 文件,或者以何種方式編譯,取決于內(nèi)核配置后的變量 CONFIG_WDT值:如果在配置中設(shè)置為[*],則靜態(tài)編譯到內(nèi)核,如果配置為[M],則編譯為 wdt.ko 模塊,否則不編譯。

3.Linux 內(nèi)核中的 Kconfig 文件

? 內(nèi)核源碼樹每個目錄下都還包含一個 Kconfig 文件,用于描述所在目錄源代碼相關(guān)的內(nèi)核配置菜單,各個目錄的 Kconfig 文件構(gòu)成了一個分布式的內(nèi)核配置數(shù)據(jù)庫。

? 通過 make menuconfig(make xconfig 或者 make gconfig)命令配置內(nèi)核的時候,從 Kconfig 文件讀取單,配置完畢保存到文件名為.config 的內(nèi)核配置文件中,供 Makefile 文件在編譯內(nèi)核時使用。

1)Kconfig的格式

? Kconfig按照一定的格式來書寫,menuconfig程序可以識別這種格式,然后從中提取出有效信息組成menuconfig中的菜單項。

? 截取/drivers/net下的Kconfig文件中的部分內(nèi)容:

# Network device configuration
menuconfig NETDEVICES
        default y if UML
        depends on NET
        bool "Network device support"
        ---help---
          You can say N here if you don't intend to connect your Linux box to any other computer at all.
……
config DM9000
        tristate "DM9000 support"
        depends on ARM || BLACKFIN || MIPS
        select CRC32
        select MII
        ---help---
          Support for DM9000 chipset.

          To compile this driver as a module, choose M here.  The module will be called dm9000.
……
source "drivers/net/arcnet/Kconfig"
source "drivers/net/phy/Kconfig"
  • menuconfig:表示菜單(本身屬于一個菜單中的項目,但是又有子菜單項目)、config表示菜單中的一個配置項(本身并沒有子菜單下的項目)。一個menuconfig后面跟著的所有config項就是這個menuconfig的子菜單。這就是Kconfig中表示的目錄關(guān)系。
  • NETDEVICES:配置項名字,用大寫字母表示。這個字符串前面添加CONFIG_后就構(gòu)成了“.config”文件中的配置項名字。
  • source:內(nèi)核源碼目錄樹中每一個Kconfig都會用source引入其所有子目錄下的Kconfig,從而保證了所有的Kconfig項目都被包含進(jìn)menuconfig中。
    • 如果在linux內(nèi)核中添加了一個文件夾,一定要在這個文件夾下創(chuàng)建一個Kconfig文件,然后在這個文件夾的上一層目錄的Kconfig中source引入這個文件夾下的Kconfig文件。
  • tristate:意思是三態(tài)(3種狀態(tài),對應(yīng)Y、N、M三種選擇方式),意思就是這個配置項可以被三種選擇。
  • bool:是要么真要么假(對應(yīng)Y和N)。意思是這個配置項只能被2種選擇。
  • depends:意思是本配置項依賴于另一個配置項。如果那個依賴的配置項為Y或者M(jìn),則本配置項才有意義;如果依賴的哪個配置項本身被設(shè)置為N,則本配置項根本沒有意義。
  • select:表示depends on的值有效時,下面的select也會成立,將相應(yīng)的內(nèi)容選上。
  • default:表示depends on的值有效時,下面的default也會成立,將相應(yīng)的選項選上,有三種選項,分別對應(yīng)y,n,m。
  • help:幫助信息,解釋這個配置項的含義,以及如何去配置他。

2)Kconfig和.config文件和Makefile三者的關(guān)聯(lián)

  • 配置項被配置成Y、N、M會影響“.config”文件中的CONFIG_XXX變量的配置值。
  • .config”中的配置值(=y、=m、沒有)會影響最終的Makefile編譯鏈接過程,如makefile中:obj-$(CONFIG_DM9000) += dm9000.o
    • 如果=y則會被編入(built-in);
    • 如果=m會被單獨連接成一個”.ko”內(nèi)核模塊(需要insmod動態(tài)加載到內(nèi)核中);
    • 如果沒有則對應(yīng)的代碼不會被編譯。

4.Linux 內(nèi)核源碼配置執(zhí)行過程

關(guān)鍵文件

  • Kconfig ---> (每個源碼目錄下)提供選項
  • .config ---> (源碼頂層目錄下)保存選擇結(jié)果
  • Makefile---> (每個源碼目錄下)根據(jù).config中的內(nèi)容來告知編譯系統(tǒng)如何編譯

1)執(zhí)行步驟

  • 系統(tǒng)讀取arch/$ARCH/目錄下的Kconfig文件生成整個配置界面選項(Kconfig是整個linux配置機(jī)制的核心)。

    • 那么ARCH環(huán)境變量的值由linux內(nèi)核根目錄下的makefile文件決定的,在makefile有此環(huán)境變量的定義。
    • 或者通過 make ARCH=arm menuconfig命令來生成配置界面。
  • 修改內(nèi)核配置后,當(dāng)保存make menuconfig選項時,系統(tǒng)會將配置保存在內(nèi)核根目錄下.config文件。還會將所有的選項以宏的形式保存在Linux內(nèi)核根目錄下的 include/generated/autoconf.h文件下。

    • 內(nèi)核有默認(rèn)配置選項提供,存放在arch/$ARCH/configs下,可以將所需的配置復(fù)制到內(nèi)核根目錄下.config文件。
    $ cp arch/arm64/configs/rockchip_linux_defconfig .config
    
  • 執(zhí)行make編譯,會根據(jù).config文件所配置的選項(=y、=m、沒有)逐個進(jìn)行編譯。

    • 或者可以指定編譯配置文件

      # Kernel defconfig
      export RK_KERNEL_DEFCONFIG=rockchip_linux_defconfig
      # Kernel dts
      export RK_KERNEL_DTS=rk3399-firefly-aioc
      
      $ make ARCH=arm64 $RK_KERNEL_DEFCONFIG
      $ make ARCH=arm64 $RK_KERNEL_DTS.img
      

二、配置和編譯 Linux 內(nèi)核

1.快速配置內(nèi)核

進(jìn)入 Linux 內(nèi)核源碼數(shù)頂層目錄,輸入 make menuconfig 命令 。

注意: 主機(jī)須安裝 ncurses 相關(guān)庫才能正確運(yùn)行該命令并出現(xiàn)配置界面 。

如果沒有在 Makefile 中指定 ARCH,則須在命令行中指定

$ make ARCH=arm menuconfig

2.內(nèi)核配置詳情

菜單項 說明
General setup ---> 內(nèi)核通用配置選項,包括交叉編譯器前綴、本地版本、內(nèi)核壓縮模式、 config.gz 支持、內(nèi)核 log 緩沖區(qū)大小、 initramfs以及更多的內(nèi)核運(yùn)行特性支持等
[ ] Enable loadable module support ---> 內(nèi)核模塊加載支持,通常都需要
[ ] Enable the block layer ---> 使能塊設(shè)備。如果未選中使能,塊設(shè)備將不能使用, SCSI類字符設(shè)備和 USB 大容量類設(shè)備也將不能使用。
System Type ---> 系統(tǒng)類型,設(shè)置 ARM 處理器型號、處理器的特性以及默認(rèn)的評估板主板
Bus support ---> PCMCIA/CardBUS 總線支持,目前已經(jīng)很少使用
Kernel Features ---> 內(nèi)核特性,包括內(nèi)核空間分配、實時性配置等特性配置
Boot options ---> 內(nèi)核啟動選項,如果采用內(nèi)置啟動參數(shù),則在這里設(shè)置
CPU Power Management ---> CPU 電源管理,包括處理器頻率降頻、休眠模式支持等
Floating point emulation ---> 浮點模擬
Userspace binary formats ---> 用戶空間二進(jìn)制支持
Power management options ---> 電源管理選項
[ ] Networking support ---> 網(wǎng)絡(luò)協(xié)議支持,包括網(wǎng)絡(luò)選項、 CAN-Bus、紅外、無線、 NFC等。其中的網(wǎng)絡(luò)選項還有更多配置項,如 IPv4、 IPv6 等
Device Drivers ---> 設(shè)備驅(qū)動,包含多級下級菜單,包括驅(qū)動通用選項、 MTD設(shè)備、字符設(shè)備、網(wǎng)絡(luò)設(shè)備、輸入設(shè)備、 I2C 總線、 SPI 總線、 USB 總線、 GPIO、聲卡、顯卡等各種外設(shè)配置菜單
File systems ---> 文件系統(tǒng), 包含 Ext2、 Ext3、 Ext4、 JFFS、 NFS、 DOS 等各種文件系統(tǒng), 以及本地語言支持等
Kernel hacking ---> 內(nèi)核 Hacking,在內(nèi)核調(diào)試階段可酌情使能其中的選項,以獲得需要的調(diào)試信息
Security options ---> 安全選項
< > Cryptographic API ---> 加密接口,內(nèi)核提供的一些加密算法如 CRC32、MD5、SHA1、SHA224 等
OCF Configuration ---> 開放的加密框架
Library routines ---> 庫例程
Load an Alternate Configuration File 裝載一個配置文件
ave an Alternate Configuration File 保存為一個配置文件

1)通用設(shè)置 General setup

選項 說明
( ) Cross-compiler tool prefix 交叉編譯器前綴,將會設(shè)置 CONFIG_CROSS_COMPILE 變量, 等同于 make CROSS_COMPILE=prefix-
( ) Local version - append to kernel release 填寫本地版本
[ ] Automatically append version informationto the version string 自動增加版本信息。如果用了 Git 管理內(nèi)核源碼,每次 Git提交都會造成內(nèi)核版本號增加。謹(jǐn)慎使用該選項
< > Kernel .config support 選中該選項會將當(dāng)前內(nèi)核配置信息保存到內(nèi)核中
[ ] Enable access to .config through/proc/config.gz 通過/proc/config.gz 獲得當(dāng)前運(yùn)行內(nèi)核的配置信息。建議選中
[ ] Initial RAM filesystem and RAM disk(initramfs/initrd) support Initramfs 支持,使能該特性可以將一個文件系統(tǒng)打包到內(nèi)核文件中,內(nèi)核啟動不需要額外的文件系統(tǒng)
( ) Initramfs source file(s) Initramfs 文件系統(tǒng)的路徑,通常放在源碼樹 usr 目錄下

2)內(nèi)核特性 Kernel Features

選項 說明
[ ] Tickless System (Dynamic Ticks) 無時鐘系統(tǒng)支持,根據(jù)系統(tǒng)運(yùn)行狀況來啟用或者禁用時鐘,能讓內(nèi)核運(yùn)行更有效且更省電。 A8 這樣的處理器建議選中
[ ] High Resolution Timer Support 高精度定時器。處理器支持則可選中
Memory split (3G/1G user/kernel split)---> 4G 內(nèi)存分割比例,內(nèi)核和用戶空間: 3G/1G、 2G/2G、 1G/2G。早期內(nèi)核是 3G/1G 固定分割,目前可配置
Preemption Model (No Forced Preemption(Server)) ---> 內(nèi)核搶占模式,可選值:No Forced Preemption (Server)Voluntary Kernel Preemption (Desktop)Preemptible Kernel (Low-Latency Desktop)需要實時性則須設(shè)置為 Preemptible Kernel
[ ] Compile the kernel in Thumb-2 mode(EXPERIMENTAL) 以 Thumb-2 指令集編譯內(nèi)核。不推薦
[ ] High Memory Support 高端內(nèi)存,嵌入式系統(tǒng)通常不用選

3)啟動選項

默認(rèn)啟動參數(shù)通過“Default kernel command string”設(shè)置

(root=/dev/mmcblk0p2 rootwait console=ttyO0,115200) Default kernel command string

內(nèi)核參數(shù)類型通過 Kernel command line type 來設(shè)置

  • ( ) Use bootloader kernel arguments if available
    • 可接受bootloader傳遞的參數(shù)啟動
  • ( ) Extend bootloader kernel arguments
  • ( ) Always use the default kernel command string
    • 只能使用默認(rèn)內(nèi)核啟動參數(shù)

4)網(wǎng)絡(luò)支持

網(wǎng)絡(luò)支持部分,包括了以太網(wǎng)、 CAN、紅外、藍(lán)牙、無線等各種網(wǎng)絡(luò)的支持配置選項。

從 Networking support -> Networking options, 可進(jìn)入網(wǎng)絡(luò)選項配置界面 。

選項 說明
< > Packet socket 選中支持應(yīng)用直接與網(wǎng)卡通信而不需要在內(nèi)核中實現(xiàn)網(wǎng)絡(luò)協(xié)議,建議選中
< > Unix domain sockets UNIX domain Socket 支持,建議選中。如果采用 udev/mdev動態(tài)管理設(shè)備,則必須選中
< > PF_KEY sockets PF_KEY 協(xié)議族,內(nèi)核安全相關(guān),建議選中
[ ] TCP/IP networking TCP/IP 支持,使用網(wǎng)絡(luò)通常需選中,還有更多的下級菜單,如 IPv4、 IPv6 等設(shè)置
[ ] Network packet filtering framework(Netfilter) ---> 對網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行過濾,如果需要防火墻功能,則必須選中。有下級菜單,根據(jù)實際需要配置
< > 802.1d Ethernet Bridging 802.1d 以太網(wǎng)橋
< > 802.1Q VLAN Support 802.1Q 虛擬局域網(wǎng)
[ ] QoS and/or fair queueing ---> Qos 支持,該選項可支持多種不同的包調(diào)度算法,否則僅能使用簡單的 FIFO 算法

使用 Linux 的系統(tǒng)都會用到網(wǎng)絡(luò),而使用網(wǎng)絡(luò)又往往離不開 TCP/TP,故建議在配置中選中 TCP/IP 選項,并選中下級全部選項 。

5)設(shè)備驅(qū)動

選項 說明
Generic Driver Options ---> 通用設(shè)備驅(qū)動選項
CBUS support ---> CBUS 支持,不清楚則不要選
< > Connector - unified userspace <-> kernelspacelinker ---> 統(tǒng)一的用戶空間<-->內(nèi)核空間連接器,工作在 Netlinksocket 協(xié)議頂層,不確定則不選
< > Memory Technology Device (MTD) support---> 內(nèi)存技術(shù)設(shè)備,如 FLASH、 RAM 等支持。通常需要選中
Device Tree and Open Firmware support ---> /proc 設(shè)備樹支持,可選中
< > Parallel port support ---> 并口支持,嵌入式系統(tǒng)通常不選
[ ] Block devices ---> 塊設(shè)備,選中,否則不能操作任何塊設(shè)備
[ ] Misc devices ---> 雜項設(shè)備。通常選中,如需用 eeprom 設(shè)備,則必選
SCSI device support ---> SCSI 設(shè)備支持。如要用 U 盤,則必選
< > Serial ATA and Parallel ATA drivers ---> SATA 和 PATA 設(shè)備支持。除非硬件支持,否則不選
[ ] Multiple devices driver support (RAID and LVM)---> 多設(shè)備支持(RAID&LVM),嵌入式通常不選
< > Generic Target Core Mod (TCM) and ConfigFSInfrastructure ---> TCM 存儲引擎和 ConfigFS 控制
[ ] Network device support ---> 網(wǎng)絡(luò)設(shè)備支持,包括網(wǎng)卡、 PHY 驅(qū)動、 ppp 協(xié)議等選擇
[ ] ISDN support ---> ISDN 支持
< > Telephony support ---> 電話支持。在 Linux 下使用 Modem 撥號,無需使能該選項
Input device support ---> 輸入設(shè)備支持,包括鍵盤、鼠標(biāo)、觸摸屏、游戲桿等
Character devices ---> 字符設(shè)備,包括 tty 等設(shè)備。特別注意,串口驅(qū)動配置也在這里面
< > I2C support ---> I2C 支持。 I2C 協(xié)議和控制器配置
[ ] SPI support ---> SPI 支持。 SPI 協(xié)議和 SPI 控制器
PPS support ---> PPS 支持
PTP clock support ---> PTP 時鐘支持
[ ] GPIO Support ---> GPIO 支持
< > PWM Support ---> PWM 支持
< > Dallas's 1-wire support ---> Dallas 單總線支持
< > Power supply class support ---> 電源管理類支持
< > Hardware Monitoring support ---> 硬件監(jiān)測支持,各種傳感器
< > Generic Thermal sysfs driver ---> Thermal sysfs 接口支持
[ ] Watchdog Timer Support ---> 看門狗支持,包括硬件看門狗和軟件看門狗
Sonics Silicon Backplane ---> SSB 總線支持
Broadcom specific AMBA ---> 博通 AMBA 總線支持
Multifunction device drivers ---> 多功能設(shè)備驅(qū)動支持
[ ] Voltage and Current Regulator Support ---> 電壓和電流調(diào)節(jié)支持。如果有電源管理芯片,通常需要選中
< > Multimedia support ---> 多媒體支持。 V4L2 在這里面配置
Graphics support ---> 圖形支持。 Framebuffer、背光、 LCD、開機(jī) LOGO 等配置
< > Sound card support ---> 聲卡支持
[ ] HID Devices ---> HID 設(shè)備,使用 USB 鼠標(biāo)鍵盤等 HID 設(shè)備必須選中該選項
[ ] USB support ---> USB 支持
< > MMC/SD/SDIO card support ---> SD/MMC 設(shè)備支持
< > Sony MemoryStick card support(EXPERIMENTAL) ---> Sony 記憶棒支持
[ ] LED Support ---> LED 子系統(tǒng)和驅(qū)動
[ ] Accessibility support ---> 易用性支持,嵌入式通常不選
[*] Real Time Clock ---> 實時時鐘,包括處理器內(nèi)部時鐘和外擴(kuò)時鐘選擇
[ ] DMA Engine support ---> 引擎支持
[ ] Auxiliary Display support ---> 輔助顯示支持
< > Userspace I/O drivers ---> 用戶空間 I/O 驅(qū)動(uio 支持)
Virtio drivers ---> Virtio 驅(qū)動
[*] Staging drivers ---> 分階段驅(qū)動
Hardware Spinlock drivers ---> 硬件 Spinlock 驅(qū)動
[ ] IOMMU Hardware Support ---> IOMMU 硬件支持,根據(jù)具體硬件選擇
[ ] Virtualization drivers ---> 虛擬化驅(qū)動
[ ] Generic Dynamic Voltage and Frequency Scaling(DVFS) support ---> 通用的動態(tài)電壓和頻率調(diào)節(jié)

6)文件系統(tǒng) File systems

選項 說明
< > Second extended fs support Ext2 文件系統(tǒng)支持,建議選中或模塊編譯
< > Ext3 journalling file system support Ext3 文件系統(tǒng)支持,建議選中或模塊編譯
< > The Extended 4 (ext4) filesystem Ext4 文件系統(tǒng)支持,建議選中或模塊編譯
< > Reiserfs support Reiserfs 是一種先進(jìn)的文件系統(tǒng),不過嵌入式中不常用
< > JFS filesystem support IBM 開發(fā)的日志文件系統(tǒng),嵌入式中不常用
< > XFS filesystem support XFS 文件系統(tǒng)支持
< > GFS2 file system support GFS2 文件系統(tǒng)支持
< > Btrfs filesystem (EXPERIMENTAL)Unstable disk format BtrFS 文件系統(tǒng)支持。 BtrFS 是一種新型文件系統(tǒng),被稱為下一代 Linux 文件系統(tǒng)
< > NILFS2 file system support(EXPERIMENTAL) NiLFS2 文件系統(tǒng)支持
[ ] Dnotify support 文件系統(tǒng)通知系統(tǒng),建議選中
[ ] Inotify support for userspace 用戶空間 Inotify 支持,建議選中
[ ] Filesystem wide access notification Fanotify 支持,能比 Inotify 傳遞更多信息
[ ] Quota support 磁盤配額支持。選中后可限制某個用戶或者某組用戶的磁盤占用空間。嵌入式中不常用
< > Kernel automounter version 4support (also supports v3) 第 4 版內(nèi)核自動加載遠(yuǎn)程文件系統(tǒng)支持(同時支持第 3 版)
< > FUSE (Filesystem in Userspace) support 選中后則允許在用戶空間實現(xiàn)一個文件系統(tǒng)
Caches ---> 文件系統(tǒng) Cache 支持
CD-ROM/DVD Filesystems ---> CD-ROM 和 DVD 支持,有 ISO 9660 和 UDF 兩個選項。如果需要支持 CD/DVD,則可選
DOS/FAT/NT Filesystems ---> DOS/FAT/NTFS 文件系統(tǒng)支持。如果需要支持 U 盤,必須選中 MDOS 和 VFAT 支持
Pseudo filesystems ---> 偽文件系統(tǒng),基于內(nèi)存的文件系統(tǒng),如 tmpfs
[ ] Miscellaneous filesystems ---> 其它雜項文件系統(tǒng),很多文件系統(tǒng)都?xì)w類在這里,嵌入式中常用的 cramfs、 ubifs 等都在這里配置
[ ] Network File Systems ---> 網(wǎng)絡(luò)文件系統(tǒng)。建議選中,通過 NFS 能方便調(diào)試,對于嵌入 式系統(tǒng), NFS Server 通常不選
Partition Types ---> 分區(qū)支持
< > Native language support ---> 本地語言支持,通常選中 iso-8859-1、 CP437、 CP437 和 utf-8等

3.編譯內(nèi)核

1)從內(nèi)核碼源編譯成zImage

內(nèi)核配置完成,輸入 make 命令即可開始編譯內(nèi)核。如果沒有修改 Makefile 文件并指定
ARCH 和 CROSS_COMPILE 參數(shù),則須在命令行中指定 。

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

目前大多數(shù)主機(jī)都是多核處理器,為了加快編譯進(jìn)度,可以開啟多線程編譯,在 make
的時候加上“-jN”即可, N 的值為處理器核心數(shù)目的 2 倍。

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j8

如果編譯不出錯,編譯完成,會生成 vmlinux、 Image、 zImage 等文件

文件 說明 備注
vmlinux 未經(jīng)壓縮、帶調(diào)試信息和符號表的內(nèi)核文件, elf 格式 頂層目錄下
arch/arm/boot/compressed/vmlinux 經(jīng)過壓縮的 Image,并加入了解壓頭的 elf 格式文件
arch/arm/boot/Image 將 vmlinux 去除調(diào)試信息、注釋和符號表等,只包含內(nèi)核代碼和數(shù)據(jù)后得到的非 elf 格式文件
arch/arm/boot/zImage 經(jīng)過 objcopy 處理,能直接下載到內(nèi)存中執(zhí)行的內(nèi)核映像文件
  • zImage

zImage 是通常情況下默認(rèn)的壓縮內(nèi)核,可以直接加載到內(nèi)存地址并開始執(zhí)行。

  • uImage

對于 ARM Linux 系統(tǒng),大多數(shù)采用 U-Boot 引導(dǎo),很少直接使用 zImage 映像,實際上
更多的是 uImage。

uImage 是 U-Boot 默認(rèn)采用的內(nèi)核映像文件,它是在 zImage 內(nèi)核映像之
前加上了一個長度為 64 字節(jié)信息頭的映像。這 64 字節(jié)信息頭包括映像文件的類型、加載位置、生成時間、大小等信息 。

在 U-Boot 下,通過 bootm 命令可以引導(dǎo) uImage 映像文件啟動。

$ tftp C0008000 uImage
$ bootm C0008000

2)把zImage轉(zhuǎn)為uImage

  • mkimage 工具

從 zImage 生成 uImage 需要用到 mkimage 工具。該工具可在編譯 U-Boot 源碼后從 tools目錄下獲得,復(fù)制到系統(tǒng)/usr/bin 目錄即可 。

對于 Ubuntu 系統(tǒng),還可用 sudo apt-get installu-boot-tools 命令安裝得到。

進(jìn)入 mkimage 文件所在目錄執(zhí)行該文件,或者在安裝 mkimage工具后,使用 mkimage 工具根據(jù) zImage 制作 uImage 映像文件的命令如下:

$ mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
#命令參數(shù)中需要指定體系結(jié)構(gòu)、操作系統(tǒng)類型、壓縮方式和入口地址等信息
參數(shù) 說明
-A arch 指定處理器的體系結(jié)構(gòu)為 arch,可能值有: alpha、 arm、 x86、 ia64、 mips、 mips64、 ppc、s390、 sh、 sparc、 sparc64、 m68k 等
-O os 指定操作系統(tǒng)類型為 os,可用值有: openbsd、 netbsd、 freebsd、 4_4bsd、 linux、 svr4、 esix、solaris、 irix、 sco、 dell、 ncr、 lynxos、 vxworks、 psos、 qnx、 u-boot、 rtems、 artos 等
-T type 指定映象類型為 type,可能值有: standalone、 kernel、 ramdisk、 multi、 firmware、 script、filesystem 等
-C comp 指定映象壓縮方式為 comp,可能值有:none 不壓縮(推薦, zImage 已經(jīng)過 bzip2 壓縮,通常無需再壓縮)gzip 用 gzip 的壓縮方式bzip2 用 bzip2 的壓縮方式
-a addr 指定映象在內(nèi)存中的加載地址為 addr(16 進(jìn)制)。制作好的映象下載到內(nèi)存時, 須按照該參數(shù)所指定的地址值來下載。 U-Boot 的 bootm xxx 命令會判斷 xxx 是否與 addr 相同:(1)如果不同,則從 xxx 這個地址開始提取出這個 64 字節(jié)的頭部,對其進(jìn)行分析,然后把去掉頭部的內(nèi)核復(fù)制到 addr 地址中去運(yùn)行。(2)如果相同,則不作處理, 僅將-e 指定的入口地址推后 64 字節(jié), 即跳過這 64 字節(jié)的頭部信息。
-e ep 指定映象運(yùn)行的入口地址為 ep(16 進(jìn)制)。 ep 的值為 addr+0x40,也可設(shè)置為和 addr 相同
-n name 指定映象文件名為 name
-d data_file 指定制作映象的源文件,通常是 zImage
image 輸出的 uImage 映像文件名稱,通常設(shè)置為 uImage

對于 EPC-28x 處理器,內(nèi)存起始地址為 0x40000000,從 zImage 生成 uImage 映像文件
的命令實際操作范例:

$ mkimage -A arm -O linux -T kernel -C none -a 0x40008000 -e 0x40008000 -n 'Linux-2.6.35' -d arch/arm/boot/zImage arch/arm/boot/uImage

內(nèi)存地址與處理器相關(guān),在不同處理器上可能有差異 .

查看一個 uImage 映像文件的文件頭信息

$ mkimage -l uImage
Image Name: Linux-2.6.35.3-571-gcca29a0-g191
Created: Tue Nov 17 11:57:47 2015
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2572336 Bytes = 2512.05 kB = 2.45 MB
Load Address: 40008000
Entry Point: 40008000

3)從內(nèi)核源碼直接生成 uImage

在<arch/arm/boot/Makefile>文件中給出了 uImage 的生成規(guī)則:

quiet_cmd_uimage = UIMAGE $@
    cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
                -C none -a $(LOADADDR) -e $(STARTADDR) \
                -n 'Linux-$(KERNELRELEASE)' -d $< $@

生成 uImage 的編譯命令為 make uImage

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j8 uImage

4)編譯內(nèi)核模塊

如果內(nèi)核中有配置為<M>的模塊或者驅(qū)動,需要在編譯內(nèi)核后再通過 make modules 命
令編譯這些模塊或者驅(qū)動

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules

編譯得到的內(nèi)核模塊文件以“.ko”結(jié)尾,這些可以通過 insmod 命令插入到運(yùn)行的內(nèi)核中。

$ insmod kernel/drivers/net/bonding/bonding.ko

有的模塊則可能編譯后得到多個“.ko”文件,或者依賴于其它模塊文件,且各文件插入還有順序要求, 需要通過 make modules_install 命令安裝模塊 ,可將編譯得到的全部模塊安裝到某一目錄下,并且還會生成模塊的依賴關(guān)系文件。

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- INSTALL_MOD_PATH=/home/chenxibing/work/rootfs modules_install

安裝后將在安裝目錄下生成“l(fā)ib/modules/內(nèi)核版本/”目錄,將“l(fā)ib/modules/內(nèi)核版本/”復(fù)制到目標(biāo)系統(tǒng)后根目錄后,就可以用 modprobe 命令進(jìn)行模塊安裝

#模塊依賴關(guān)系
kernel/drivers/net/bonding/bonding.ko: 
kernel/drivers/usb/serial/usbserial.ko: 
kernel/drivers/usb/serial/ftdi_sio.ko:kernel/drivers/usb/serial/usbserial.ko 
# modprobe ftdi_sio

4.運(yùn)行內(nèi)核

得到 uImage 映像文件后,將 uImage 加載到內(nèi)存地址 ep-0x40 處(0x40007fc0),通過 bootm 命令即可運(yùn)行內(nèi)核:

# tftp 40007fc0 uImage
# bootm 40007fc0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容