首 頁 閱覽室 館友 我的圖書館 登錄注冊
Linux內核裁剪與移植
linux內核裁剪的具體過程和方法
這是我前段時間自己整的一份,內核功能:
能夠完成系統的基本功能,上網,收發郵件等,支持xwindows圖形界面。
在menuconfig中配置:
詳細介紹內核配置選項及刪改情況
第一部分:全部刪除
Code maturity level options ---> 代碼成熟等級選項
[]Prompt for development and/or incomplete code/drivers 默認情況下是選擇的,這將會在設置界面中顯示還在開發或者還沒有完成的代碼與驅動.不選。
第二部分 :除以下選項,其它全部刪除
General setup—〉
System V IPC (IPC:Inter Process Communication)是組系統調用及函數庫,它能讓程序彼此間同步進行交換信息。某些程序以及DOS模擬環境都需要它。為進程提供通信機制,這將 使系統中各進程間有交換信息與保持同步的能力。有些程序只有在選Y的情況下才能運行,所以不用考慮,這里一定要選。
第三部分:除以下選項,其它全部刪除
Loadable module support ---> 可引導模塊支持 建議作為模塊加入內核
[] Enable loadable module support 這個選項可以讓你的內核支持模塊,模塊是什么呢?模塊是一小段代碼,編譯后可在系統內核運行時動態的加入內核,從而為內核增加一些特性或是對某種硬件進行 支持。一般一些不常用到的驅動或特性可以編譯為模塊以減少內核的體積。在運行時可以使用modprobe命令來加載它到內核中去(在不需要時還可以移除 它)。一些特性是否編譯為模塊的原則是,不常使用的,特別是在系統啟動時不需要的驅動可以將其編譯為模塊,如果是一些在系統啟動時就要用到的驅動比如說文 件系統,系統總線的支持就不要編為模塊了,否在無法啟動系統。
[]Automatic kernel module loading 一般情況下,如果我們的內核在某些任務中要使用一些被編譯為模塊的驅動或特性時,我們要先使用modprobe命令來加載它,內核才能使用。不過,如果你 選擇了這個選項,在內核需要一些模塊時它可以自動調用modprobe命令來加載需要的模塊,這是個很棒的特性,當然要選Y嘍。
第四部分:全部刪除
Block layer-----〉塊設備
第五部分:除以下選項,其它全部刪除
Processor type and features ---> 處理器類型
Subarchitecture Type (PC-compatible) ---> 這選項的主要的目的,是使Linux可以支持多種PC標准,一般我們使用的PC機是遵循所謂IBM兼容結構(pc/at)。這個選項可以讓你選擇一些其它 架構。我們一般選擇PC-compatible就可以了。
Processor family(386) : 它會對每種CPU做最佳化,讓它跑的好又快,一般來說,你是什么型號的就選什么型號的就好。我選的是386,這樣內核會省下不少空間
第六部分:除以下選項,其它全部刪除
Power management options (ACPI, APM) ---> 電源管理選項
[ ] Power Management Debug Support 電源管理的調試信息支持,如果不是要調試內核有關電源管理部份,請不要選擇這項。
ACPI Support ---〉高級電源接口配置支持,如果BIOS支持,建議選上這項
[]Button 這個選項用於注冊基於電源按鈕的事件,比如power, sleep等,當你按下按鈕時事件將發生,一個守護程序將讀取/proc/acpi/event,並執行用戶在這些事件上定義的動作比如讓系統關機。可以不選擇,根據自己的需求。
第七部分:除以下選項,其它全部刪除
Bus options (PCI, PCMCIA, EISA, MCA, ISA) ---> 總線選項
[]PCI support
PCI access mode (Any) ---> PCI外圍設備配置,強列建議選Any,系統將優先使用MMConfig,然后使用BIOS,最后使用Direct檢測PCI設備。
第八部分:除以下選項,其它全部刪除
Executable file formats --->
Kernel support for ELF binaries ELF是開放平台下最常用的二進制文件,它支持不同的硬件平台。一定要選。
第九部分:除以下選項,其它全部刪除
Networking
Networking options --->
[]Unix domain sockets
[]TCP/IP networking
第十部分:除以下選項,其它全部刪除
Device Drivers ---> 設備驅動
Block devices-------〉
[]Compaq SMART2 support
[] Compaq Smart Array 5xxx support
[]Loopback device support 大部分的人這一個選項都選N,因為沒有必要。但是如果你要mount iso文件的話,你得選上Y。這個選項的意思是說,可以將一個文件掛成一個文件系統。如果要燒光盤片的,那么您很有可能在把一個文件燒進去之前,看看這個 文件是否符合IS09660的文件系統的內容,是否符合您的需求。而且,可以對這個文件系統加以保護。不過,如果您 想做到這點的話,您必須有最新的mount程序,版本是在2.5X版以上的。而且如果您希望對這個文件系統加上保護,則您必須有des.1.tar.gz 這個程序。注意:此處與網絡無關。建議編譯成模塊
[] RAM disk support
SCSI device support ---> 里面有關於USB支持的,要選擇
[]SCSI device support USB要用,必須選擇
[]legacy /proc/scsi/ support USB要用,必須選擇
[]SCSI disk support USB要用,必須選擇
SCSI Low-level drivers
[]Serial ATA(SATA) support
[]Intel PIIX/ICH SATA support 這個必須選擇,否則無法產生引導文件
[]Via SATA support
Networking device support ---> 這個下面是選網卡驅動,一定要選
Ethernet(1000mbit)-我的電腦是千兆網卡所以就選這個
[]broadcom Tigon3support
Input device support ---> 這個里面要設置你的鼠標鍵盤什么的
[]Provide legacy /dev/psaux device
Graphics support --->
[]Support for frame buffer devices 支持Frame buffer的,一定要選擇
USB support --->
[]USB device filesystem 這個好象是用U盤必須的
[]EHCI HCD (USB 2.0) support 有usb2.0就選上把,編譯成模塊
[]OHCI HCD support 必須選擇,編譯成模塊
[]UHCI HCD (most Intel and VIA) support 必須選擇,編譯成模塊
[]USB Mass Storage support 用U盤必須選擇
USB Human Interface Device (full HID) support 里面選擇usb鼠標和usb鍵盤,如果你有一定選上這個必需選
HID input layer support 應該選擇
/dev/hiddev raw HID device support如果這里有USB鍵盤和鼠標選項,一定要選擇
第十一部分:除以下選項,其它全部刪除
file systems ---> 文件系統
<*> Second extended fs support
[*] Ext2 extended attributes
[*] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels
<M> Ext3 journalling file system support
[*] Ext3 extended attributes
[*] Ext3 POSIX Access Control Lists
[*] Ext3 Security Labels 以上這些肯定是要選擇的,linux的標准文件系統
<M> Kernel automounter support 內核自動掛載的,當然要選
<M> Kernel automounter version 4 support (also supports v3) 當然要選
DOS/FAT/NT Filesystems --->
<M> DOS FAT fs support
<M> MSDOS fs support
<M> VFAT (Windows-95) fs support
<M> NTFS file system support
Native language support語言支持,這里就支持英語和漢語就行了,不多說了
[]NLS ISO 8859-1 必須選擇,這個是關於U盤掛載的。
CD-ROM/DVD Filesystems ---> 這個是關於掛載ISO文件的,用的話就選。
<*> ISO 9660 CDROM file system support
第十二部分: 全部刪除
Instrumentation support
第十三部分:全部刪除
Kernel hacking ---> 破解核心?可不是當骸客啦,不選
第十四部分:全部刪除
Security options --->
第十五部分:全部刪除
Cryptographic options ---> 這是核心支持加密的選項
第十六部分:全部刪除
Library routines --->
內核配置
內核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig等等,它們的功能都是一樣的,區別應該從名字上就能看出來,只有make oldconfig是指用系統當前的設置(./.config)作為缺省值。這里用的是make menuconfig。
需要牢記:不必要的驅動越多,內核就越大,不僅運行速度慢、占用內存多,在少數情況下、還會引發其他問題。具體步驟如下:
首先確定shell是bash。
然后
$make menuconfig
有一些默認的符號其含義如下:
y:加載
n:不加載
m:作為模塊加載
可以配置的選項有以下一些:
1)code maturity level option 代碼成熟度
prompt for development and/or incomplete code/drivers [N/y/?]
如果有興趣測試一下內核中尚未最終完成的某些模塊,就選y,否則選N,想知道更詳細的信息選?會看到聯機幫助(以下?的含義相同),N大寫表示缺省值。
2)processor type and features 處理器類型及特性
Processor family(386,486/Cx486,586/K5/5x86/6x86,Pentium/K6/TSC, PPro/6x86MX)[PPro/6x86MX]
[]內的是缺省值,我們可以根據前面介紹的uname 命令執行的結果選擇。此項如果高於386,那么生成的內核在386機器上將不能啟動。
Math emulation(CONFIG_MATH_EMULATION)[N/y/?]
需要進行協處理器模擬嗎?一般的機器都回n。如果機器已經有硬件的協處理器,那么內核仍將使用硬件,而忽略軟件的math-emulation,這將使內核變大變慢。
MTRR(Memory Type Range Register)support(CONFIG_MTRR)[N/y/?]
在Pentium、Pro/Pentium II類的系統中可以提高圖像寫入速度。
Symmetric multi-processing support(CONFIG_SMP)[Y/n/?]
如果您的機器有多個處理器,就選y。此時要選中下面的Enhanced Real Time Clock Support
3)loadable model support 可加載模塊支持
Enable loadable module support(CONFIG_MODULES)[Y/n/?]
最好選y,不然許多僅供動態加載的模塊就不能用了。
Set version information on all symbols for modules(CONFIG_MODVERSIONS)[N/y/?]
選N
Kernel module loader(CONFIG_KMOD)[N/y/?]
4)general setup 一般設置
Networking support(CONFIG_NET)[Y/n/?]
選y吧,現在還有幾台計算機不用上網呢?
PCI support (CONFIG_PCI)[Y/n/?]
PCI 總線和設備總該有吧。
PCI access mode(BIOS,Direct,Any)[Any]
缺省值比較保險,但如果您對您的主板很有信心,就選BIOS。
PCI quirks (CONFIG_PCI_QUIRKS)[Y/n/?]
用於修補BIOS中對PCI有影響的BUG,同樣,如果您對主板很有信心,就選n。
Backward-compatible /proc/pci〉(CONFIG_PCI_OLD_PROC)[Y/n/?]
以前的內核使用/proc/pci,新版內核使用/proc/bus/pci,要保持兼容性就選y。
MCA support(CONFIG_MCA)[N/y/?]
查看幫助吧。
SGI Visual Workstation support(CONFIG_VISWS)[N/y/?]
您的機器是SGI的嗎?是就選y。
System V IPC(CONFIG_SYSVIPC)[Y/n/?]
進程間通信函數和系統調用。Linux內核的五大組成部分之一,一定要選。
BSD Process Accounting(CONFIG_BSD_PROCESS_ACCT)[N/y/?]
用於啟動由內核將進程信息寫入文件的用戶級系統調用。就看您想不想用它了。
Sysctl support(CONFIG_SYSCTL)[Y/n/?]
在內核正在運行的時候修改內核。用8KB空間換取某種方便。別選吧,除非你真的想試試。
Kernel support for a.out binaries(CONFIG_BINFMT_AOUT)[Y/m/n/?]
為了能使用以前編譯的程序,選y。
Kernel support for ELF binaries(CONFIG_BINFMT_ELF)[Y/m/n/?]
為了能使用現在編譯的程序,選y。
Kernel support for MISC binaries(CONFIG_BINFMT_MISC)[Y/m/n/?]
一般選y,用於支持java等代碼的自動執行。
Parallel port support(CONFIG_PARPORT)[N/y/m/?]
並口設備,如打印機。
5)plug and play support 即插即用設備支持
Plug and Play support (CONFIG_PNP)[N/y/?]
選y吧。
6)block devices 塊設備
Normal PC floppy disk support(CONFIG_BLK_DEV_FD)[Y/m/n/?]
一般的軟驅。選y。
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support(CONFIG_BLK_DEV_IDE)[Y/m/n/?]
這幾種接口的硬盤、光驅、磁帶、軟驅。選y。
Include IDE/ATAPI CDROM support(CONFIG_BLK_DEV_IDECD)[Y/m/n/?]
CDROM。選y。
7)networking options 網絡選項
Packet socket (CONFIG_PACHET)[Y/m/n/?]
按照目前網絡發展的狀況,選y比較好。當然也可以選其它的。
Kernel/User netlink socke(CONFIG_NETLINK)[N/y/?]
內核與用戶進程雙向通信。選y。
Network firewalls(CONFIG_FIREWALL)[N/Y/?]
如果真的需要用防火牆,就選y。
UNIX domain sockets(confgi_unix)[Y/m/n/?]
socket 的用處太多了。選y。
TCP/IP networking(CONFIG_INET)[Y/n/?]
選y,理由如上一條。
The IPX protocol (CONFIG_IPX)[N/y/m/?]
其實並沒有那么多人真的需要使用或者學習IPX,所以一般選N。
Appletalk DDP(CONFIG_ATALK)[N/y/m/?]
選N,理由同上。
8)SCSI support SCSI支持,SCSI low-level drives SCSI低級驅動
根據系統中SCSI設備的實際情況選擇。
9)Networking device support 網絡設備支持
如果用LAN上網,就選擇網卡;
如果用MODEM撥號上網,就要看ISP提供那種服務了,一般都是PPP。
10)Amateur Radio support 業余收音機支持
這是什么我不太清楚,所以選N。
11)ISDN subsystem ISDN子系統
好像已經有支持ISDN的MODEM了,所以最好先看看自己的MODEM是不是這種,再做選擇。
12)Old CD-ROM dfivers (not SCSI, not IDE) 老式光驅驅動
一般選N,因為這種設備實在很少見。
13)Character devices 字符設備
Virtual terminal(CONFIG_VT)[Y/n/?]
Linux上一般可以用Alt+F1/F2/F3/F4來切換不同的任務終端,即使在一台計算機上也可以充分使用Linux的多任務能力,一些需要以命令行方式安裝合適用的軟件如果有虛擬終端的支持就會更方便,因此選y。
Support for console on virtual terminal(CONFIG_VT_CONSOLE)[Y/n/?]
選y將支持一個虛擬終端作為控制台。一般為Alt+F1。
Support for console on serial port(CONFIG_SERIAL)[Y/m/n/?]
除非真的需要一個串口控制台,否則選n。
Extended dumb serial driver options(CONFIG_SERIAL_EXTENDED)[N/y/?]
如果希望使用 "dumb "的非標准特性(如HUB6支持),選y,一般選N。
Non-standard serial port support(CONFIG_SERIAL_NONSTANDARD)[N/y/?]
非標准串口。一般選N。
UNIX98 PTY support(CONFIG_UNIX98_PTYS)[Y/n/?]
PTY指偽終端,一般用戶就選n。但如果想用telnet或者xterms作為終端訪問主機,並且已經安裝了glibc2.1,就可以選y。
Maximum number of UNIX98 PTYs in use(0-2048)(CONFIG_UNIX98_PTY_COUNT)[256]
缺省值就可以了。
Mouse Support(not serial mice)(CONFIG_MOUSE)[Y/n/?]
PS/2等非串口鼠標選y,否則選N。
14)Mice 鼠標
根據自己的鼠標類型選擇。
15)Video for Linux Linux視頻
根據系統中的音/視頻捕捉設備選擇。
16)Joystick support 操縱桿
根據系統中的游戲桿設備選擇
17)Ftape,the floopy tape device driver Ftape設備驅動
Ftape (QIC-80/Travan)support(CONFIG_FTAPE)[N/y/m/?]
如果系統中有磁帶機,選y。
18)Filesystems 文件系統
文件系統的選擇要比較仔細,因為其中的一些給某些系統功能提供支持。而且除了proc、ext2等文件系統之外,其它的文件系統(包括下面的網絡文件系統)都可以選擇為m方式,從而減小內核啟動時的體積。
Quota support(CONFIG_QUOTA)[N/y/?]
用於給用戶划分定量的磁盤空間。如不用此功能就選N。
DOS FAT fs support(CONFIG_FAT_FS)[N/y/m/?]
為內核提供FAT支持,多數用戶有可能從Linux訪問同一系統中的WINDOWS硬盤空間,因此最好選y。
ISO 9660 CDROM filesystem support(CONFIG_ISO9660_FS)[Y/m/n/?]
有標准光驅的系統應該選Y。
Minix fs support(CONFIG_MINIX_FS)[N/y/m/?]
用於創建啟動盤的文件系統,多數應該選y或者m。
/proc filesystem support(CONFIG_PROC_FS)[Y/n/?]
虛擬文件系統,必須選Y。
Second extended fs support(CONFIG_EXT2_FS)[Y/m/n/?]
Linux標准文件系統,都應該選Y。
19)Network file systems 網絡文件系統
Coda filesystem support (advanced network fs)(CONFIG_CODA_FS)[N/y/m/?]
先看幫助再選。
NFS filesystem support(CONFIG_NFS_FS)[Y/m/n/?]
選Y或n,能夠訪問遠程NFS文件系統。
SMB filesystem support(to mount WfW shares etc.)(CONFIG_SMB_FS)[N/y/m/?]
要訪問WINDOWS系統中的共享資源選y。
NCP filesystem support(to mout NetWare volumes)(CONFIG_NCP_FS)[N/y/m/?]
如果真的需要訪問NetWare文件系統,就選y或者m。
20)Partion Types 分區類型
一般用不上;要用請參看幫助。
21)Console drivers 控制台驅動
VGA text console(CONFIG_VGA_CONSOLE)[Y/n/?]
用VGA模式下用文本方式操作Linux,一般選y。
Video mode selection support(CONFIG_VIDEO_SELECT)[N/y/?]
大多數系統都不需要這項功能。
22)Sound 聲音
Sound card support(CONFIG_SOUND)[N/y/m/?]
如果系統中安裝了聲卡,就選y(或者m),然后查看幫助。
23)Kernel hacking 內核監視
kernel hacking往往會生成非常大或者非常慢(甚至又大又慢)的內核,甚至會引起內核工作不穩定。如果一定要選,那么也最好不要選其中的 "development "、 "experimental "、 "debugging "項。
第4章 Linux內核裁剪與移植
內核,即操作系統。它為底層的可編程部件提供服務,為上層應用程序提供執行環境。內核裁剪就是對這些功能進行裁剪,選取滿足特定平台和需求的功能。不同的硬件平台對內核要求也不同,因此從一個平台到另一個平台需要對內核進行重新配置和編譯。操作系統從一個平台過渡到另一個平台稱為移植。Linux是一款平台適應性且容易裁剪的操作系統,因此Linux在嵌入式系統得到了廣泛的應用。本章將詳細講解內核裁剪與移植的各項技術。
4.1 Linux內核結構
Linux內核采用模塊化設計,並且各個模塊源碼以文件目錄的形式存放,在對內核的裁剪和編譯時非常方便。下面介紹內核的主要部分及其文件目錄。
4.1.1 內核的主要組成部分
在第1章中已經介紹了Linux內核主要的5個部分:進程調度、內存管理、虛擬文件系統、網絡接口、進程通信。在系統移植的時候,它們是內核的基本元素,這5個部分之間的關系,如圖4.1所示。
圖4.1 Linux內核子系統及其之間的關系
進程調度部分負責控制進程對CPU的訪問。內存管理允許多個進程安全地共享主內存區域。內存管理從邏輯上分為硬件無關部分和硬件相關部分。硬件無關部分提供了進程的映射和邏輯內存的對換;硬件相關部分為內存管理硬件提供了虛擬接口。虛擬文件系統隱藏了不同類型硬件的具體細節,為所有的硬件設備提供了一個標准的接口,VFS提供了十多種不同類型的文件系統。網絡接口提供了對各種網絡標准的存取和各種網絡硬件的支持。進程通信部分用於支持進程間各種不同的通信機制。進程調度處於核心位置,內核的其他子系統都要依賴它,因為每個子系統都存在進程掛起或恢復過程。
* 進程調度與內存管理之間的關系:這兩個子系統為互相依賴關系。在多道程序環境下,程序要運行必須為之創建進程,而創建進程首先就是要將程序和數據裝入內存。另外,內存管理子系統也存在進程的掛起和恢復過程。
* 進程間通信與內存管理之間的關系:進程間通信子系統要依賴內存管理支持共享內存通信機制,通過對共同的內存區域進行操作來達到通信的目的。
* 虛擬文件系統與網絡接口之間的關系:虛擬文件系統通過依賴網絡接口支持網絡文件系統(NFS),也通過依賴內存管理支持RAMDISK設備。
* 內存管理與虛擬文件系統之間的關系:內存管理利用虛擬文件系統支持交換,交換進程定期地由調度程序調度,這也是內存管理依賴於進程調度的唯一原因。當一個進程存取的內存映射被換出時,內存管理將會向文件系統發出請求,同時,掛起當前正在運行的進程。
除了上面5個主要部分,下面將介紹Linux代碼的整體分區結構。
4.1.2 內核源碼目錄介紹
Linux內核代碼以源碼樹的形式存放,如果在安裝系統的時候已經安裝了源碼樹,其源碼樹就在/usr/src/linux下,源碼樹結構如圖4.2所示。
圖4.2 Linux內核源碼樹結構
下面分別針對圖4.2中各個部分進行介紹,各個目錄的主要的功能分別如下。
1.arch目錄
arch子目錄包括了所有和體系結構相關的核心代碼。它的每一個子目錄都代表一種支持的體系結構,例如arm子目錄是關於ARM平台下各種芯片兼容的代碼。
2.include目錄
include子目錄包括內核編譯時所需要的大部分頭文件。與平台無關的頭文件在include/linux子目錄下,include/scsi目錄則是有關scsi設備的頭文件目錄,與arm相關的頭文件在include/asm-arm子目錄下。
3.drivers目錄
drivers子目錄放置系統所有的設備驅動程序。有些驅動是與硬件無關的,而有些驅動是與硬件平台相關。例如,在USB驅動中,主機控制器有3種規格:
* OHCI主要為非PC系統上及帶有SiShe ALi芯片組的PC主板上的USB芯片,嵌入式系統一般使用該驅動。
* UHCI大多為Intel和Via主板上的USB控制器芯片。相對OHCI而言UHCI的硬件電路比較簡單,同時其成本也比較低,但驅動復雜,但它們都是在USB 1.1規范同時提出的。
* 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子目錄包含核心的初始化代碼(注意,不是系統的引導代碼)。它包含兩個文件main.c和version.c,這是研究核心如何工作的一個非常好的起點。
6.ipc目錄
ipc子目錄包含核心進程間的通信代碼。Linux下進程間通信機制主要包括管道、信號、消息隊列、共享內存、信號量、套接口。
7.kernel目錄
kernel子目錄包含內核管理的核心代碼。與處理器結構相關代碼都放在arch/*/kernel目錄下。
8.net目錄
net子目錄里是核心的網絡部分代碼,其每個子目錄存放一個具體的網絡協議或者網絡模型代碼。
9.mm目錄
mm子目錄包含了所有的內存管理代碼。與具體硬件體系結構相關的內存管理代碼位於arch/*/mm目錄下。
10.scripts目錄
scripts子目錄包含用於配置核心的腳本文件。
11.lib目錄
lib子目錄包含了核心的庫代碼,與處理器結構相關的庫代碼被放在arch/*/lib/目錄下。
4.2 內核配置選項
內核配置通常是對內核支持的各個功能進行取舍配置,將配置的方案保存到configure文件中。在編譯內核的時候,就會根據此配置對內核進行取舍編譯。在源碼目錄下通過make menuconfig命令進入內核的配置界面,如圖4.3所示。在對內核功能進行配置時,使用鍵盤的方向鍵移動光標位置,使用Enter鍵選擇菜單,使用空格鍵修改配置選項。
圖4.3 內核配置界面
Linux配置選項的基本分類和涵義如下。
4.2.1 一般選項
菜單選項(General setup)的子菜單中包含一些內核通用配置選項,如表4.1所示。在一般配置選項中如果對系統沒有特殊要求,可以只選擇System V IPC配置。
表4.1 一般選項
選 項 名
說 明
Automatically append version information to the version string
自動在版本后添加版本信息,編譯時需要有perl及git倉庫支持,通常可以不選
Support for paging of anonymous memory (swap)
支持交換內存,通常選擇
System V IPC
進程間通信,通常需要配置
POSIX Message Queues
POSIX消息隊列,通常需要配置
BSD Process Accounting
可以將行程資料記錄下來,通常建議配置
Export task/process statistics through netlink
通過netlink接口向用戶空間導出任務/進程的統計 信息
Auditing support
審計支持,某些內核模塊(例如SELinux)需要配置
RCU subsystem
同步機制
Kernel .config support
提供.config配置文件支持
Kernel log buffer size (16=>64KB, 17=>128KB)
內核日志緩沖區大小(16代表64KB,17代表128KB)
Group CPU scheduler
CPU組調度
Control Group support
控制組支持
Create deprecated sysfs layout for older userspace tools
為舊的用戶空間工具創建過時的文件系統風格
Kernel->user space relay support (formerly
relayfs)
在某些文件系統上(比如debugfs)提供從內核空間向用戶空間傳遞大量數據的接口
Namespace support
命名空間支持
Initial RAM filesystem and RAM disk (initramfs/initrd) support
初始化RAM文件系統的源文件。initramfs可以將根文件系統直接編譯進內核,一般是cipo文件。對嵌入式系統有用
Optimize for size
代碼優化。如果不了解編譯器,建議不選
Configure standard kernel features (for small systems)
為特殊環境准備的內核選項,通常不需要這些非標准內核
Disable heap randomization
禁用隨機heap(heap堆是一個應用層的概念,即堆對CPU是不可見的,它的實現方式有多種,可以由OS實現,也可以由運行庫實現,也可以在一個棧中來實現一個堆)
Choose SLAB allocator
選擇內存分配管理器,建議選擇
Profiling support
支持系統評測,建議不選
Kprobes
探測工具,開發人員可以選擇,建議不選
4.2.2 內核模塊加載方式支持選項
菜單選項(Loadable module support)的子菜單中包含一些內核模塊加載方式選項,如表4.2所示。如果對模塊的加載方式有特殊要求,如可以強制卸載正在使用的模塊的要求,那么可以配置相關的模塊加載方式。
表4.2 內核模塊加載方式
選 項 名
說 明
Forced module loading
允許強制加載模塊驅動
Module unloading
允許卸載已經加載的模塊,建議選擇
Forced module unloading
允許強制卸載正在運行的模塊,該功能危險,建議不選
Module versioning support
允許使用其他內核版本的模塊,建議不選
Source checksum for all modules
為所有的模塊校驗源碼,可以不選
4.2.3 系統調用、類型、特性、啟動相關選項
菜單選項(Block layer)的子菜單中包含一些系統調用方式選項,如表4.3所示。在配置內核時可以不選該菜單選項。
表4.3 系統調用方式
選 項 名
說 明
Support for Large Block Devices and files
使用大容量塊設備時選擇
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)的子菜單中包含一些系統類型選項,在配置內核時直接選擇對應的芯片類型即可。對特定的平台選擇相應的支持類型。
菜單選項(Kernel Features)的子菜單中包含一些系統特性選項,如表4.4所示。在嵌入式系統中,一般不對這些選項進行配置。
表4.4 系統特性
選 項 名
說 明
Preemptible Kernel
搶占式內核。建議采用
Use the ARM EABI to compile the kernel
使用ARM EABI編寫內核
Allow old ABI binaries to run with this kernel
使內核支持舊版本的ABI程序
Memory model
只有Flat Memory供選擇
Add LRU list to track non-evictable pages
對沒有使用的頁采用最近最少使用算法,建議選擇
菜單選項(Boot Options)的子菜單中包含一些系統啟動選項,如表4.5所示。
表4.5 系統啟動
選 項 名
說 明
(0)Compressed ROM boot loader base address
xImage存放的基地址
(0)Compressed ROM boot loader BSS address
BSS地址
()Default Kernel command string
內核啟動參數
Kernel Execute-In-Place from ROM
從ROM中直接運行內核,該內核使用make xipImage編譯
(0x00080000)XIP Kernel Physical Location
選擇XIP后,內核存放的物理地址
Kexec system call
Kexec系統呼叫
4.2.4 網絡協議支持相關選項
菜單選項(Networking Support)的子菜單中包含一些網絡協議支持的選項,如表4.6所示。基本只需要在Networking options子菜單中選擇具體所需的網絡協議即可。
表4.6 網絡協議
選 項 名
說 明
Networking options
該菜單的子菜單包含支持的各種具體網絡協議,在開發中可以根據需要進行配置
Amateur Radio support
業余無線電支持,一般不選
CAN bus subsystem support
CAN總線子系統支持
IrDA (infrared) subsystem support
紅外線支持
Bluetooth subsystem support
藍牙支持
RxRPC session sockets
RxRPC會話套接字支持
Phonet protocols family
Phonet協議族支持
Wireless
無線電協議支持
WiMAX Wireless Broadband support
WiMAX無線寬帶支持
RF switch subsystem support
RF交換子系統支持
Plan 9 Resource Sharing Support (9P2000)
9計划資源共享支持
4.2.5 設備驅動支持相關選項
菜單選項(Device drivers)的子菜單中包含一些設備驅動的選項,如表4.7所示。重點說明了MTD設備相關的驅動。需要支持設備驅動時可以配置相關的選項。
表4.7 設備驅動
選 項 名
說 明
Connector - unified userspace <-> kernelspace linker
用戶空間和內核空間的統一連接器
Memory Technology Devices (MTD) support
MTD設備支持,嵌入式系統使用
->Debugging
調試功能
->MTD concatenating support
連接多個MTD設備,例如使用JFFS2文件系統管理多片Flash的情形。只有一片Flash時不選
->MTD partitioning support
Flash分區支持,建議選擇
->MTD tests support
MTD測試支持
->RedBoot partition table parsing
使用RedBoot解析Flash分區表,如果需要讀取這個分區表的信息,選擇此項
->Command line partition table parsing
允許通過內核命令行傳遞MTD分區表信息
->ARM Firmware Suite partition parsing
使用AFS分區信息
->TI AR7 partitioning support
AR7分區支持
->Direct char device access to MTD devices
將系統中的MTD設備看作字符設備進行讀/寫
續表
選 項 名
說 明
->Caching block device access to MTD devices
文件系統掛載后,模擬塊設備進行訪問。常用於只讀文件系統。如果是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支持,為嵌入式系統提供類似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芯片驅動
->Mapping drivers for chip access
為芯片的訪問方式選擇Mapping驅動
-> Self-contained MTD device drivers
自身包含MTD設備驅動,一般不選
->NAND Device Support
NAND Flash支持
->OneNAND Device Support
One NAND相關驅動
->LPDDR flash memory drivers
LPDDR Flash內存驅動
->UBI - Unsorted block images
只提供UBI支持
Parallel port support
並口支持
Block devices
紅外線支持
Bluetooth subsystem support
藍牙支持
RxRPC session sockets
RxRPC會話套接字支持
Phonet protocols family
Phonet協議族支持
Wireless
無線電協議支持
WiMAX Wireless Broadband support
WiMAX無線寬帶支持
RF switch subsystem support
RF交換子系統支持
Plan 9 Resource Sharing Support (9P2000)
9計划資源共享支持
4.2.6 文件系統類型支持相關選項
菜單選項(File Systems)的子菜單中包含一些文件系統配置的選項,如表4.8所示。內核移植完成后,通常需要制作文件系統,可以在此部分選擇內核支持的文件系統格式。
表4.8 文件系統
選 項 名
說 明
Second extended fs support
Ext2文件系統支持
Ext3 journalling file system support
Ext3文件系統支持
The Extended 4 (ext4) filesystem
Ext4文件系統支持
Reiserfs support
Reiserfs文件系統支持
續表
選 項 名
說 明
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
磁盤限額支持
Kernel automounter support
自動掛載遠程文件系統,如NFS
Kernel automounter version 4 support
(also supports v3)
自動掛載遠程文件系統,對版本4和版本3都支持
FUSE (Filesystem in Userspace) support
在用戶空間掛載文件系統,建議選擇
CD-ROM/DVD Filesystems
ISO 9660,UDF等文件系統支持
DOS/FAT/NT Filesystems
FAT/NTFS文件系統支持。如果用於訪問存儲設備,並且包含像Windows文件時選上該選項
Pseudo filesystems
偽操作系統,多指內存中的操作系統
Miscellaneous filesystems
雜項文件系統,包括ADFS,BFS,BeFS,HPFS等,比較少用,建議不選
Network File Systems
網絡文件系統。其中只有NFS在產品開發過程中用。在開發過程可以選用
Partition Types
分區類型。該菜單下提供很多中類型,但在嵌入式產品中很少用,建議不選
Distributed Lock Manager (DLM)
分布式鎖管理器
4.2.7 安全相關選項
菜單選項(Security options)的子菜單中包含一些安全配置選項。很少用,建議不選。菜單選項(Kernel hacking)的子菜單中包含內核黑客配置選項。建議不選。菜單選項(Cryptographic API)的子菜單中包含內核加密算法配置選項。很少用,建議不選。
4.2.8 其他選項
菜單選項(Bus Support)的子菜單中包含一些總線接口支持,嵌入式系統可以不選。菜單選項(CUP Power Management)的子菜單中包含電源管理選項,嵌入式系統可以不選。菜單選項(Floating)的子菜單中包含一些總線接口支持,嵌入式系統可以不選。菜單選項(Library routines)的子菜單中包含一些庫配置選項,主要提供CRC支持,在開發通信類產品時可以選擇對應的CRC。
4.3 內核裁剪及編譯
經過對內核的認識和對裁剪配置項的了解,接下來實際操作。針對S3C2440開發板進行裁剪Linux內核。
4.3.1 安裝內核源代碼
在前面章節中已經介紹了建立交叉編譯環境。如果還沒有建立編譯環境,請參考相關章節。獲得源碼可以直接從網上下載開發板對應的源碼。該源碼相比Linux基本內核源碼增加了對應平台相關的內容。將源代碼壓縮包復制到/usr/local/arm目錄下,使用tar命令解壓源碼。
tar –zxvf linux-2.6.29-HY2440.tgz
tar命令帶上zxvf參數可以看到詳細的解壓過程,如圖4.4所示。
圖4.4 內核解壓過程
4.3.2 檢查編譯環境設置
源代碼解壓完成后,進入linux-2.6.29目錄下,然后使用VI命令編輯Mackfile。確定編譯環境為arm交叉編譯工具與本機安裝的路徑和一致。
ARCH = arm
CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-
4.3.3 配置內核
使用make menuconfig命令進入內核配置界面,如圖4.3所示。注意在linux-2.6.29目錄下,執行make menuconfig命令才能正確進入配置界面。下面給出一個內核的基本配置。
(1)在一般General setup配置項中選擇子項System V IPC。由於要支持處理器在程序之間同步和交換信息,如果不選這項,很多程序將運行不起來,所以選擇General setup配置項中的子項System V IPC,其他可以不選,如圖4.5所示。在此配置界面中還有一個選項[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support在制作Ramdisk文件系統時,應該選上該選項,如圖4.6所示。
圖4.5 配置System V IPC
圖4.6 配置RAM disk支持
(2)在模塊加載方式中,只選擇子項Module unloading,其他可以不選。因為Force module loading和Force module unloading會造成安全隱患,所以一般不選。Module unloading支持動態卸載模塊,減少內核占用的資源。如圖4.7所示模塊加載方式選項配置。
圖4.7 模塊加載方式選項配置
(3)如果系統沒有對磁盤調度方式有特殊的要求,對block layer可以不作任何配置。
(4)在系統類型中選擇S3C3410 DMA support和Force UART FIFO on during boot process,選DMA support選項是為了支持2440直接內存訪問。選UART FIFO可以支持一般的串口通信協議。如圖4.8所示為系統類型選項配置。
圖4.8 系統類型選項配置
選擇S3C2440 Machines進入S3C2440 Machines的配置界面,選擇對應開發板類型的支持,筆者的開發板為Mini2440,則對應的配置如圖4.9所示。
(5)對於總線支持Bus support配置,一般情況下該選項可以不作配置,除非在開發對應的驅動時。
圖4.9 選擇對應的開發板類型
(6)在對系統特性選項進行配置時,建議對選項Use the ARM EABI to compile the kernel和選項Allow old ABI binaries to run with this kernel(EXPERIMENTAL)(NEW)進行配置,如圖4.10所示。如果交叉編譯工具的版本為arm-linux-gcc4.3.2時,沒有對這兩個選項進行配置,就會在燒寫完文件系統后出現系統無法啟動的錯誤,錯誤提示為Kernel panic - not syncing: Attempted to kill init!
圖4.10 系統類型選項配置
?注意:ARM EABI有許多革新之處,其中最突出的改進就是Float Point Performance,它使用Vector Float Point(矢量浮點),因此可以極大提高涉及浮點運算程序的運算速度。如果編譯內核的編譯器支持EABI,則在內核中也應該選擇對該項的支持。
(7)對啟動參數的配置,Bootloader啟動后會將板子的信息、Ramdisk大小、命令行字符串等信息傳遞給內核,然后開始啟動內核,文件系統為Ramdisk時一般要配置該選項,對選項的具體地址和參數應該根據具體板子、內核大小、文件系統大小來定,該配置界面如圖4.11所示。
圖4.11 啟動參數配置
(8)選項CPU Power Management一般不作配置。
(9)選項Floating point emulation一般不作配置。
(10)選項Userspace binary formats,配置Kernel support for ELF binaries,如圖4.12 所示。
(11)對於電源管理選項一般不作配置。
圖4.12 配置Kernel support for ELF binaries選項
(12)對於網絡選項的支持,配置Networking options中的TCP/IP networking和Unix domain sockets,配置如圖4.13所示。在Networking support下的其他選項,在開發對應的驅動時將對應的選項選上。
圖4.13 配置Networking options
(13)設備驅動選擇,設備驅動選項是最復雜也是用得最多的配置選項,特別是在開發驅動和系統移植的時候。
在設備驅動選項中添加MTD支持,配置MTD partitioning support和Direct char device access to MTDdevices。配置MTD partitioning support是支持對Flash?分區的支持,配置Direct char device access to MTDdevices是支持將系統中的MTD設備看作字符設備進行讀/寫,如圖4.14所示為驅動選項配置。
圖4.14 驅動選項配置
在網路設備驅動配置窗口中,為了使開發板支持網卡驅動選擇Ethernet(10 or 100Mbit),如果希望支持ppp撥號還可以選擇對ppp協議的支持等,可以根據具體的開發進行配置,如圖4.15所示,進入Ethernet(10 or 100Mbit)配置中選擇對應的網卡驅動,如圖4.16所示。
圖4.15 配置網絡協議的支持
圖4.16 配置對DM9000支持
在音頻設備驅動時,應該配置Sound card support,在該配置窗口下有OSS驅動框架和ALSA驅動框架,其配置界面如圖4.17所示。
圖4.17 配置聲卡驅動的支持
在對驅動框架Advanced Linux Sound Architecture進行配置時,如果音頻應用程序需要支持數字音頻接口、混音接口,則需要配置OSS Mixer API和OSS PCM(digital audio)API,如圖4.18所示。另外還要對開發板具體的芯片支持,如Mini2440采用的UDA134x,則還要對具體的芯片驅動進行配置,如圖4.19所示。當然在配置具體音頻驅動支持前應該先在內核代碼中添加相應的驅動。
圖4.18 對數字音頻接口和混音接口支持
圖4.19 對具體芯片和驅動的支持
USB設備驅動,也是應該要用到的內核配置選項,在開發USB主機驅動時應該配置OHCI HCD support選項,在開發USB存儲設備驅動時配置USB Mass Storage support選項,如圖4.20所示。
圖4.20 USB設備驅動配置
在開發鍵盤、鼠標等輸入設備驅動時,應該配置HID Devices選項。在開發SD卡驅動時應該配置MMC/SD/SDIO card support選項。
(14)文件系統選擇也是比較重要的部分,在文件系統配置選項時,應該根據所用的文件系統來添加對應的文件系統支持。筆者用到了網絡文件系統和YAFFS2文件系統,在內核中添加對NFS和YAFFS2文件系統的支持,如圖4.21和圖4.22所示。
圖4.21 對NFS的支持
圖4.22 對YAFFS2的支持
如果開發板在掛載其他存儲設備時,這些存儲設備還包含中文時,為了正確掛載這些設備,則應該在Native language support中添加對字符編碼的設置,如圖4.23所示為支持簡體中文的配置。
圖4.23 對字符編碼的支持
(15)剩下的內核選項一般不作配置,退出內核的配置界面並保存配置。
4.3.4 編譯內核
如果是第一次編譯內核就不用清理以前的映像文件。否則可以使用make clean命令清理以前編譯的結果。在linux-2.6.29目錄下使用make dep和make zImage命令生成內核映像文件,編譯的過程如圖4.24所示。
make clean
make dep
make zImage
?注意:make dep是當程序之間有依賴關系的時候,程序發生更新時,依賴的程序會自動更新。
如果編譯成功,最后會打印生成內核映像文件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 編譯過程
4.4 內核映像文件移植到ARM板
4.3節中,介紹了編譯內核映像文件。本節中介紹將映像文件下載到S3C2440開發板上。如果開發板沒有燒寫Bootloader,或者上位機沒有安裝下載映像文件工具DNW,請參考前面的相關章節。在這里依然可以暫時使用廠家自帶的文件系統。等后面講定制文件系統后,就可以使用自制的文件系統。
4.4.1 移植准備
將4.3節生成的映像文件復制到Windows目錄下,將要下載的文件系統放映像文件、內核映像文件放在一起,便於下載。
(1)將開發板與上位機正確連接,確定開發板電源已經插上,且開發板處於關閉狀態;串口線已經正確連接;USB線未連接。運行DNW工具,此時DNW的COM和USB狀態如圖4.25所示。
(2)確定上位機與開發板相連的串口編號。這里用的是筆記本,沒有串口,采用USB轉串口。在Windows設備管理器下可以看到與開發板相連的串口為COM4,如圖4.26 所示。
(3)選擇Configuration | Options命令,進入串口配置界面,將波特率設置為115200,COM Port為設置COM4,下載地址設置為0x32000000,如圖4.27所示。配置完成后單擊OK按鈕保存配置。
圖4.25 未連接前DNW狀態 圖4.26 確定與開發板相連的串口
(4)選擇Serial Port | connect命令,DNW狀態應該變成如圖4.28所示的狀態。
圖4.27 確定與開發板相連的串口 圖4.28 串口配置正確后狀態
(5)確定以上步驟正確后,通過USB線將上位機和開發板連接起來。按住上位機的空格鍵,啟動開發板。如果是第一次采用USB下載系統將會提示安裝驅動。根據提示安裝完驅動之后,DNW將進入vivi模式。此時USB狀態為OK,在DNW顯示正確的vivi信息,如圖4.29所示。
圖4.29 進入vivi模式
4.4.2 燒寫系統
燒寫Linux系統的整個過程包括格式化Nand Flash、燒寫Bootloader、燒寫內核映像文件和燒寫文件系統映像文件。下面具體介紹每個步驟的詳細過程。
1.分區格式化Flash
在vivi模式下輸入:bon part 0 192k 1216k,將Nand Flash分成三個區。三個區的大小如下所示。
* 0~192k:大小為192k;
* 192k~1216k:大小為1M;
* 1216k~64M:大小為63M。
執行分區命令后,會在屏幕上打印下列信息:
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
以上信息詳細打印了分區大小、壞區大小和分區的起始地址等信息。
?注意:分區后不能掉電或者關電,因為此時Nand Flash中已經被清空。否則需要按照第3章介紹的方法使用H-JTAG重新燒寫Bootloader。
2.燒寫Bootloader
在vivi模式下輸入load flash vivi u命令。DNW進入等待下載狀態后,選擇DNW菜單欄的USB Post | Transmit命令,選擇vivi.bin文件。燒寫完成后會打印如下信息。
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
如果燒寫成功,就會打印Writing… …done。
?注意:在打印USB host is connected. Waiting a download信息后,單擊DNW菜單欄的USB Post|Transmit命令。出現選擇文件對話框,選擇文件后開始燒寫Bootloader。
3.下載Linux內核文件
在vivi模式下輸入load flash kernel u命令,DNW進入等待下載狀態后,單擊DNW菜單欄的USB Post | Transmit命令,選擇4.4.1節生成的內核文件zImage,如圖4.30所示。下載內核的過程如圖4.31所示。
圖4.30 選擇內核文件
圖4.31 下載內核過程
正確下載內核完成信息如下:
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安裝文件系統,暫時使用開發板廠家提供的示例文件系統。選擇文件系統映像文件root_qtopia_dm9000A43.img,如圖4.32所示。安裝文件系統過程如圖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.啟動系統
在vivi模式下輸入boot啟動系統,正確進入系統后顯示如圖4.34所示。或者直接重啟開發板進入Linux系統。
圖4.33 安裝文件系統過程
圖4.34 正確進入系統信息
4.5 內 核 升 級
系統移植還包括內核升級。當開發板提供的內核和編譯器版本太低,不能兼容很多新的驅動和功能時,此時就要着手考慮升級內核。本節將以at91rm9200為例,介紹為開發板移植高版本的內核。
4.5.1 准備升級內核文件
開發板自帶的內核版本為Linux-2.4.27,編譯器版本為2.95.3。在開發一些新的應用程序和驅動時,編譯器和內核不支持新的功能。准備將內核升級到2.6版本,編譯器選擇的版本為3.4.1。需要准備的資源文件列表如下所示。
* 內核:linux-2.6.10.tar.gz;
* 針對at91的內核補丁:2.6.10-at91.patch.gz;
* 交叉編譯器:cross-3.4.1.tar.bz2。
4.5.2 移植過程
下面詳細介紹一下移植過程。
(1)將所有文件復制到工作目錄下,然后解壓內核文件和編譯器文件。
(2)為內核打補丁。
#cd linu-2.6.10
#patch -p1< 2.6.10-at91.patch.gz
(3)修改Makefile,修改編譯環境。
ARCH = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-
(4)修改machine ID。如果這一步省略,會在移植到開發板后Bootloader引導時出現機器ID錯誤的現象。出錯的ID號將以十六進制給出,將其轉化為十進制,替換mach-types文件中的對應項。這里移植后報的錯誤是0xFB,即對應十進制251。
#vi /usr/local/arm/linux-2.6.10/arch/arm/tools/mach-types
找到
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262
將其修改為:
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 251
(5)制作uImage文件。在內核目錄下建議一個名為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
(6)對內核進行配置。執行make at91rm9200dk_defconfig實際上就是完成對內核的 配置。
#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
上面已經對內核做了詳細的配置,考慮到內容比較多的情況,省略了沒有配置的選項。可以通過make menuconfig去查看對System Type(系統類型)的修改情況以確認進行正確的配置,如圖4.35所示。
圖4.35 系統類型已經被設置為AT91RM9200
(7)編譯內核生成映像文件。
#make clean
#make dep
.#/mkimage
4.6 小 結
本章主要講解Linux內核的目錄結構、Linux內核配置選項及裁剪內核、編譯內核。最后結合實例講解內核移植和內核升級的具體過程。在開始接觸內核移植時,不提倡初學者拿到源碼就直接進行裁剪配置,這樣經常會由於忽略了某個選項導致移植的時候失敗。最好的辦法是首先導入內核自帶的配置,在這些配置的基礎上根據自己的需要進行裁剪。