《linux裝置驅動開發》,基於最新的linux 4.0核心-----筆記
第二章 Linux 的核心結構及構建
- ---->這一章是自己總結的
1、核心結構(主要是下面這幾個部分)
- 系統呼叫介面<–>System call interface
- 程序管理<------>Process management
- 記憶體管理<------>Memory management
- 虛擬檔案系統<–>VFS
- 網路裝置<------>Net
- 程序間通訊<---->IPC
- 裝置驅動<------>Drivers
- -------->具體對應的目錄見書上59頁
2、Makefiles and build system of kernel–kbuild
2.1 makefile包含五大部分
-
The top Makefile
:核心原始碼根目錄下的Makefile,所有核心程式碼編譯的入口。它負責兩類東西的編譯:vmlinux
:核心映像,Image->zImage -> boot.img,img是核心的常住居民。隨系統啟動而執行,直到系統關機。modules
:核心模組 xxx.ko,這種形式,也是核心原始碼的一種二進位制形式,從本質上來說和核心映像是一樣。但是ko是以普通檔案的形式存在的,不隨系統啟動而執行,在系統需要你的時候 insmod xxx.ko,不需要你的時候就rmmod xxx.ko.如: camera.ko,ko形式多見於外設驅動它遞迴進入到核心原始碼樹子目錄去構建這些目標,應該至少包含一個arch的makefile和一個arch/$(ARCH)/Makefile(跟具體硬體平臺相關)
-
.config
:核心原始碼根目錄下,核心編譯的配置檔案,該檔案直接決定哪些檔案編譯、怎麼編譯,核心配置檔案包含像下面這些選項:- CONFIG_EXPERIMENTAL=y
- CONFIG_BROKEN_ON_SMP=y
- CONFIG_INIT_ENV_ARG_LIMIT=32
- CONFIG_CROSS_COMPILE=“arm-linux-”
-
arch/$(ARCH)/Makefile
:體系結構相關的Makefile,決定底層CPU相關的原始碼如何編譯。為top Makefile提供具體硬體體系結構相關的資訊。 -
scripts/Makefile.*
:包含了一些通用的Makefile模式,函式,指令碼等等。供其他Makefile包含 -
kbuild Makefiles
_:每個子目錄有一個kubild makefile,決定哪些檔案編譯到vmlinux(built-in),哪些編成在ko,kbuild(核心編譯系統)內建了幾個變數-
obj-y
: 這個變數指定的.o檔案列表,最終編譯到vmlinux中去
obj-y := a.o b.o c.o
a-y = 1.o 2.o- 1.o <- 1.c,2.o < 2.c
->a.o - b.o <- b.c,c.o <- c.c
=> vmlinux -> … -> boot.img
- 1.o <- 1.c,2.o < 2.c
-
obj-m
:obj-m這個變數指定的.o檔案列表,kbuild最終會為每個.o生成一個同名的ko檔案- obj-m := a.o b.o,a.o -> a.ko,b.o -> b.ko
-
語法:
目標名-y/目標名-objs
:生成"目標名"所依賴的.o檔案列表-
obj-m := a.o b.o
- a.c(a.s) ->a.o -> a.ko
- b.c(b.s) ->b.o -> b.ko
-
obj-m := sb.o nb.o
-
sb-y := a.o b.o c.o
- a.o <- a.c(a.s)
- b.o <- b.c(b.s)
- c.o <- c.c(c.s)
- =>sb.o -> sb.ko
- nb.c(nb.s) -> nb.o -> nb.ko
-
obj-$(CONFIG_XXX) += sb.o
-
kbuild只認 obj-y obj-m
-
sb.o編還是不編,得看變數CONFIG_XXX的值
-
if CONFIG_XXX = y sb.o編,而且編進vmlinux
-
if CONFIG_XXX = m sb.o編成sb.ko
-
else other , 不編
obj-m += camera.o camera-objs += a.o b.o camera-$(CONFIG_MEIYANG) += mei.o
-
-
obj-$(CONFIG_XXX) += xxx/
- 表示你如果選擇了CONFIG_XXX請到子目錄xxx下面去讀Makefile
-
-
2.2 核心編譯的兩大步驟
- 1、配置
make menuconfig
:=> 生成一個人性化的配置選單樹(供你選擇)- sudo apt-get install libncurses5-dev
- 目的是生成一個 .config (配置檔案,決定哪些檔案編譯,哪些不編譯)
- CONFIG_FOO = y
- CONFIG_MM = m
- CONFIG_XX = n
- 2、編譯 make(sudo ./mk -k)
- a. 先讀.config裡面的內容,把相應的變數值替換到Makefile中去
- obj-$(CONFIG_FOO) += foo.o
- obj-$(CONFIG_MM) += mm.o
- obj-$(CONFIG_XX) += xx.o
- ----->
- obj-y += foo.o
- obj-m += mm.o
- obj-n += xx.o
- b. 編譯
- foo.o -> foo.o -> vmlinux
- mm.c -> mm.o -> mm.ko
- a. 先讀.config裡面的內容,把相應的變數值替換到Makefile中去
- 3、一個例子
- 先準備好下面的檔案:my_char_drivers/hello.c,Kconfig,Makefile
- (1) 把my_char_drivers整個目錄拷貝到 核心原始碼目錄的 drivers/char
- (2) 修改 drivers/char/Kconfig 增加一行,讓其包含my_char_drivers/Kconfig
- vim dirvers/char/Kconfig 增加一行
- source “drivers/char/my_char_drivers/Kconfig”
- (3) 修改 drivers/char/Makefile 增加一行,讓其包含my_char_drivers/Makefile
- vim drivers/char/Makefile 增加-行
- obj-$(CONFIG_zhoulong_drivers) += my_char_drivers/
2.3 .config的內容
- Kconfig
- Kconfig是作為.config的配置檔案
- 內容是用kconfig特有的語言編寫
- 配置資訊的資料庫是一個配置選項的集合
- Kconfig 語法
- config
- config <symbol>
- <config options>
-
關鍵字config開始一個新的配置入口,緊接著的一行是上一個選項的屬性,舉例:
config FOO tristate prompt "a test" depends on BAR default m help "a example for config entry"
-
- menuconfig
- menuconfig <symbol>
- <config options>
- menu/endmenu
- menu “some prompt info”
- <menu options>
- <menu block>
- endmenu
- if/endif
- if <expr>
- endif
- source
- source “xxx/xxx/Kconfig”
- choice/endchoice
- choice [symbol]
- <choice options>
- <choice block>
- endchoice
- 一個選擇只能是一個布林值或三態,布林選項只允許單個配置選項被選中,但是三態選擇還允許將任意數量的配置項設定為“m”。
- 這個可以用在如果一個硬體有多個驅動程式存在並且只有一個驅動程式可以編譯進核心,但是所有的驅動程式可以編譯成模組
- comment
- comment “some prompt info”
- <comment options>
- 這定義了一個註釋,它在配置過程中顯示給使用者,並且也與輸出到輸出檔案。唯一可能的選項是依賴項。
- config