一、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