第4章 Linux內核裁剪與移植
內核,即操作系統。它為底層的可編程部件提供服務(wù),為上層應用程序提供執行環(huán)境。內核裁剪就是對這些功能進(jìn)行裁剪,選取滿(mǎn)足特定平臺和需求的功能。不同的硬件平臺對內核要求也不同,因此從一個(gè)平臺到另一個(gè)平臺需要對內核進(jìn)行重新配置和編譯。操作系統從一個(gè)平臺過(guò)渡到另一個(gè)平臺稱(chēng)為移植。Linux是一款平臺適應性且容易裁剪的操作系統,因此Linux在嵌入式系統得到了廣泛的應用。本章將詳細講解內核裁剪與移植的各項技術(shù)。
4.1 Linux內核結構
Linux內核采用模塊化設計,并且各個(gè)模塊源碼以文件目錄的形式存放,在對內核的裁剪和編譯時(shí)非常方便。下面介紹內核的主要部分及其文件目錄。
4.1.1 內核的主要組成部分
在第1章中已經(jīng)介紹了Linux內核主要的5個(gè)部分:進(jìn)程調度、內存管理、虛擬文件系統、網(wǎng)絡(luò )接口、進(jìn)程通信。在系統移植的時(shí)候,它們是內核的基本元素,這5個(gè)部分之間的關(guān)系,如圖4.1所示。
圖4.1 Linux內核子系統及其之間的關(guān)系
進(jìn)程調度部分負責控制進(jìn)程對CPU的訪(fǎng)問(wèn)。內存管理允許多個(gè)進(jìn)程安全地共享主內存區域。內存管理從邏輯上分為硬件無(wú)關(guān)部分和硬件相關(guān)部分。硬件無(wú)關(guān)部分提供了進(jìn)程的映射和邏輯內存的對換;硬件相關(guān)部分為內存管理硬件提供了虛擬接口。虛擬文件系統隱藏了不同類(lèi)型硬件的具體細節,為所有的硬件設備提供了一個(gè)標準的接口,VFS提供了十多種不同類(lèi)型的文件系統。網(wǎng)絡(luò )接口提供了對各種網(wǎng)絡(luò )標準的存取和各種網(wǎng)絡(luò )硬件的支持。進(jìn)程通信部分用于支持進(jìn)程間各種不同的通信機制。進(jìn)程調度處于核心位置,內核的其他子系統都要依賴(lài)它,因為每個(gè)子系統都存在進(jìn)程掛起或恢復過(guò)程。
* 進(jìn)程調度與內存管理之間的關(guān)系:這兩個(gè)子系統為互相依賴(lài)關(guān)系。在多道程序環(huán)境下,程序要運行必須為之創(chuàng )建進(jìn)程,而創(chuàng )建進(jìn)程首先就是要將程序和數據裝入內存。另外,內存管理子系統也存在進(jìn)程的掛起和恢復過(guò)程。
* 進(jìn)程間通信與內存管理之間的關(guān)系:進(jìn)程間通信子系統要依賴(lài)內存管理支持共享內存通信機制,通過(guò)對共同的內存區域進(jìn)行操作來(lái)達到通信的目的。
* 虛擬文件系統與網(wǎng)絡(luò )接口之間的關(guān)系:虛擬文件系統通過(guò)依賴(lài)網(wǎng)絡(luò )接口支持網(wǎng)絡(luò )文件系統(NFS),也通過(guò)依賴(lài)內存管理支持RAMDISK設備。
* 內存管理與虛擬文件系統之間的關(guān)系:內存管理利用虛擬文件系統支持交換,交換進(jìn)程定期地由調度程序調度,這也是內存管理依賴(lài)于進(jìn)程調度的唯一原因。當一個(gè)進(jìn)程存取的內存映射被換出時(shí),內存管理將會(huì )向文件系統發(fā)出請求,同時(shí),掛起當前正在運行的進(jìn)程。
除了上面5個(gè)主要部分,下面將介紹Linux代碼的整體分區結構。
4.1.2 內核源碼目錄介紹
Linux內核代碼以源碼樹(shù)的形式存放,如果在安裝系統的時(shí)候已經(jīng)安裝了源碼樹(shù),其源碼樹(shù)就在/usr/src/linux下,源碼樹(shù)結構如圖4.2所示。
圖4.2 Linux內核源碼樹(shù)結構
下面分別針對圖4.2中各個(gè)部分進(jìn)行介紹,各個(gè)目錄的主要的功能分別如下。
1.a(chǎn)rch目錄
arch子目錄包括了所有和體系結構相關(guān)的核心代碼。它的每一個(gè)子目錄都代表一種支持的體系結構,例如arm子目錄是關(guān)于A(yíng)RM平臺下各種芯片兼容的代碼。
2.include目錄
include子目錄包括內核編譯時(shí)所需要的大部分頭文件。與平臺無(wú)關(guān)的頭文件在include/linux子目錄下,include/scsi目錄則是有關(guān)scsi設備的頭文件目錄,與arm相關(guān)的頭文件在include/asm-arm子目錄下。
3.drivers目錄
drivers子目錄放置系統所有的設備驅動(dòng)程序。有些驅動(dòng)是與硬件無(wú)關(guān)的,而有些驅動(dòng)是與硬件平臺相關(guān)。例如,在USB驅動(dòng)中,主機控制器有3種規格:
* OHCI主要為非PC系統上及帶有SiShe ALi芯片組的PC主板上的USB芯片,嵌入式系統一般使用該驅動(dòng)。
* UHCI大多為Intel和Via主板上的USB控制器芯片。相對OHCI而言UHCI的硬件電路比較簡(jiǎn)單,同時(shí)其成本也比較低,但驅動(dòng)復雜,但它們都是在USB 1.1規范同時(shí)提出的。
* EHCI由USB 2.0規范所提出,它兼容OHCI和UHCI。
4.fs目錄
fs子目錄列出了Linux支持的所有文件系統,目前Linux支持ext2、vfat、ntfs、yaffs2、ramfs、cramfs和romfs等多種文件系統。在嵌入式系統中常用的閃存設備的文件系統有cramfs、romfs、ramfs、jffs2、yaffs等文件系統。
5.init目錄
init子目錄包含核心的初始化代碼(注意,不是系統的引導代碼)。它包含兩個(gè)文件main.c和version.c,這是研究核心如何工作的一個(gè)非常好的起點(diǎn)。
6.ipc目錄
ipc子目錄包含核心進(jìn)程間的通信代碼。Linux下進(jìn)程間通信機制主要包括管道、信號、消息隊列、共享內存、信號量、套接口。
7.kernel目錄
kernel子目錄包含內核管理的核心代碼。與處理器結構相關(guān)代碼都放在arch/*/kernel目錄下。
8.net目錄
net子目錄里是核心的網(wǎng)絡(luò )部分代碼,其每個(gè)子目錄存放一個(gè)具體的網(wǎng)絡(luò )協(xié)議或者網(wǎng)絡(luò )模型代碼。
9.mm目錄
mm子目錄包含了所有的內存管理代碼。與具體硬件體系結構相關(guān)的內存管理代碼位于arch/*/mm目錄下。
10.scripts目錄
scripts子目錄包含用于配置核心的腳本文件。
11.lib目錄
lib子目錄包含了核心的庫代碼,與處理器結構相關(guān)的庫代碼被放在arch/*/lib/目錄下。
4.2 內核配置選項
內核配置通常是對內核支持的各個(gè)功能進(jìn)行取舍配置,將配置的方案保存到configure文件中。在編譯內核的時(shí)候,就會(huì )根據此配置對內核進(jìn)行取舍編譯。在源碼目錄下通過(guò)make menuconfig命令進(jìn)入內核的配置界面,如圖4.3所示。在對內核功能進(jìn)行配置時(shí),使用鍵盤(pán)的方向鍵移動(dòng)光標位置,使用Enter鍵選擇菜單,使用空格鍵修改配置選項。
圖4.3 內核配置界面
Linux配置選項的基本分類(lèi)和涵義如下。
4.2.1 一般選項
菜單選項(General setup)的子菜單中包含一些內核通用配置選項,如表4.1所示。在一般配置選項中如果對系統沒(méi)有特殊要求,可以只選擇System V IPC配置。
表4.1 一般選項
選 項 名
說(shuō) 明
Automatically append version information to the version string
自動(dòng)在版本后添加版本信息,編譯時(shí)需要有perl及git倉庫支持,通??梢圆贿x
Support for paging of anonymous memory (swap)
支持交換內存,通常選擇
System V IPC
進(jìn)程間通信,通常需要配置
POSIX Message Queues
POSIX消息隊列,通常需要配置
BSD Process Accounting
可以將行程資料記錄下來(lái),通常建議配置
Export task/process statistics through netlink
通過(guò)netlink接口向用戶(hù)空間導出任務(wù)/進(jìn)程的統計 信息
Auditing support
審計支持,某些內核模塊(例如SELinux)需要配置
RCU subsystem
同步機制
Kernel .config support
提供.config配置文件支持
Kernel log buffer size (16=>64KB, 17=>128KB)
內核日志緩沖區大?。?6代表64KB,17代表128KB)
Group CPU scheduler
CPU組調度
Control Group support
控制組支持
Create deprecated sysfs layout for older userspace tools
為舊的用戶(hù)空間工具創(chuàng )建過(guò)時(shí)的文件系統風(fēng)格
Kernel->user space relay support (formerly
relayfs)
在某些文件系統上(比如debugfs)提供從內核空間向用戶(hù)空間傳遞大量數據的接口
Namespace support
命名空間支持
Initial RAM filesystem and RAM disk (initramfs/initrd) support
初始化RAM文件系統的源文件。initramfs可以將根文件系統直接編譯進(jìn)內核,一般是cipo文件。對嵌入式系統有用
Optimize for size
代碼優(yōu)化。如果不了解編譯器,建議不選
Configure standard kernel features (for small systems)
為特殊環(huán)境準備的內核選項,通常不需要這些非標準內核
Disable heap randomization
禁用隨機heap(heap堆是一個(gè)應用層的概念,即堆對CPU是不可見(jiàn)的,它的實(shí)現方式有多種,可以由OS實(shí)現,也可以由運行庫實(shí)現,也可以在一個(gè)棧中來(lái)實(shí)現一個(gè)堆)
Choose SLAB allocator
選擇內存分配管理器,建議選擇
Profiling support
支持系統評測,建議不選
Kprobes
探測工具,開(kāi)發(fā)人員可以選擇,建議不選
4.2.2 內核模塊加載方式支持選項
菜單選項(Loadable module support)的子菜單中包含一些內核模塊加載方式選項,如表4.2所示。如果對模塊的加載方式有特殊要求,如可以強制卸載正在使用的模塊的要求,那么可以配置相關(guān)的模塊加載方式。
表4.2 內核模塊加載方式
選 項 名
說(shuō) 明
Forced module loading
允許強制加載模塊驅動(dòng)
Module unloading
允許卸載已經(jīng)加載的模塊,建議選擇
Forced module unloading
允許強制卸載正在運行的模塊,該功能危險,建議不選
Module versioning support
允許使用其他內核版本的模塊,建議不選
Source checksum for all modules
為所有的模塊校驗源碼,可以不選
4.2.3 系統調用、類(lèi)型、特性、啟動(dòng)相關(guān)選項
菜單選項(Block layer)的子菜單中包含一些系統調用方式選項,如表4.3所示。在配置內核時(shí)可以不選該菜單選項。
表4.3 系統調用方式
選 項 名
說(shuō) 明
Support for Large Block Devices and files
使用大容量塊設備時(shí)選擇
Support for tracing block io actions
支持塊隊列I/O跟蹤
Block layer SG support v4
支持通用scsi塊設備第4版
Block layer data integrity support
支持塊設備數據完整性
IO Schedulers
I/O調度器
菜單選項(System Type)的子菜單中包含一些系統類(lèi)型選項,在配置內核時(shí)直接選擇對應的芯片類(lèi)型即可。對特定的平臺選擇相應的支持類(lèi)型。
菜單選項(Kernel Features)的子菜單中包含一些系統特性選項,如表4.4所示。在嵌入式系統中,一般不對這些選項進(jìn)行配置。
表4.4 系統特性
選 項 名
說(shuō) 明
Preemptible Kernel
搶占式內核。建議采用
Use the ARM EABI to compile the kernel
使用ARM EABI編寫(xiě)內核
Allow old ABI binaries to run with this kernel
使內核支持舊版本的ABI程序
Memory model
只有Flat Memory供選擇
Add LRU list to track non-evictable pages
對沒(méi)有使用的頁(yè)采用最近最少使用算法,建議選擇
菜單選項(Boot Options)的子菜單中包含一些系統啟動(dòng)選項,如表4.5所示。
表4.5 系統啟動(dòng)
選 項 名
說(shuō) 明
(0)Compressed ROM boot loader base address
xImage存放的基地址
(0)Compressed ROM boot loader BSS address
BSS地址
()Default Kernel command string
內核啟動(dòng)參數
Kernel Execute-In-Place from ROM
從ROM中直接運行內核,該內核使用make xipImage編譯
(0x00080000)XIP Kernel Physical Location
選擇XIP后,內核存放的物理地址
Kexec system call
Kexec系統呼叫
4.2.4 網(wǎng)絡(luò )協(xié)議支持相關(guān)選項
菜單選項(Networking Support)的子菜單中包含一些網(wǎng)絡(luò )協(xié)議支持的選項,如表4.6所示?;局恍枰贜etworking options子菜單中選擇具體所需的網(wǎng)絡(luò )協(xié)議即可。
表4.6 網(wǎng)絡(luò )協(xié)議
選 項 名
說(shuō) 明
Networking options
該菜單的子菜單包含支持的各種具體網(wǎng)絡(luò )協(xié)議,在開(kāi)發(fā)中可以根據需要進(jìn)行配置
Amateur Radio support
業(yè)余無(wú)線(xiàn)電支持,一般不選
CAN bus subsystem support
CAN總線(xiàn)子系統支持
IrDA (infrared) subsystem support
紅外線(xiàn)支持
Bluetooth subsystem support
藍牙支持
RxRPC session sockets
RxRPC會(huì )話(huà)套接字支持
Phonet protocols family
Phonet協(xié)議族支持
Wireless
無(wú)線(xiàn)電協(xié)議支持
WiMAX Wireless Broadband support
WiMAX無(wú)線(xiàn)寬帶支持
RF switch subsystem support
RF交換子系統支持
Plan 9 Resource Sharing Support (9P2000)
9計劃資源共享支持
4.2.5 設備驅動(dòng)支持相關(guān)選項
菜單選項(Device drivers)的子菜單中包含一些設備驅動(dòng)的選項,如表4.7所示。重點(diǎn)說(shuō)明了MTD設備相關(guān)的驅動(dòng)。需要支持設備驅動(dòng)時(shí)可以配置相關(guān)的選項。
表4.7 設備驅動(dòng)
選 項 名
說(shuō) 明
Connector - unified userspace <-> kernelspace linker
用戶(hù)空間和內核空間的統一連接器
Memory Technology Devices (MTD) support
MTD設備支持,嵌入式系統使用
->Debugging
調試功能
->MTD concatenating support
連接多個(gè)MTD設備,例如使用JFFS2文件系統管理多片Flash的情形。只有一片Flash時(shí)不選
->MTD partitioning support
Flash分區支持,建議選擇
->MTD tests support
MTD測試支持
->RedBoot partition table parsing
使用RedBoot解析Flash分區表,如果需要讀取這個(gè)分區表的信息,選擇此項
->Command line partition table parsing
允許通過(guò)內核命令行傳遞MTD分區表信息
->ARM Firmware Suite partition parsing
使用AFS分區信息
->TI AR7 partitioning support
AR7分區支持
->Direct char device access to MTD devices
將系統中的MTD設備看作字符設備進(jìn)行讀/寫(xiě)
續表
選 項 名
說(shuō) 明
->Caching block device access to MTD devices
文件系統掛載后,模擬塊設備進(jìn)行訪(fǎng)問(wèn)。常用于只讀文件系統。如果是DiskOnChip使用NFTL方式
->FTL (Flash Translation Layer) support
提供對Flash翻譯層支持,可以不選
->NFTL (NAND Flash Translation Layer) support
NAND Flash翻譯層支持,可以不選
-> INFTL (Inverse NAND Flash Translation Layer) support
提供INFTL支持,DiskOnChip使用
-> Resident Flash Disk (Flash Translation Layer)
support
提供RFD支持,為嵌入式系統提供類(lèi)似BIOS 功能
-> NAND SSFDC (SmartMedia) read only translation layer
NAND SSFDC只讀翻譯層
-> Log panic/oops to an MTD buffer
MTD緩沖區日志
-> RAM/ROM/Flash chip drivers
RAM/ROM/Flash芯片驅動(dòng)
->Mapping drivers for chip access
為芯片的訪(fǎng)問(wèn)方式選擇Mapping驅動(dòng)
-> Self-contained MTD device drivers
自身包含MTD設備驅動(dòng),一般不選
->NAND Device Support
NAND Flash支持
->OneNAND Device Support
One NAND相關(guān)驅動(dòng)
->LPDDR flash memory drivers
LPDDR Flash內存驅動(dòng)
->UBI - Unsorted block images
只提供UBI支持
Parallel port support
并口支持
Block devices
紅外線(xiàn)支持
Bluetooth subsystem support
藍牙支持
RxRPC session sockets
RxRPC會(huì )話(huà)套接字支持
Phonet protocols family
Phonet協(xié)議族支持
Wireless
無(wú)線(xiàn)電協(xié)議支持
WiMAX Wireless Broadband support
WiMAX無(wú)線(xiàn)寬帶支持
RF switch subsystem support
RF交換子系統支持
Plan 9 Resource Sharing Support (9P2000)
9計劃資源共享支持
4.2.6 文件系統類(lèi)型支持相關(guān)選項
菜單選項(File Systems)的子菜單中包含一些文件系統配置的選項,如表4.8所示。內核移植完成后,通常需要制作文件系統,可以在此部分選擇內核支持的文件系統格式。
表4.8 文件系統
選 項 名
說(shuō) 明
Second extended fs support
Ext2文件系統支持
Ext3 journalling file system support
Ext3文件系統支持
The Extended 4 (ext4) filesystem
Ext4文件系統支持
Reiserfs support
Reiserfs文件系統支持
續表
選 項 名
說(shuō) 明
JFS filesystem support
JFS文件系統支持
XFS filesystem support
XFS文件系統支持
OCFS2 file system support
OCFS2文件系統支持
Btrfs filesystem (EXPERIMENTAL)
Unstable disk format
Btrfs文件系統,不穩定,建議不選擇
Dnotify support
文件系統變化通知機制支持
Inotify file change notification support
Inotify是Dnotify的替代者,在高版內核中默認支持
Quota support
磁盤(pán)限額支持
Kernel automounter support
自動(dòng)掛載遠程文件系統,如NFS
Kernel automounter version 4 support
(also supports v3)
自動(dòng)掛載遠程文件系統,對版本4和版本3都支持
FUSE (Filesystem in Userspace) support
在用戶(hù)空間掛載文件系統,建議選擇
CD-ROM/DVD Filesystems
ISO 9660,UDF等文件系統支持
DOS/FAT/NT Filesystems
FAT/NTFS文件系統支持。如果用于訪(fǎng)問(wèn)存儲設備,并且包含像Windows文件時(shí)選上該選項
Pseudo filesystems
偽操作系統,多指內存中的操作系統
Miscellaneous filesystems
雜項文件系統,包括ADFS,BFS,BeFS,HPFS等,比較少用,建議不選
Network File Systems
網(wǎng)絡(luò )文件系統。其中只有NFS在產(chǎn)品開(kāi)發(fā)過(guò)程中用。在開(kāi)發(fā)過(guò)程可以選用
Partition Types
分區類(lèi)型。該菜單下提供很多中類(lèi)型,但在嵌入式產(chǎn)品中很少用,建議不選
Distributed Lock Manager (DLM)
分布式鎖管理器
4.2.7 安全相關(guān)選項
菜單選項(Security options)的子菜單中包含一些安全配置選項。很少用,建議不選。菜單選項(Kernel hacking)的子菜單中包含內核黑客配置選項。建議不選。菜單選項(Cryptographic API)的子菜單中包含內核加密算法配置選項。很少用,建議不選。
4.2.8 其他選項
菜單選項(Bus Support)的子菜單中包含一些總線(xiàn)接口支持,嵌入式系統可以不選。菜單選項(CUP Power Management)的子菜單中包含電源管理選項,嵌入式系統可以不選。菜單選項(Floating)的子菜單中包含一些總線(xiàn)接口支持,嵌入式系統可以不選。菜單選項(Library routines)的子菜單中包含一些庫配置選項,主要提供CRC支持,在開(kāi)發(fā)通信類(lèi)產(chǎn)品時(shí)可以選擇對應的CRC。
4.3 內核裁剪及編譯
經(jīng)過(guò)對內核的認識和對裁剪配置項的了解,接下來(lái)實(shí)際操作。針對S3C2440開(kāi)發(fā)板進(jìn)行裁剪Linux內核。
4.3.1 安裝內核源代碼
在前面章節中已經(jīng)介紹了建立交叉編譯環(huán)境。如果還沒(méi)有建立編譯環(huán)境,請參考相關(guān)章節。獲得源碼可以直接從網(wǎng)上下載開(kāi)發(fā)板對應的源碼。該源碼相比Linux基本內核源碼增加了對應平臺相關(guān)的內容。將源代碼壓縮包復制到/usr/local/arm目錄下,使用tar命令解壓源碼。
tar –zxvf linux-2.6.29-HY2440.tgz
tar命令帶上zxvf參數可以看到詳細的解壓過(guò)程,如圖4.4所示。
圖4.4 內核解壓過(guò)程
4.3.2 檢查編譯環(huán)境設置
源代碼解壓完成后,進(jìn)入linux-2.6.29目錄下,然后使用VI命令編輯Mackfile。確定編譯環(huán)境為arm交叉編譯工具與本機安裝的路徑和一致。
ARCH = arm
CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-
4.3.3 配置內核
使用make menuconfig命令進(jìn)入內核配置界面,如圖4.3所示。注意在linux-2.6.29目錄下,執行make menuconfig命令才能正確進(jìn)入配置界面。下面給出一個(gè)內核的基本配置。
?。?)在一般General setup配置項中選擇子項System V IPC。由于要支持處理器在程序之間同步和交換信息,如果不選這項,很多程序將運行不起來(lái),所以選擇General setup配置項中的子項System V IPC,其他可以不選,如圖4.5所示。在此配置界面中還有一個(gè)選項[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support在制作Ramdisk文件系統時(shí),應該選上該選項,如圖4.6所示。
圖4.5 配置System V IPC
圖4.6 配置RAM disk支持
?。?)在模塊加載方式中,只選擇子項Module unloading,其他可以不選。因為Force module loading和Force module unloading會(huì )造成安全隱患,所以一般不選。Module unloading支持動(dòng)態(tài)卸載模塊,減少內核占用的資源。如圖4.7所示模塊加載方式選項配置。
圖4.7 模塊加載方式選項配置
?。?)如果系統沒(méi)有對磁盤(pán)調度方式有特殊的要求,對block layer可以不作任何配置。
?。?)在系統類(lèi)型中選擇S3C3410 DMA support和Force UART FIFO on during boot process,選DMA support選項是為了支持2440直接內存訪(fǎng)問(wèn)。選UART FIFO可以支持一般的串口通信協(xié)議。如圖4.8所示為系統類(lèi)型選項配置。
圖4.8 系統類(lèi)型選項配置
選擇S3C2440 Machines進(jìn)入S3C2440 Machines的配置界面,選擇對應開(kāi)發(fā)板類(lèi)型的支持,筆者的開(kāi)發(fā)板為Mini2440,則對應的配置如圖4.9所示。
?。?)對于總線(xiàn)支持Bus support配置,一般情況下該選項可以不作配置,除非在開(kāi)發(fā)對應的驅動(dòng)時(shí)。
圖4.9 選擇對應的開(kāi)發(fā)板類(lèi)型
?。?)在對系統特性選項進(jìn)行配置時(shí),建議對選項Use the ARM EABI to compile the kernel和選項Allow old ABI binaries to run with this kernel(EXPERIMENTAL)(NEW)進(jìn)行配置,如圖4.10所示。如果交叉編譯工具的版本為arm-linux-gcc4.3.2時(shí),沒(méi)有對這兩個(gè)選項進(jìn)行配置,就會(huì )在燒寫(xiě)完文件系統后出現系統無(wú)法啟動(dòng)的錯誤,錯誤提示為Kernel panic - not syncing: Attempted to kill init!
圖4.10 系統類(lèi)型選項配置
注意:ARM EABI有許多革新之處,其中最突出的改進(jìn)就是Float Point Performance,它使用Vector Float Point(矢量浮點(diǎn)),因此可以極大提高涉及浮點(diǎn)運算程序的運算速度。如果編譯內核的編譯器支持EABI,則在內核中也應該選擇對該項的支持。
?。?)對啟動(dòng)參數的配置,Bootloader啟動(dòng)后會(huì )將板子的信息、Ramdisk大小、命令行字符串等信息傳遞給內核,然后開(kāi)始啟動(dòng)內核,文件系統為Ramdisk時(shí)一般要配置該選項,對選項的具體地址和參數應該根據具體板子、內核大小、文件系統大小來(lái)定,該配置界面如圖4.11所示。
圖4.11 啟動(dòng)參數配置
?。?)選項CPU Power Management一般不作配置。
?。?)選項Floating point emulation一般不作配置。
?。?0)選項Userspace binary formats,配置Kernel support for ELF binaries,如圖4.12 所示。
?。?1)對于電源管理選項一般不作配置。
圖4.12 配置Kernel support for ELF binaries選項
?。?2)對于網(wǎng)絡(luò )選項的支持,配置Networking options中的TCP/IP networking和Unix domain sockets,配置如圖4.13所示。在Networking support下的其他選項,在開(kāi)發(fā)對應的驅動(dòng)時(shí)將對應的選項選上。
圖4.13 配置Networking options
?。?3)設備驅動(dòng)選擇,設備驅動(dòng)選項是最復雜也是用得最多的配置選項,特別是在開(kāi)發(fā)驅動(dòng)和系統移植的時(shí)候。
在設備驅動(dòng)選項中添加MTD支持,配置MTD partitioning support和Direct char device access to MTDdevices。配置MTD partitioning support是支持對Flash?分區的支持,配置Direct char device access to MTDdevices是支持將系統中的MTD設備看作字符設備進(jìn)行讀/寫(xiě),如圖4.14所示為驅動(dòng)選項配置。
圖4.14 驅動(dòng)選項配置
在網(wǎng)路設備驅動(dòng)配置窗口中,為了使開(kāi)發(fā)板支持網(wǎng)卡驅動(dòng)選擇Ethernet(10 or 100Mbit),如果希望支持ppp撥號還可以選擇對ppp協(xié)議的支持等,可以根據具體的開(kāi)發(fā)進(jìn)行配置,如圖4.15所示,進(jìn)入Ethernet(10 or 100Mbit)配置中選擇對應的網(wǎng)卡驅動(dòng),如圖4.16所示。
圖4.15 配置網(wǎng)絡(luò )協(xié)議的支持
圖4.16 配置對DM9000支持
在音頻設備驅動(dòng)時(shí),應該配置Sound card support,在該配置窗口下有OSS驅動(dòng)框架和ALSA驅動(dòng)框架,其配置界面如圖4.17所示。
圖4.17 配置聲卡驅動(dòng)的支持
在對驅動(dòng)框架Advanced Linux Sound Architecture進(jìn)行配置時(shí),如果音頻應用程序需要支持數字音頻接口、混音接口,則需要配置OSS Mixer API和OSS PCM(digital audio)API,如圖4.18所示。另外還要對開(kāi)發(fā)板具體的芯片支持,如Mini2440采用的UDA134x,則還要對具體的芯片驅動(dòng)進(jìn)行配置,如圖4.19所示。當然在配置具體音頻驅動(dòng)支持前應該先在內核代碼中添加相應的驅動(dòng)。
圖4.18 對數字音頻接口和混音接口支持
圖4.19 對具體芯片和驅動(dòng)的支持
USB設備驅動(dòng),也是應該要用到的內核配置選項,在開(kāi)發(fā)USB主機驅動(dòng)時(shí)應該配置OHCI HCD support選項,在開(kāi)發(fā)USB存儲設備驅動(dòng)時(shí)配置USB Mass Storage support選項,如圖4.20所示。
圖4.20 USB設備驅動(dòng)配置
在開(kāi)發(fā)鍵盤(pán)、鼠標等輸入設備驅動(dòng)時(shí),應該配置HID Devices選項。在開(kāi)發(fā)SD卡驅動(dòng)時(shí)應該配置MMC/SD/SDIO card support選項。
?。?4)文件系統選擇也是比較重要的部分,在文件系統配置選項時(shí),應該根據所用的文件系統來(lái)添加對應的文件系統支持。筆者用到了網(wǎng)絡(luò )文件系統和YAFFS2文件系統,在內核中添加對NFS和YAFFS2文件系統的支持,如圖4.21和圖4.22所示。
圖4.21 對NFS的支持
圖4.22 對YAFFS2的支持
如果開(kāi)發(fā)板在掛載其他存儲設備時(shí),這些存儲設備還包含中文時(shí),為了正確掛載這些設備,則應該在Native language support中添加對字符編碼的設置,如圖4.23所示為支持簡(jiǎn)體中文的配置。
圖4.23 對字符編碼的支持
?。?5)剩下的內核選項一般不作配置,退出內核的配置界面并保存配置。
4.3.4 編譯內核
如果是第一次編譯內核就不用清理以前的映像文件。否則可以使用make clean命令清理以前編譯的結果。在linux-2.6.29目錄下使用make dep和make zImage命令生成內核映像文件,編譯的過(guò)程如圖4.24所示。
make clean
make dep
make zImage
注意:make dep是當程序之間有依賴(lài)關(guān)系的時(shí)候,程序發(fā)生更新時(shí),依賴(lài)的程序會(huì )自動(dòng)更新。
如果編譯成功,最后會(huì )打印生成內核映像文件zImage及其目錄。
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
圖4.24 編譯過(guò)程
4.4 內核映像文件移植到ARM板
4.3節中,介紹了編譯內核映像文件。本節中介紹將映像文件下載到S3C2440開(kāi)發(fā)板上。如果開(kāi)發(fā)板沒(méi)有燒寫(xiě)Bootloader,或者上位機沒(méi)有安裝下載映像文件工具DNW,請參考前面的相關(guān)章節。在這里依然可以暫時(shí)使用廠(chǎng)家自帶的文件系統。等后面講定制文件系統后,就可以使用自制的文件系統。
4.4.1 移植準備
將4.3節生成的映像文件復制到Windows目錄下,將要下載的文件系統放映像文件、內核映像文件放在一起,便于下載。
?。?)將開(kāi)發(fā)板與上位機正確連接,確定開(kāi)發(fā)板電源已經(jīng)插上,且開(kāi)發(fā)板處于關(guān)閉狀態(tài);串口線(xiàn)已經(jīng)正確連接;USB線(xiàn)未連接。運行DNW工具,此時(shí)DNW的COM和USB狀態(tài)如圖4.25所示。
?。?)確定上位機與開(kāi)發(fā)板相連的串口編號。這里用的是筆記本,沒(méi)有串口,采用USB轉串口。在Windows設備管理器下可以看到與開(kāi)發(fā)板相連的串口為COM4,如圖4.26 所示。
?。?)選擇Configuration | Options命令,進(jìn)入串口配置界面,將波特率設置為115200,COM Port為設置COM4,下載地址設置為0x32000000,如圖4.27所示。配置完成后單擊OK按鈕保存配置。
圖4.25 未連接前DNW狀態(tài) 圖4.26 確定與開(kāi)發(fā)板相連的串口
?。?)選擇Serial Port | connect命令,DNW狀態(tài)應該變成如圖4.28所示的狀態(tài)。
圖4.27 確定與開(kāi)發(fā)板相連的串口 圖4.28 串口配置正確后狀態(tài)
?。?)確定以上步驟正確后,通過(guò)USB線(xiàn)將上位機和開(kāi)發(fā)板連接起來(lái)。按住上位機的空格鍵,啟動(dòng)開(kāi)發(fā)板。如果是第一次采用USB下載系統將會(huì )提示安裝驅動(dòng)。根據提示安裝完驅動(dòng)之后,DNW將進(jìn)入vivi模式。此時(shí)USB狀態(tài)為OK,在DNW顯示正確的vivi信息,如圖4.29所示。
圖4.29 進(jìn)入vivi模式
4.4.2 燒寫(xiě)系統
燒寫(xiě)Linux系統的整個(gè)過(guò)程包括格式化Nand Flash、燒寫(xiě)Bootloader、燒寫(xiě)內核映像文件和燒寫(xiě)文件系統映像文件。下面具體介紹每個(gè)步驟的詳細過(guò)程。
1.分區格式化Flash
在vivi模式下輸入:bon part 0 192k 1216k,將Nand Flash分成三個(gè)區。三個(gè)區的大小如下所示。
* 0~192k:大小為192k;
* 192k~1216k:大小為1M;
* 1216k~64M:大小為63M。
執行分區命令后,會(huì )在屏幕上打印下列信息:
FriendlyARM> bon part 0 192k 1216k
doing partition
size = 0
size = 196608
size = 1245184
以上信息顯示分區的起始地址。
check bad block
part = 0 end = 196608
part = 1 end = 1245184
part = 2 end = 67108864
part0:
offset = 0
size = 196608
bad_block = 0
part1:
offset = 196608
size = 1048576
bad_block = 0
part2:
offset = 1245184
size = 65847296
bad_block = 0
以上信息詳細打印了分區大小、壞區大小和分區的起始地址等信息。
注意:分區后不能掉電或者關(guān)電,因為此時(shí)Nand Flash中已經(jīng)被清空。否則需要按照第3章介紹的方法使用H-JTAG重新燒寫(xiě)Bootloader。
2.燒寫(xiě)Bootloader
在vivi模式下輸入load flash vivi u命令。DNW進(jìn)入等待下載狀態(tài)后,選擇DNW菜單欄的USB Post | Transmit命令,選擇vivi.bin文件。燒寫(xiě)完成后會(huì )打印如下信息。
FriendlyARM> load flash vivi u
USB host is connected. Waiting a download.
Now, Downloading [ADDRESS:30000000h,TOTAL:105154]
RECEIVED FILE SIZE: 105154 (102KB/S, 1S)
Downloaded file at 0x30000000, size = 105144 bytes
Found block size = 0x0001c000
Erasing... ... done
Writing... ... done
Written 105144 bytes
如果燒寫(xiě)成功,就會(huì )打印Writing… …done。
注意:在打印USB host is connected. Waiting a download信息后,單擊DNW菜單欄的USB Post|Transmit命令。出現選擇文件對話(huà)框,選擇文件后開(kāi)始燒寫(xiě)Bootloader。
3.下載Linux內核文件
在vivi模式下輸入load flash kernel u命令,DNW進(jìn)入等待下載狀態(tài)后,單擊DNW菜單欄的USB Post | Transmit命令,選擇4.4.1節生成的內核文件zImage,如圖4.30所示。下載內核的過(guò)程如圖4.31所示。
圖4.30 選擇內核文件
圖4.31 下載內核過(guò)程
正確下載內核完成信息如下:
FriendlyARM> load flash kernel u
USB host is connected. Waiting a download.
Now, Downloading [ADDRESS:30000000h,TOTAL:1852554]
RECEIVED FILE SIZE: 1852554 (904KB/S, 2S)
Downloaded file at 0x30000000, size = 1852544 bytes
Found block size = 0x001c8000
Erasing... ... done
Writing... ... done
Written 1852544 bytes
注意:在打印USB host is connected. Waiting a download信息后,單擊DNW菜單欄的USB Post | Transmit命令。
4.安裝文件系統
接上一步操作,輸入命令loadyaffs root u安裝文件系統,暫時(shí)使用開(kāi)發(fā)板廠(chǎng)家提供的示例文件系統。選擇文件系統映像文件root_qtopia_dm9000A43.img,如圖4.32所示。安裝文件系統過(guò)程如圖4.33所示。
圖4.32 選擇文件系統映像文件
正確安裝文件系統后顯示載入yaffs文件系統成功及文件系統的大小,打印如下信息。
Load yaffs OK:
Blocks scanned: 3947, Blocks erased: 3947, Blocks are bad: 0
RECEIVED and Writed FILE SIZE:45779722 (363KB/S, 123S)
5.啟動(dòng)系統
在vivi模式下輸入boot啟動(dòng)系統,正確進(jìn)入系統后顯示如圖4.34所示?;蛘咧苯又貑㈤_(kāi)發(fā)板進(jìn)入Linux系統。
圖4.33 安裝文件系統過(guò)程
圖4.34 正確進(jìn)入系統信息
4.5 內 核 升 級
系統移植還包括內核升級。當開(kāi)發(fā)板提供的內核和編譯器版本太低,不能兼容很多新的驅動(dòng)和功能時(shí),此時(shí)就要著(zhù)手考慮升級內核。本節將以at91rm9200為例,介紹為開(kāi)發(fā)板移植高版本的內核。
4.5.1 準備升級內核文件
開(kāi)發(fā)板自帶的內核版本為L(cháng)inux-2.4.27,編譯器版本為2.95.3。在開(kāi)發(fā)一些新的應用程序和驅動(dòng)時(shí),編譯器和內核不支持新的功能。準備將內核升級到2.6版本,編譯器選擇的版本為3.4.1。需要準備的資源文件列表如下所示。
* 內核:linux-2.6.10.tar.gz;
* 針對at91的內核補?。?.6.10-at91.patch.gz;
* 交叉編譯器:cross-3.4.1.tar.bz2。
4.5.2 移植過(guò)程
下面詳細介紹一下移植過(guò)程。
?。?)將所有文件復制到工作目錄下,然后解壓內核文件和編譯器文件。
?。?)為內核打補丁。
#cd linu-2.6.10
#patch -p1< 2.6.10-at91.patch.gz
?。?)修改Makefile,修改編譯環(huán)境。
ARCH = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-
?。?)修改machine ID。如果這一步省略,會(huì )在移植到開(kāi)發(fā)板后Bootloader引導時(shí)出現機器ID錯誤的現象。出錯的ID號將以十六進(jìn)制給出,將其轉化為十進(jìn)制,替換mach-types文件中的對應項。這里移植后報的錯誤是0xFB,即對應十進(jìn)制251。
#vi /usr/local/arm/linux-2.6.10/arch/arm/tools/mach-types
找到
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262
將其修改為:
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 251
?。?)制作uImage文件。在內核目錄下建議一個(gè)名為mkimage的文件,其內容如下:
/usr/local/arm/3.4.1/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin
gzip -v9 linux.bin
./mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage
?。?)對內核進(jìn)行配置。執行make at91rm9200dk_defconfig實(shí)際上就是完成對內核的 配置。
#make at91rm9200dk_defconfig
其具體配置如下:
* Plug and Play support
* Block devices
RAM disk support (BLK_DEV_RAM) [Y/n/m/?] y
Default number of RAM disks (BLK_DEV_RAM_COUNT) [16] 16
Default RAM disk size (kbytes) (BLK_DEV_RAM_SIZE) [8192] 8192
Initial RAM disk (initrd) support (BLK_DEV_INITRD) [Y/n/?] y
Source directory of cpio_list (INITRAMFS_SOURCE) []
Packet writing on CD/DVD media (CDROM_PKTCDVD) [N/m/y/?] n
* IO Schedulers
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] y
* Multi-device support (RAID and LVM)
* Networking support
Networking support (NET) [Y/n/?] y
* Networking options
Packet socket (PACKET) [Y/n/m/?] y
Unix domain sockets (UNIX) [Y/n/m/?] y
TCP/IP networking (INET) [Y/n/?] y
IP: kernel level autoconfiguration (IP_PNP) [Y/n/?] y
IP: BOOTP support (IP_PNP_BOOTP) [Y/n/?] y
IP: TCP socket monitoring interface (IP_TCPDIAG) [Y/n/m/?] y
* Network packet filtering (replaces ipchains)
* SCTP Configuration (EXPERIMENTAL)
* QoS and/or fair queueing
* Network testing
* Amateur Radio support
* IrDA (infrared) subsystem support
* Bluetooth subsystem support
Network device support (NETDEVICES) [Y/n/?] y
* Ethernet (10 or 100Mbit)
Ethernet (10 or 100Mbit) (NET_ETHERNET) [Y/n/?] y
Generic Media Independent Interface device support (MII) [Y/?] y
AT91RM9200 Ethernet support (ARM_AT91_ETHER) [Y/n/m/?] y
RMII interface (ARM_AT91_ETHER_RMII) [Y/n/?] y
* Ethernet (1000 Mbit)
* Ethernet (10000 Mbit)
* Token Ring devices
* Wireless LAN (non-hamradio)
* Wan interfaces
* SCSI device support
* Fusion MPT device support
* IEEE 1394 (FireWire) support
* I2O device support
* ISDN subsystem
* Input device support
* Userland interfaces
Mouse interface (INPUT_MOUSEDEV) [Y/?] (NEW) y
Horizontal screen resolution (INPUT_MOUSEDEV_SCREEN_X) [1024] 1024
Vertical screen resolution (INPUT_MOUSEDEV_SCREEN_Y) [768] 768
* Input I/O drivers
* Input Device Drivers
* Character devices
* Serial drivers
* Non-8250 serial port support
AT91RM9200 serial port support (SERIAL_AT91) [Y/n/m/?] y
Support for console on AT91RM9200 serial port (SERIAL_AT91_CONSOLE) [Y/n/?] y
Legacy (BSD) PTY support (LEGACY_PTYS) [Y/n/?] y
Maximum number of legacy PTY in use (LEGACY_PTY_COUNT) [256] 256
* IPMI
* Watchdog Cards
Watchdog Timer Support (WATCHDOG) [Y/n/?] y
Disable watchdog shutdown on close (WATCHDOG_NOWAYOUT) [Y/n/?] y
* Watchdog Device Drivers
AT91RM9200 watchdog (AT91_WATCHDOG) [Y/n/m/?] y
* USB-based Watchdog Cards
* Ftape, the floppy tape device driver
SPI driver for AT91 processors (AT91_SPI) [Y/n/?] y
SPI device interface for AT91 processors (AT91_SPIDEV) [Y/n/?] y
* I2C support
I2C support (I2C) [Y/n/m/?] y
I2C device interface (I2C_CHARDEV) [Y/n/m/?] y
* I2C Algorithms
* I2C Hardware Bus support
Atmel AT91RM9200 I2C Two-Wire interface (TWI) (I2C_AT91) [Y/n/m/?] y
* Hardware Sensors Chip support
* Other I2C Chip support
* Multimedia devices
* Digital Video Broadcasting Devices
* File systems
Second extended fs support (EXT2_FS) [Y/n/m/?] y
* CD-ROM/DVD Filesystems
* Pseudo filesystems
/proc file system support (PROC_FS) [Y/n/?] y
/dev file system support (OBSOLETE) (DEVFS_FS) [Y/n/?] y
Automatically mount at boot (DEVFS_MOUNT) [Y/n/?] y
Debug devfs (DEVFS_DEBUG) [N/y/?] n
Virtual memory file system support (former shm fs) (TMPFS) [Y/n/?] y
* Miscellaneous filesystems
Compressed ROM file system support (cramfs) (CRAMFS) [Y/n/m/?] y
* Network File Systems
* Partition Types
* Native Language Support
* Profiling support
* Graphics support
* Console display driver support
* Sound
* Misc devices
* USB support
Support for Host-side USB (USB) [Y/n/m/?] y
USB verbose debug messages (USB_DEBUG) [Y/n/?] y
* Miscellaneous USB options
* USB Host Controller Drivers
SL811HS HCD support (USB_SL811_HCD) [N/m/y/?] n
* USB Device Class drivers
USB Mass Storage support (USB_STORAGE) [N/m/y/?] n
* USB Input Devices
* USB HID Boot Protocol drivers
* USB Imaging devices
* USB Multimedia devices
* Video4Linux support is needed for USB Multimedia device support
* USB Network Adapters
* USB port drivers
* USB Serial Converter support
* USB Miscellaneous drivers
* USB ATM/DSL drivers
* USB Gadget Support
* MMC/SD Card support
* Kernel hacking
Kernel debugging (DEBUG_KERNEL) [Y/n/?] y
* Security options
* Cryptographic options
* Library routines
CRC32 functions (CRC32) [Y/?] y
上面已經(jīng)對內核做了詳細的配置,考慮到內容比較多的情況,省略了沒(méi)有配置的選項??梢酝ㄟ^(guò)make menuconfig去查看對System Type(系統類(lèi)型)的修改情況以確認進(jìn)行正確的配置,如圖4.35所示。
圖4.35 系統類(lèi)型已經(jīng)被設置為AT91RM9200
?。?)編譯內核生成映像文件。
#make clean
#make dep
.#/mkimage
4.6 小 結
本章主要講解Linux內核的目錄結構、Linux內核配置選項及裁剪內核、編譯內核。最后結合實(shí)例講解內核移植和內核升級的具體過(guò)程。在開(kāi)始接觸內核移植時(shí),不提倡初學(xué)者拿到源碼就直接進(jìn)行裁剪配置,這樣經(jīng)常會(huì )由于忽略了某個(gè)選項導致移植的時(shí)候失敗。最好的辦法是首先導入內核自帶的配置,在這些配置的基礎上根據自己的需要進(jìn)行裁剪。
第2篇 系統移植技術(shù)篇
聯(lián)系客服