Building Linux Kernel
Outline Linux 核心程式碼的目錄結構及各目錄的相關內容 Linux 核心各設定選項內容和作用 Linux 核心設定檔 config.in 的作用 Linux 核心的編譯過程 將新增核心程式加入到 Linux 核心結構中的方法
核心程式碼目錄介紹 (1) arch:arch 子目錄包括所有與體系結構相關的核心程式 arch 的每一個子目錄都代表一個 Linux 所支援的體系結構 例如 :arm 目錄下就是 arm 體系架構的處理器目錄, 包含我們使用的 PXA 處理器 include:include 子目錄包括編譯核心所需要的標頭檔 與 ARM 相關的標頭檔在 include/asm-arm 子目錄下 init: 這個目錄包含核心的初始化程式, 但不是系統的引導程式, 其中所包含 main.c 和 Version.c 檔是研究 Linux 核心的起點 mm: 該目錄包含所有獨立於 CPU 體系結構的記憶體管理程式, 如頁式儲存管理記憶體的分配和釋放等 與 ARM 體系結構相關的程式在 arch/arm/mm 中 Kernel: 這裡包括主要的核心程式, 此目錄下的檔實現大多數 Linux 的核心函數, 其中最重要的檔案是 sched.c 與 Xscale 體系結構相關的程式在 arch/arm-pxa/kernel 目錄中
核心程式碼目錄介紹 (2) Drives: 此目錄存放系統所有的設備驅動程式, 每種驅動程式各占一個子目錄 /block: 區塊設備驅動程式 區塊設備包括 IDE 和 scsi 設備 /char: 字元設備驅動程式 如串列埠 滑鼠等 /cdrom: 包含 Linux 所有的 CD-ROM 程式 /pci:pci 卡驅動程式程式, 包含 PCI 子系統映射和初始化程式等 /scsi: 包含所有的 SCSI 程式以及 Linux 所支援的所有的 SCSI 設備驅動程式程式 /net: 網路設備驅動程式 /sound: 音效卡設備驅動程式 lib 目錄放置核心的函式庫程式 ; net 目錄包含核心與網路的相關的程式 ; ipc 目錄包含核心行程通訊的程式 ; fs 目錄是所有的檔案系統程式和各種類型的檔案操作程式, 它的每一個子目錄支援一個檔案系統, 如 JFFS2; scripts 目錄包含用於設定核心的腳本檔案等 每個目錄下一般都有 depend 檔和一個 makefile 檔, 他們是編譯時使用的輔助檔, 仔細閱讀這兩個檔案對弄清各個檔案之間的相互依託關係很有幫助
核心的設定的基本結構 Makefile: 分佈在 Linux 核心程式中的 Makefile, 定義 Linux 核心的編譯規則 ; 頂層 Makefile 是整個核心設定 編譯的整體控制檔案 ; 設定檔 (config.in): 給使用者提供設定選擇的功能 ;.config: 核心設定檔, 包括由使用者選擇的設定選項, 用來存放核心設定後的結果 ; 設定工具 : 包括對設定腳本中使用的設定命令進行解釋的設定命令解釋器和設定使用者介面 ( 基於字元介面 :make config; 基於 Ncurses 圖形介面 :make menuconfig; 基於 xwindows 圖形介面 :make xconfig) Rules.make: 規則檔, 被所有的 Makefile 使用
編譯規則 Makefile 利用 make menuconfig( 或 make config make xconfig) 對 linux 核心進行設定後, 系統將產生設定檔 (.config) 在編譯時, 頂層 Makefile 將讀取.config 中的設定選擇 頂層 Makefile 完成產生核心檔 (vmlinux ) 和核心模組 (module) 兩個任務, 為了達到此目的, 頂層 Makefile 遞迴進入到核心的各個子目錄中, 分別調用位於這些子目錄中的 Makefile, 然後進行編譯 至於到底進入哪些子目錄, 取決於核心的設定 頂層 Makefile 中的 include arch/$(arch)/makefile 指定特定 CPU 體系結構下的 Makefile, 這個 Makefile 包含了特定平台相關的資訊
設定檔 config.in Linux 所有選項設定都需要在 config.in 檔中用設定語言來編寫設定腳本, 然後頂層 Makefile 調用 scripts/configure, 按照 arch/arm/config.in 來進行設定 命令執行完後產生儲存有設定資訊的設定檔 (.config) 下一次再做 make config 時將產生新的.config 檔案, 原.config 被改名為.config.old
編譯核心的常用命令 Make config: 核心設定, 調用./scripts/Configure 按照 arch/i386/config.in 來進行設定 命令執行後產生檔.config, 其中儲存著設定資訊 下次在做 make config 時將產生新的.config 檔案, 原檔案 config 更名為 config.old make dep: 尋找依存關係 產生兩個檔. depend 和.hdepend, 其中.hdepend 表示每個.h 檔都包含其他哪些嵌入檔 而.depend 檔有多個, 在每個會產生目標檔 (.o) 檔的目錄下均有, 它表示每個目標檔都依賴於哪些嵌入檔 (.h) make clean: 清除以前建構核心所產生的所有的目標檔, 模組檔, 核心以及一些暫存檔案等, 不產生任何檔 make rmproper: 刪除所有以前在建構核心過程所產生的所有檔, 及除了做 make clean 外, 還要刪除.config,.depend 等檔, 把核心程式恢復到最原始的狀態 下次建構核心時必須進行重新設定 ; make, make zimage, make bzimage: make: 建構核心 通過各目錄的 Makefile 檔進行, 會在各個目錄下產生一大堆目標檔, 如核心程式沒有錯誤, 將產生檔 vmlinux, 這就是所建構的核心 並產生映射檔 system.map 通過各目錄的 makefile 檔進行.version 檔中的數加 1, 表示版本號的變化 make zimage: 在 make 的基礎上產生壓縮的核心映射檔./arch/$(ARCH)/boot/zImage 以及./arch/$(ARCH)/boot/compressed 目錄下產生一些暫存檔案 make bzimage: 在 make 的基礎上產生壓縮比例更大的的核心映射檔./arch/$(ARCH)/boot/bzImage 以及./arch/$(ARCH)/boot/compressed 目錄下產生一些暫存檔案 在核心太大時進行
核心編譯過程 make mrproper: 刪除所有以前在構核過程所產生的所有檔 make menuconfig: 核心設定 make dep: 尋找依存關係 make zimage: 產生壓縮的核心映射檔 核心編譯完畢之後, 產生 zimage 核心映像檔儲存在程式碼的 arch/arm/boot/ 目錄下
Main Menu
Code maturity level options
System Type
General setup
Memory Technology Devices (MTD)
RAM/ROM/Flash chip drivers
Mapping drivers for chip access
Block devices
Networking options
Network device support
Character devices
File systems
Frame-buffer support
新增驅動程式到 linux 核心 假設將 xsbase 驅動儲存到 linux 程式碼的 drivers/xsbase/ 目錄下 : $ cd drivers/xsbase $ tree. -- Config.in -- Makefile -- test.c `-- test_client.c
編輯設定檔 # # XSBASE driver configuration # mainmenu_option next_comment comment XSBASE Driver' bool 'XSBASE support' CONFIG_XSBASE if [ "$CONFIG_XSBASE" = "y" ]; then tristate 'TEST user-space interface' CONFIG_TEST_USER bool 'TEST CPU ' CONFIG_TEST_CPU fi endmenu
Sound
New Driver
編輯修改 CPU 體系目錄下的設定檔 在 arch/arm/config.in 檔進行修改, 在檔案最後加入 :source drivers/xsbase/config.in
Makefile 的修改與編輯 編輯 xsbase 目錄下的設定檔 Makefile 檔 # drivers/xsbase/makefile # # Makefile for the XSBASE TEST. # L_TARGET := test.o export-objs := test.o obj-$(config_test) += test.o include $(TOPDIR)/Rules.make clean: rm -f *.[oa].*.flags
Makefile 的修改與編輯 編輯 drivers/makefile subdir-$(config_mmc) subdir-$(config_xsbase) include $(TOPDIR)/Rules.make += mmc += xsbase
Makefile 的修改與編輯 編輯 Makefile DRIVERS-$(CONFIG_PLD) += drivers/pld/pld.o DRIVERS-$(CONFIG_MMC) += drivers/mmc/mmcdrivers.o DRIVERS-$(CONFIG_XSBASE) += drivers/xsbase/test.o DRIVERS := $(DRIVERS-y)
Driver Testing Use arm-linux-gcc c o test_client test_client.c to compile test program. Copy test_client and test.o to PXA270 by nfs. Create device node mknode /dev/xsb_edr_8led c 60 1 Insert module insmod test.o Run application./test_client