上一章節已經講了makefile、menuconfig、xconfig,本章節給大家精講一個實例(如果沒有看過上章節的建議先進主頁學習):
<code>說明:
哪位朋友需要完整電子檔的在評論區給我說下,本人有時間了一一私發給大家O(∩_∩)O
本人近期會陸續上傳這些資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。/<code>
4. 實例講解
對於一個開發者來說,將自己開發的內核代碼加入到 Linux 內核中,需要有三個步驟。首先確定把
自己開發代碼放入到內核的位置;其次,把自己開發的功能增加到 Linux 內核的配置選項中,使用
戶能夠選擇此功能;最後,構建子目錄 Makefile,根據用戶的選擇,將相應的代碼編譯到最終生成
的 Linux 內核中去。下面,我們就通過一個簡單的例子--test driver,結合前面學到的知識,來說明
如何向 Linux 內核中增加新的功能。
4.1 目錄結構
test driver 放置在 drivers/test/ 目錄下:
$cd drivers/test
$tree
.
|-- Config.in
|-- Makefile
|-- cpu
| |-- Makefile
| `-- cpu.c
|-- test.c
|-- test_client.c
|-- test_ioctl.c
|-- test_proc.c
|-- test_queue.c
`-- test
|-- Makefile
`-- test.c
4.2 配置文件
1) drivers/test/Config.in
#
# TEST driver configuration
#
mainmenu_option next_comment
comment 'TEST Driver'
bool 'TEST support' CONFIG_TEST
if [ "$CONFIG_TEST" = "y" ]; then
tristate 'TEST user-space interface' CONFIG_TEST_USER
bool 'TEST CPU ' CONFIG_TEST_CPU
fi
endmenu
由於 test driver 對於內核來說是新的功能,所以首先 創建一個菜單 TEST Driver。然後,顯示
"TEST support",等待用戶選擇;接下來判斷用戶是否選擇了 TEST Driver,如果是
(CONFIG_TEST=y),則進一步顯示子功能:用戶接口與 CPU 功能支持;由於用戶接口功能可
以被編譯成內核模塊,所以這裡的詢問語句使用了 tristate(因為 tristate 的取值範圍包括 y、n 和
m,m 就是對應著模塊)。
2) arch/arm/config.in
在文件的最後加入:source drivers/test/Config.in,將 TEST Driver 子功能的配置納入到 Linux 內
核的配置中。
4.3 Makefile
1)drivers/test/Makefile
# drivers/test/Makefile
#
# Makefile for the TEST.
#
SUB_DIRS :=
MOD_SUB_DIRS := $(SUB_DIRS)
ALL_SUB_DIRS := $(SUB_DIRS) cpu
L_TARGET := test.a
export-objs := test.o test_client.o
obj-$(CONFIG_TEST) += test.o test_queue.o test_client.o
obj-$(CONFIG_TEST_USER) += test_ioctl.o
obj-$(CONFIG_PROC_FS) += test_proc.o
subdir-$(CONFIG_TEST_CPU) += cpu
include $(TOPDIR)/Rules.make
clean:
for dir in $(ALL_SUB_DIRS); do make -C $$dir clean; done
rm -f *.[oa] .*.flags
drivers/test 目錄下最終生成的目標文件是 test.a。在 test.c 和 test-client.c 中使用了
EXPORT_SYMBOL 輸出符號,所以 test.o 和 test-client.o 位於 export-objs 列表中。然後,根據
用戶的選擇(具體來說,就是配置變量的取值),構建各自對應的 obj-* 列表。由於 TEST Driver
中包一個子目錄 cpu,當 CONFIG_TEST_CPU=y(即用戶選擇了此功能)時,需要將 cpu 目錄
加入到 subdir-y 列表中。
2)drivers/test/cpu/Makefile
# drivers/test/test/Makefile
#
# Makefile for the TEST CPU
#
SUB_DIRS :=
MOD_SUB_DIRS := $(SUB_DIRS)
ALL_SUB_DIRS := $(SUB_DIRS)
Linux內核配置系統淺析
頁碼,10/12
http://www-900.cn.ibm.com/developerWorks/cn/linux/kernel/l-kerconf/...
2004-7-17L_TARGET := test_cpu.a
obj-$(CONFIG_test_CPU) += cpu.o
include $(TOPDIR)/Rules.make
clean:
rm -f *.[oa] .*.flags
3)drivers/Makefile
……
subdir-$(CONFIG_TEST)
+= test
……
include $(TOPDIR)/Rules.make
在 drivers/Makefile 中加入 subdir-$(CONFIG_TEST)+= test,使得在用戶選擇 TEST Driver 功能
後,內核編譯時能夠進入 test 目錄。
4)Makefile
……
DRIVERS-$(CONFIG_PLD) += drivers/pld/pld.o
DRIVERS-$(CONFIG_TEST) += drivers/test/test.a
DRIVERS-$(CONFIG_TEST_CPU) += drivers/test/cpu/test_cpu.a
DRIVERS := $(DRIVERS-y)
……
在頂層 Makefile 中加入 DRIVERS-$(CONFIG_TEST) += drivers/test/test.a 和 DRIVERS-
$(CONFIG_TEST_CPU) += drivers/test/cpu/test_cpu.a。如何用戶選擇了 TEST Driver,那麼
CONFIG_TEST 和 CONFIG_TEST_CPU 都是 y,test.a 和 test_cpu.a 就都位於 DRIVERS-y 列
表中,然後又被放置在 DRIVERS 列表中。在前面曾經提到過,Linux 內核文件 vmlinux 的組成中
包括 DRIVERS,所以 test.a 和 test_cpu.a 最終可被鏈接到 vmlinux 中。
閱讀更多 IT百科 的文章