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 校驗(yàn)算法。
  • 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)度阶牍、定時(shí)器等喷面,而和平臺相關(guān)的一部分代碼放在 arch/*/kemel 目錄下。
  • lib:庫文件代碼走孽。
  • mm:內(nèi)存管理代碼惧辈,和平臺相關(guān)的一部分代碼放在arch/*/mm目錄下。
  • net:網(wǎng)絡(luò)相關(guān)代碼磕瓷,實(shí)現(xiàn)各種常見的網(wǎng)絡(luò)協(xié)議盒齿。
  • scripts:用于配置內(nèi)核的腳本文件。
  • security:主要是一個 SELinux 的模塊困食。
  • sound:ALSA边翁、OSS 音頻設(shè)備的驅(qū)動核心代碼和常用設(shè)備驅(qū)動。
  • usr:實(shí)現(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)的實(shí)現(xiàn)代碼焰坪、網(wǎng)絡(luò)子系統(tǒng)的實(shí)現(xiàn)代碼等。

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

1)頂層 Makefile

源碼目錄樹頂層 Makefile 是整個內(nèi)核源碼管理的入口南吮,對整個內(nèi)核的源碼編譯起著決定性作用琳彩。編譯內(nèi)核時(shí)誊酌,頂層 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)劳较,以與實(shí)際平臺對應(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)核配置選項(xiàng)相關(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)核的時(shí)候梯找,從 Kconfig 文件讀取單,配置完畢保存到文件名為.config 的內(nèi)核配置文件中益涧,供 Makefile 文件在編譯內(nèi)核時(shí)使用锈锤。

1)Kconfig的格式

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

? 截取/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:表示菜單(本身屬于一個菜單中的項(xiàng)目浅辙,但是又有子菜單項(xiàng)目)、config表示菜單中的一個配置項(xiàng)(本身并沒有子菜單下的項(xiàng)目)阎姥。一個menuconfig后面跟著的所有config項(xiàng)就是這個menuconfig的子菜單记舆。這就是Kconfig中表示的目錄關(guān)系。
  • NETDEVICES:配置項(xiàng)名字呼巴,用大寫字母表示泽腮。這個字符串前面添加CONFIG_后就構(gòu)成了“.config”文件中的配置項(xiàng)名字。
  • source:內(nèi)核源碼目錄樹中每一個Kconfig都會用source引入其所有子目錄下的Kconfig衣赶,從而保證了所有的Kconfig項(xiàng)目都被包含進(jìn)menuconfig中诊赊。
    • 如果在linux內(nèi)核中添加了一個文件夾,一定要在這個文件夾下創(chuàng)建一個Kconfig文件府瞄,然后在這個文件夾的上一層目錄的Kconfig中source引入這個文件夾下的Kconfig文件豪筝。
  • tristate:意思是三態(tài)(3種狀態(tài),對應(yīng)Y摘能、N续崖、M三種選擇方式),意思就是這個配置項(xiàng)可以被三種選擇团搞。
  • bool:是要么真要么假(對應(yīng)Y和N)严望。意思是這個配置項(xiàng)只能被2種選擇。
  • depends:意思是本配置項(xiàng)依賴于另一個配置項(xiàng)逻恐。如果那個依賴的配置項(xiàng)為Y或者M(jìn)像吻,則本配置項(xiàng)才有意義;如果依賴的哪個配置項(xiàng)本身被設(shè)置為N复隆,則本配置項(xiàng)根本沒有意義拨匆。
  • select:表示depends on的值有效時(shí),下面的select也會成立挽拂,將相應(yīng)的內(nèi)容選上惭每。
  • default:表示depends on的值有效時(shí),下面的default也會成立亏栈,將相應(yīng)的選項(xiàng)選上台腥,有三種選項(xiàng),分別對應(yīng)y绒北,n黎侈,m。
  • help:幫助信息闷游,解釋這個配置項(xiàng)的含義峻汉,以及如何去配置他贴汪。

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

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

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

關(guān)鍵文件

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

1)執(zhí)行步驟

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

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

    • 內(nèi)核有默認(rèn)配置選項(xiàng)提供,存放在arch/$ARCH/configs下拍屑,可以將所需的配置復(fù)制到內(nèi)核根目錄下.config文件途戒。
    $ cp arch/arm64/configs/rockchip_linux_defconfig .config
    
  • 執(zhí)行make編譯,會根據(jù).config文件所配置的選項(xiàng)(=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)核配置詳情

菜單項(xiàng) 說明
General setup ---> 內(nèi)核通用配置選項(xiàng),包括交叉編譯器前綴诺核、本地版本崔泵、內(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)核空間分配肮帐、實(shí)時(shí)性配置等特性配置
Boot options ---> 內(nèi)核啟動選項(xiàng),如果采用內(nèi)置啟動參數(shù)边器,則在這里設(shè)置
CPU Power Management ---> CPU 電源管理训枢,包括處理器頻率降頻、休眠模式支持等
Floating point emulation ---> 浮點(diǎn)模擬
Userspace binary formats ---> 用戶空間二進(jìn)制支持
Power management options ---> 電源管理選項(xiàng)
[ ] Networking support ---> 網(wǎng)絡(luò)協(xié)議支持忘巧,包括網(wǎng)絡(luò)選項(xiàng)恒界、 CAN-Bus、紅外砚嘴、無線十酣、 NFC等。其中的網(wǎng)絡(luò)選項(xiàng)還有更多配置項(xiàng)际长,如 IPv4耸采、 IPv6 等
Device Drivers ---> 設(shè)備驅(qū)動,包含多級下級菜單工育,包括驅(qū)動通用選項(xiàng)洋幻、 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)試階段可酌情使能其中的選項(xiàng)吁断,以獲得需要的調(diào)試信息
Security options ---> 安全選項(xiàng)
< > 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

選項(xiàng) 說明
( ) 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)慎使用該選項(xiàng)
< > Kernel .config support 選中該選項(xiàng)會將當(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

選項(xiàng) 說明
[ ] Tickless System (Dynamic Ticks) 無時(shí)鐘系統(tǒng)支持级野,根據(jù)系統(tǒng)運(yùn)行狀況來啟用或者禁用時(shí)鐘页屠,能讓內(nèi)核運(yùn)行更有效且更省電。 A8 這樣的處理器建議選中
[ ] High Resolution Timer Support 高精度定時(shí)器蓖柔。處理器支持則可選中
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í)時(shí)性則須設(shè)置為 Preemptible Kernel
[ ] Compile the kernel in Thumb-2 mode(EXPERIMENTAL) 以 Thumb-2 指令集編譯內(nèi)核潜索。不推薦
[ ] High Memory Support 高端內(nèi)存,嵌入式系統(tǒng)通常不用選

3)啟動選項(xiàng)

默認(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ò)的支持配置選項(xiàng)。

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

選項(xiàng) 說明
< > Packet socket 選中支持應(yīng)用直接與網(wǎng)卡通信而不需要在內(nèi)核中實(shí)現(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ù)實(shí)際需要配置
< > 802.1d Ethernet Bridging 802.1d 以太網(wǎng)橋
< > 802.1Q VLAN Support 802.1Q 虛擬局域網(wǎng)
[ ] QoS and/or fair queueing ---> Qos 支持蜕企,該選項(xiàng)可支持多種不同的包調(diào)度算法咬荷,否則僅能使用簡單的 FIFO 算法

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

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

選項(xiàng) 說明
Generic Driver Options ---> 通用設(shè)備驅(qū)動選項(xiàng)
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 ---> 雜項(xiàng)設(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 撥號粗悯,無需使能該選項(xiàng)
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 時(shí)鐘支持
[ ] 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è)備必須選中該選項(xiàng)
[ ] 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 ---> 實(shí)時(shí)時(shí)鐘肩杈,包括處理器內(nèi)部時(shí)鐘和外擴(kuò)時(shí)鐘選擇
[ ] 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

選項(xiàng) 說明
< > 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)支持(同時(shí)支持第 3 版)
< > FUSE (Filesystem in Userspace) support 選中后則允許在用戶空間實(shí)現(xiàn)一個文件系統(tǒng)
Caches ---> 文件系統(tǒng) Cache 支持
CD-ROM/DVD Filesystems ---> CD-ROM 和 DVD 支持嘹履,有 ISO 9660 和 UDF 兩個選項(xiàng)腻扇。如果需要支持 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 ---> 其它雜項(xiàng)文件系統(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
的時(shí)候加上“-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 映像漏益,實(shí)際上
更多的是 uImage蛹锰。

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

在 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í)耘子, 須按照該參數(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 映像文件
的命令實(shí)際操作范例:

$ 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)系作者
  • 序言:七十年代末魏宽,一起剝皮案震驚了整個濱河市腐泻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌队询,老刑警劉巖派桩,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚌斩,居然都是意外死亡铆惑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門送膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员魏,“玉大人,你說我怎么就攤上這事叠聋∷貉郑” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵碌补,是天一觀的道長虏束。 經(jīng)常有香客問我,道長厦章,這世上最難降的妖魔是什么镇匀? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮袜啃,結(jié)果婚禮上汗侵,老公的妹妹穿的比我還像新娘。我一直安慰自己囊骤,他們只是感情好晃择,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布冀值。 她就那樣靜靜地躺著也物,像睡著了一般。 火紅的嫁衣襯著肌膚如雪列疗。 梳的紋絲不亂的頭發(fā)上滑蚯,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼告材。 笑死坤次,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斥赋。 我是一名探鬼主播缰猴,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疤剑!你這毒婦竟也來了滑绒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤隘膘,失蹤者是張志新(化名)和其女友劉穎疑故,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯菊,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纵势,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了管钳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦铁。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖才漆,靈堂內(nèi)的尸體忽然破棺而出育瓜,到底是詐尸還是另有隱情,我是刑警寧澤栽烂,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布躏仇,位于F島的核電站,受9級特大地震影響腺办,放射性物質(zhì)發(fā)生泄漏焰手。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一怀喉、第九天 我趴在偏房一處隱蔽的房頂上張望书妻。 院中可真熱鬧,春花似錦躬拢、人聲如沸躲履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽工猜。三九已至,卻和暖如春菱蔬,著一層夾襖步出監(jiān)牢的瞬間篷帅,已是汗流浹背史侣。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魏身,地道東北人惊橱。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像箭昵,于是被迫代替她去往敵國和親税朴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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