Linux內核kernel配置2—教你將自己開發的代碼加入linux內核中

上一章節已經講了makefile、menuconfig、xconfig,本章節給大家精講一個實例(如果沒有看過上章節的建議先進主頁學習):

<code>說明:
哪位朋友需要完整電子檔的在評論區給我說下,本人有時間了一一私發給大家O(∩_∩)O
本人近期會陸續上傳這些資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。/<code>


Linux內核kernel配置2—教你將自己開發的代碼加入linux內核中

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 內

核的配置中。

Linux內核kernel配置2—教你將自己開發的代碼加入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 中。

Linux內核kernel配置2—教你將自己開發的代碼加入linux內核中


分享到:


相關文章: