Linux-2.6.38.8 移植參考
?
最近學(xué)習(xí)Linux有點(diǎn)迷茫,剛學(xué)會(huì)了字符驅(qū)動(dòng)的編寫但是卻不知道下一步該干些什么,想學(xué)習(xí)Linux內(nèi)核裁剪,但是苦于找不到資料,開發(fā)板自帶的是Linux3.01,雖然我會(huì)編譯內(nèi)核卻完全不知道如何去裁剪,配置都是開發(fā)板自帶的,我想自己學(xué)習(xí)裁剪一個(gè)Linux2.6的內(nèi)核,因?yàn)楝F(xiàn)在的學(xué)習(xí)資料大部分都是以2.6的內(nèi)核為例的,因此為了學(xué)習(xí)方便,我想移植一個(gè)Linux2.6的內(nèi)核,因此從官網(wǎng)下載了一個(gè)Linux2.6.38.8版本的Linux源代碼。
后面會(huì)持續(xù)更新...
?
?
1.進(jìn)入Linux2.6的源代碼根目錄。
?
Linux源碼目錄結(jié)構(gòu)詳解
?
Arch
目錄包括了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它下面的每一個(gè)子目錄都代表一種Linux支持的體系結(jié)構(gòu),例如i386就是Intel?CPU及與之相兼容體系結(jié)構(gòu)的子目錄。PC機(jī)一般都基于此目錄。
Copying
目錄下是GPL版權(quán)申明。對(duì)具有GPL版權(quán)的源代碼改動(dòng)而形成的程序,或使用GPL工具產(chǎn)生的程序,具有使用GPL發(fā)表的義務(wù),如公開源代碼。
Credits
目錄下是光榮榜。對(duì)Linux做出過很大貢獻(xiàn)的一些人的信息。
Documentation
目錄下是一些文檔,沒有內(nèi)核代碼,可惜都是English的,是對(duì)每個(gè)目錄作用的具體說明。
Drivers
目錄中是系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于drivers/sound;?block?下為塊設(shè)備驅(qū)動(dòng)程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系統(tǒng)的設(shè)備是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不僅初始化硬盤,也初始化,因?yàn)榘惭bnfs文件系統(tǒng)的時(shí)候需要網(wǎng)絡(luò)其他:?如,?Lib放置核心的庫(kù)代碼;?Net,核心與網(wǎng)絡(luò)相關(guān)的代碼;?Ipc,這個(gè)目錄包含核心的進(jìn)程間通訊的代碼;?Fs,所有的文件系統(tǒng)代碼和各種類型的文件操作代碼,它的每一個(gè)子目錄支持一個(gè)文件系統(tǒng),例如fat和ext2。
Fs
目錄存放Linux支持的文件系統(tǒng)代碼和各種類型的文件操作代碼。每一個(gè)子目錄支持一個(gè)文件系統(tǒng),如ext3文件系統(tǒng)對(duì)應(yīng)的就是ext3子目錄。
Include
目錄包括編譯核心所需要的大部分頭文件,例如與平臺(tái)無關(guān)的頭文件在include/linux子目錄下,與?intel?cpu相關(guān)的頭文件在include/asm-i386子目錄下,而include/scsi目錄則是有關(guān)scsi設(shè)備的頭文件目錄。
Init
目錄包含核心的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼),有main.c和Version.c兩個(gè)文件。這是研究核心如何工作的好起點(diǎn)。
Ipc
目錄包含了核心進(jìn)程間的通信代碼。
Kernel
內(nèi)核管理的核心代碼,此目錄下的文件實(shí)現(xiàn)了大多數(shù)linux系統(tǒng)的內(nèi)核函數(shù),其中最重要的文件當(dāng)屬sched.c;同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/*/kernel目錄下。
Lib
目錄包含了核心的庫(kù)代碼,不過與處理器結(jié)構(gòu)相關(guān)的庫(kù)代碼被放在arch/*/lib/目錄下。
Maintainers
目錄存放了維護(hù)人員列表,對(duì)當(dāng)前版本的內(nèi)核各部分都有誰(shuí)負(fù)責(zé)。
Makefile
目錄第一個(gè)Makefile文件。用來組織內(nèi)核的各模塊,記錄了個(gè)模塊間的相互這間的聯(lián)系和依托關(guān)系,編譯時(shí)使用;仔細(xì)閱讀各子目錄下的Makefile文件對(duì)弄清各個(gè)文件這間的聯(lián)系和依托關(guān)系很有幫助。
Mm
目錄包含了所有獨(dú)立于?cpu?體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁(yè)式存儲(chǔ)管理內(nèi)存的分配和釋放等。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下,例如arch/i386/mm/Fault.c?。
Modules
目錄存放了已建好的、可動(dòng)態(tài)加載的模塊文件目錄,是個(gè)空目錄,用于存放編譯時(shí)產(chǎn)生的模塊目標(biāo)文件。
Net
目錄里是核心的網(wǎng)絡(luò)部分代碼,其每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。
Reporting-bugs
目錄里是有關(guān)報(bào)告Bug?的一些內(nèi)容
Scripts
目錄包含用于配置核心的腳本文件等。
一般在每個(gè)目錄下都有一個(gè).depend文件和一個(gè)Makefile文件。這兩個(gè)文件都是編譯時(shí)使用的輔助文件。仔細(xì)閱讀這兩個(gè)文件對(duì)弄清各個(gè)文件之間的聯(lián)系和依托關(guān)系很有幫助。另外有的目錄下還有Readme文件,它是對(duì)該目錄下文件的一些說明,同樣有利于對(duì)內(nèi)核源碼的理解。
?
?
?
?
?
修改根目錄makefile文件
exportKBUILD_BUILDHOST := $(SUBARCH)
ARCH???????????????? =arm
CROSS_COMPILE???? ?= $(CONFIG_CROSS_COMPILE:"%"=%)
否則后面不能設(shè)置ARM處理器。
?
?
配置Linux內(nèi)核,最常用的是執(zhí)行“makemenuconfig",如果不能執(zhí)行請(qǐng)安裝ncurses.
menucofig是個(gè)圖圖形配置解碼,如下
?
在圖中選項(xiàng)前面如果為<*>表示模塊被編譯進(jìn)內(nèi)核;如果為
?
?
?
黃色高亮表示啟用該選項(xiàng)。
選項(xiàng)說明
1.General setup --->???????????????????? //一般設(shè)置
???????? ?[*] Prompt for development and/or incompletecode/drivers??
默認(rèn)情況下是選擇的,這將會(huì)在設(shè)置界面中顯示還在開發(fā)或者還沒有完成的代碼與驅(qū)動(dòng).? 你應(yīng)該選擇它,因?yàn)橛性S多設(shè)備可能必需選擇這個(gè)選項(xiàng)才能進(jìn)行配置,實(shí)際上它是安全的。
???????? ()? Cross-compiler toolprefix?? ???????
?????????????????? 交叉編譯工具前綴,如果你要使用交叉編譯工具的話輸入相關(guān)前綴。我使用的是arm-linux- 前綴。
???????? ()? Local version -append to kernel release???
?????????????????? 自定義版本,也就是uname -r可以看到的版本,可以自行修改,這里我沒有使用
???????? [ ] Automatically append version information to the versionstring???
自動(dòng)生成版本信息。這個(gè)選項(xiàng)會(huì)自動(dòng)探測(cè)你的內(nèi)核并且生成相應(yīng)的版本,使之不會(huì)和原先??????? 的重復(fù)。這需要Perl的支持。由于在編譯的命令make-kpkg 中我們會(huì)加入- –append-to-version 選項(xiàng)來生成自定義版本,所以這里選N。
???????? Kernel compression mode (Gzip)? --->???
有5個(gè)選項(xiàng),這個(gè)選項(xiàng)是說內(nèi)核鏡像要用的壓縮模式,回車一下,可以看到gzip,bzip2,lzma,xz,lzo,一般可以按默認(rèn)的gzip,如果要用bzip2,lzma,lzo,要先安裝相關(guān)解壓縮工具
???????? [*] Support for paging of anonymous memory(swap)?
?????????????????? 使你的內(nèi)核支持虛擬內(nèi)存 , 一定要選。
???????? [*] System V IPC?
進(jìn)程提供通信機(jī)制,這將使系統(tǒng)中各進(jìn)程間有交換信息與保持同步的能力。有些程序只有??????? 在選Y的情況下才能運(yùn)行,所以不用考慮,這里一定要選。
???????? [*] POSIX Message Queues
?????????????????? 這是POSIX的消息隊(duì)列,它同樣是一種IPC。建議你最好將它選上
???????? [*] BSD Process Accounting ?????
這是允許用戶進(jìn)程訪問內(nèi)核,將賬戶信息寫入文件中。這通常被認(rèn)為是個(gè)好主意,建議你??????? 最好將它選上。將進(jìn)程的統(tǒng)計(jì)信息寫入文件的用戶級(jí)系統(tǒng)調(diào)用,主要包括進(jìn)程的創(chuàng)建時(shí)間/創(chuàng)建者/內(nèi)存占用等信息。
???????? [*]??BSD Process Accounting version 3 file format????
用的話統(tǒng)計(jì)信息將會(huì)以新的格式(V3)寫入,這格式包含進(jìn)程ID和父進(jìn)程。注意這個(gè)格式和以前的 v0/v1/v2 格式不兼容,所以你需要 升級(jí)相關(guān)工具來使用它。選不選均可。
???????? [*] Export task/processstatistics through netlink (EXPERIMENTAL)?
處于實(shí)驗(yàn)階段的功能。通過通用的網(wǎng)絡(luò)輸出工作/進(jìn)程的相應(yīng)數(shù)據(jù),和BSD不同的是,這些數(shù)據(jù)在進(jìn)程運(yùn)行的時(shí)候就可以通過相關(guān)命令訪問。和BSD類似,數(shù)據(jù)將在進(jìn)程結(jié)束時(shí)送入用戶空間。如果不清楚,選N。
通過netlink接口向用戶空間導(dǎo)出任務(wù)/進(jìn)程的統(tǒng)計(jì)信息,與BSD Process Accounting的不同之處在于這些統(tǒng)計(jì)信息在整個(gè)任務(wù)/進(jìn)程生存期都是可用的
???????? [*]??Enable per-task delay accounting (EXPERIMENTAL)?
?????????????????? 在統(tǒng)計(jì)信息中包含進(jìn)程等候系統(tǒng)資源(cpu,IO同步,內(nèi)存交換等)所花費(fèi)的時(shí)間
???????? [*]??Enable extended accounting over taskstats (EXPERIMENTAL)??
?????????????????? 在統(tǒng)計(jì)信息中包含擴(kuò)展進(jìn)程所花費(fèi)的時(shí)間
???????? [*]????Enable per-task storage I/O accounting (EXPERIMENTAL)??
?????????????????? 在統(tǒng)計(jì)信息中包含I/O存儲(chǔ)進(jìn)程所花的時(shí)間。
???????? -*- Auditing support?
審計(jì)支持,用于和內(nèi)核的某些子模塊同時(shí)工作,(例如SELinux)需要它,只有同時(shí)選擇其子項(xiàng)才能對(duì)系統(tǒng)調(diào)用進(jìn)行審計(jì)。允許審計(jì)的下層能夠被其他內(nèi)核子系統(tǒng)使用,比如SE-Linux,它需要這個(gè)來進(jìn)行登錄時(shí)的聲音和視頻輸出。
???????? [*]??Enable system-call auditing support
支持對(duì)系統(tǒng)調(diào)用的審計(jì)。允許系統(tǒng)獨(dú)立地或者通過其他內(nèi)核的子系統(tǒng),調(diào)用審計(jì)支持,比??????? 如SE-Linux。要使用這種審計(jì)的文件系統(tǒng)來查看特性,請(qǐng)確保 INOTIFY 已經(jīng)被設(shè)置。??????????????
RCU Subsystem? --->? 一個(gè)高性能的鎖機(jī)制RCU 子系統(tǒng)
RCU(Read-CopyUpdate),顧名思義為讀取-復(fù)制更新。對(duì)于被RCU保護(hù)的共享數(shù)據(jù)結(jié)構(gòu),讀者不需要獲得任何鎖就可以訪問它,但寫者在訪問它時(shí)首先拷貝一個(gè)副本,然后對(duì)副本進(jìn)行修改,最后使用一個(gè)回調(diào)(callback)機(jī)制在適當(dāng)?shù)臅r(shí)機(jī)把指向原來數(shù)據(jù)的指針重新指向新的被修改的數(shù)據(jù)。這個(gè)時(shí)機(jī)就是所有引用該數(shù)據(jù)的CPU都退出對(duì)共享數(shù)據(jù)的操作。
???????? IRQ subsystem? --->?????? //IRQ中斷子系統(tǒng)設(shè)置。
?????????????????? [*]Support sparse irq numbering???
??????????????????????????? 支持稀有終端編號(hào),不知道怎么用,默認(rèn)選中
???????? RCU Subsystem? ---> ???? //RCU子系統(tǒng)設(shè)置,非對(duì)稱讀寫鎖系統(tǒng)是一種新的kernel鎖機(jī)制,適用于讀多寫少環(huán)境
RCU (Read-Copy Update),顧名思義為讀取-復(fù)制更新。對(duì)于被RCU保 護(hù)的共享數(shù)據(jù)結(jié)構(gòu),讀者不需要獲得任何鎖就可以訪問它,但寫者在訪問它時(shí)首先拷貝一個(gè)副本,然后對(duì)副本進(jìn)行修改,最后使用一個(gè)回調(diào)(callback)機(jī) 制在適當(dāng)?shù)臅r(shí)機(jī)把指向原來數(shù)據(jù)的指針重新指向新的被修改的數(shù)據(jù)。這個(gè)時(shí)機(jī)就是所有引用該數(shù)據(jù)的CPU都退出對(duì)共享數(shù)據(jù)的操作。
?????????????????? RCU Implementation(Tree-based hierarchical RCU)?--->?
??????????????????????????? (X)UP-only small-memory-footprint RCU?
???????????????????????????????????? 小內(nèi)存的RCU。
?????????????????? [ ] Enable tracingfor RCU
???????????????????????????????????? 激活跟蹤,不選擇
???????? < > Kernel.config support????
這個(gè)選項(xiàng)允許.config文件(即編譯LINUX時(shí)的配置文件)保存在內(nèi)核當(dāng)中。它提供正在運(yùn)行中的或者還在硬盤中的內(nèi)核的相關(guān)配置選項(xiàng)。可以通過內(nèi)核鏡像文件 kernel image file 用命令script scripts/extract-ikconfig 來提取出來,作為當(dāng)前內(nèi)核重編譯或者另一個(gè)內(nèi)核編譯的參考。如果你的內(nèi)核在運(yùn)行中,可以通過/proc/config.gz文件來讀取。下一個(gè)選項(xiàng)提供這項(xiàng)支持。看起來好像是一個(gè)不錯(cuò)的功能,可以把編譯時(shí)的 .config文件保存在內(nèi)核中,以供今后參考調(diào)用。用來重編譯和編譯其他的內(nèi)核的時(shí)候可以用上。你是一個(gè)編譯內(nèi)核的狂人的話,這項(xiàng)要選上
???????? (17) Kernel logbuffer size (16 => 64KB, 17 => 128KB)??
內(nèi)核日志緩存的大小,12 => 4 KB,13 => 8KB,14 => 16 KB單處理器, 15 => 32 KB多處理器,16=> 64 KB for x86 NUMAQ or IA-64,17 =>128 KB for S/390???? ,保持默認(rèn)。
???????? -*- Control Groupsupport? --->
?????????????????? cgroup支持,如cpusets那樣來使用cgroup子系統(tǒng)進(jìn)程(不確定可以不選)????????????????
?