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