當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] Linux 2.6 內(nèi)核的配置系統(tǒng)由以下 3 個部分組成:> Makefile:分布在 Linux 內(nèi)核源代碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則> 配置文件 Kconfig:給用戶提供配置選擇的

 Linux 2.6 內(nèi)核的配置系統(tǒng)由以下 3 個部分組成:

> Makefile:分布在 Linux 內(nèi)核源代碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則

> 配置文件 Kconfig:給用戶提供配置選擇的功能

> 配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供字符界面和圖形界面)。這些配置工具都是使用腳本語言編寫的,如 Tcl/TK、perl 等。

在Linux 內(nèi)核中增加程序需要完成以下 3 項工作:

> 1. 將編寫的源代碼復(fù)制到 Linux 內(nèi)核源代碼的相應(yīng)目錄

> 2. 在目錄的Kconfig 文件中增加新源代碼對應(yīng)項目的編譯配置選項

> 3. 在目錄的 Makefile 文件中增加對新源代碼的編譯條目

1. 實例引導(dǎo):S3C2440 處理器的RTC 與 LED 驅(qū)動配置。

首先,在Linux/drivers/char 目錄中包含了 S3C2410 處理器的 RTC 設(shè)備驅(qū)動源代碼 s3c2410-rtc.c.而在該目錄的 Kconfig 文件中包含 S3C2410_RTC 的配置項目:config S3C2410_RTC bool "S3C2410 RTC Driver" depends on ARCH_S3C2410 help RTC (Realtime Clock)driver for the clock inbuilt into the Samsung S3C2410. This can provide periodic interrupt rates from 1Hz to 64Hz for user programs, and wakeup from Alarm.上述 Kconfig 文件的這段腳本意味著只有在 ARCH_S3C2410 項目被配置的情況下,才會出現(xiàn) S3C2410_RTC 配置項目,這個配置項目為布爾型(要么編譯入內(nèi)核,要么不編譯,選擇 "Y" 或 "N" ),菜單撒很難過顯示的字符串為 "S3C2410 RTC Driver","help" 后面的內(nèi)容為幫助信息。

除了布爾型的配置項目外,還存在一種三態(tài)型(tristate)配置選項,它意味著要么編譯入內(nèi)核,要么編譯為內(nèi)核模塊,選項為"Y"、"M“ 或"N".在目錄的Makefile 中關(guān)于 S3C2410_RTC 的編譯腳本為:obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o上述腳本意味著如果 S3C2410——RTC 配置選項背選擇為 "Y" 或 "M",即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-y 或 obj-m 時,則編譯 s3c2410-rtc.c,選擇 "Y" 的情況直接會將生成的目標代碼直接連接到內(nèi)核,為"M" 的情況則生成模塊 s3c2410-rtc.ko(由于 S3C2410_RTC 為布爾型,實際不會為"M");如果 S3C2410_RTC 配置選項將選擇為 "N",即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-n 時,則不編譯 s3c2410-rtc.c.一般而言,驅(qū)動工程師在內(nèi)核源代碼的 drviers 目錄的相應(yīng)子目錄中增加新設(shè)備驅(qū)動的源代碼,并增加或修改 Kconfig 配置腳本和Makefile 腳本,完全仿照上述過程執(zhí)行即可。

再如,為S3C2410 的LED 編寫了驅(qū)動,源代碼為 s3c2410-led.c,為使內(nèi)核能支持對該模塊的編譯配置,應(yīng)進行如下 3 項處理。

> 將編寫的 s3c2410-led.c 源代碼復(fù)制到 linux/drivers/char 目錄

> 在目錄的 Kconfig 文件中增加 LED 的編譯配置選項,如下所示:

config S3C2410_LED bool "S3C2410 LED Driver" depends on ARCH_S3C2410 help LED driver for the Samsung S3C2410.

> 在目錄的 Makefile 文件中增加對 s3c2410-led.c 源代碼的編譯,如下所示:

obj-$(CONFIG_S3C2410_LED) += s3c2410-led.o 2. Makefile下面對內(nèi)核源代碼各級子目錄中的 kbuild Makefile 進行介紹,這部分是內(nèi)核模塊或設(shè)備驅(qū)動的開發(fā)者最常接觸到的。

kbuild Makefile 的語法包括如下幾個方面。

(1)目標定義目標定義用來定義哪些內(nèi)容要作為模塊編譯,哪些要編譯并連接進內(nèi)核。

例如:obj-y += foo.o表示要由 foo.c 或者 foo.s 文件編譯得到 foo.o 并連接進內(nèi)核,而 obj-m 則表示該文件要作為模塊編譯。除了y、m 以外的 obj-x 形式的目標都不會被編譯。

而更常見的做法是根據(jù) .config 文件的 CONFIG 變量來決定文件的編譯方式,如下表示:obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o除了 obj- 形式的目標以外,還有 lib-y library庫、hostprogs-y 主機程序等目標,但是基本都應(yīng)用在特定的目錄和場合下。

(2)多文件模塊的定義如果一個模塊由多個文件組成,這時候應(yīng)采用模塊名加 -objs 后綴或者 -y 后綴的形式來定義模塊的組成文件。如下面的例子所示:obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o模塊的名字為 ext2,由 balloc.o 和 bitmap.o 兩個目標文件最終連接生成 ext2.o 直至 ext2.ko 文件,是否包括 xattr.o 取決于內(nèi)核配置文件的配置情況。如果 CONFIG_EXT2_FS 的值是 y 也沒有關(guān)系,在此過程中生成的 ext2.o 將被連接進 built-in.o 最終連接進內(nèi)核。這里需要注意的一點是,該 kbuild Makefile 所在的目錄中不能再包含和模塊名相同的源文件和 ext2.c/ext2.s.或者寫如 -objs 的形式:obj-$(CONFIG_ISDN) +=isdn.o isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o(3)目錄層次的迭代示例:obj-$(CONFIG_EXT2_FS) += ext2/當(dāng) CONFIG_EXT2_FS 的值為 y 或 m時,kbuild 將會把 ext2 目錄列入向下迭代的目標中,具體 ext2 目錄下的文件是要作為模塊編譯還是鏈入內(nèi)核由 ext2 目錄下的 Makefile 文件的內(nèi)容決定。

3. Kconfig(1)菜單入口大多數(shù)的內(nèi)核配置選項都對應(yīng) Kconfig 中的一個菜單入口,如下所示:config MODVERSIONS bool "Set version information on all module symbols" depends on MODULES help Usually, modules have to be recompiled whenever you switch to a new kernel……

"config" 關(guān)鍵字定義新的配置選項,之后的幾行定義了該配置選項的屬性。配置選項的屬性包括類型、數(shù)據(jù)范圍、輸入提示、依賴關(guān)系(及反向依賴關(guān)系)、幫助信息和默認值等。

每個配置選項都必須制定類型,類型包括bool、tristate、string、hex 和 int,其中 tristate 和string 是兩種基本的類型,其他類型都基于這兩種基本類型。類型定義后可以緊跟輸入提示,下面的兩段腳本是等價的。[!--empirenews.page--]

腳本1: bool "Networking support"腳本2: bool prompt "Networking support"輸入提示的一般格式的如下所示:prompt [if ]其中可選的 if 用來表示該提示的依賴關(guān)系。

默認值的格式如下所示: default [if ]一般配置選項可以存在任意多個默認值,這種情況下,只有第一個被定義的值是可用的。如果用戶不設(shè)置對應(yīng)的選項,配置選項的值就是默認值。

依賴關(guān)系的格式如下所示:depends on (或者 requires) 如果定義了多個依賴關(guān)系,他們之間用 “&&”間隔。依賴關(guān)系也可以應(yīng)用到該菜單中所有的其他選項中(這些選項同樣可接受 if 表達式),下面的兩端段腳本是等價的。

腳本1: bool "foo" if BAR default y if BAR腳本2: depends on BAR bool "foo" default y反向依賴關(guān)系的格式如下所示:select [if ] depends能限定一個 symbol 的上限,即如果 A 依賴于 B,則在 B 被配置為 "Y" 的情況下,A 可以為“Y"、"M" 和"N";在 B 被配置為 ”M" 情況下,A 可以被配置為"M" 或 "N";B 在被配置為 "N" 的情況下,A 只能為 “N". select 能限定一個 symbol 的下限,若 A 反向依賴于 B,則 A 的配置值會高于或等于 B(正好與 depends)。如果 symbol 反向依賴于多個對象,則它的下陷是這些對象的最大值。

kbuild Makefile 中的 expr (表達式) 定義如下所示: ::= '=' '!=' ' ( ' ' ) ' ' ! ' '&&' ' || ' 也就是說 expr 是由 symbol 、兩個 symbol 相等、兩個symbol 不等以及 expr 的賦值、非、與、或運算構(gòu)成。而 symbol 分為兩類,一類是由菜單入口定義配置選項定義的非常數(shù) symbol,另一類是作為 expr 組成部分的常數(shù) symbol.數(shù)據(jù)范圍的格式如下:rang [if ]為 int 和 hex 類型的選項設(shè)置可以接受的輸入值范圍,用戶只能輸入大于等于第一個 symbol,小于等于第二個 symbol 的值。

幫助信息的格式如下: help(或 ——help——)

開始……

結(jié)束幫助信息完全靠文本縮進識別結(jié)束。"——help——" 和 "help" 在作用上沒有區(qū)別,設(shè)計"——help——" 的初衷在于將文件中的配置邏輯與給開發(fā)人員的提示分開。

menuconfig 關(guān)鍵字的作用與 config 類似,但它在 config 的基礎(chǔ)上要求所有的子選項作為獨立的行顯示。

(2)菜單結(jié)構(gòu)菜單入口在菜單樹結(jié)構(gòu)中的位置可由兩種方法決定。第一種方式如下所示:menu "Networking device support" depends on NET config NETDEVICES……

endmenu所有處于"menu" 和 "endmenu" 之間的菜單入口都會成為 "Network device support" 的子菜單。而且,所有子菜單選項都會繼承父菜單的依賴關(guān)系,比如," Network device support" 對 "Net" 的依賴被加到了配置選項 NETDEVICES 的依賴列表中。

另一種方式是通過分析依賴關(guān)系生成菜單結(jié)構(gòu)。如果菜單選項在一定程度上依賴于前面的選項,它就恩能能成為該選項的子菜單。如果父選項為 "N",則子選項不可見;如果父選項為 "Y" 或 "M" ,則子選項可見,例如:config MODULES bool "Enable loadable module support" config MODVERSIONS bool "Set version information on all module symbols" depends on MODULES comment "module support disabled" depends on !MODULES MODVERSIONS 直接依賴 MODULES,如果 MODULES 不為 “N",該選項才可見。

除此之外,Kconfig 中還可能使用 “choices……endchoice"、"comment"、"if …… endif" 這樣的語法結(jié)構(gòu)。其中 "choices …… endchoice” 的結(jié)構(gòu)如下所示:choice endchoice它定義一個選擇群,其接受的選項(chioce options)可以是前面描述的任何屬性。在一個硬件有多個驅(qū)動的情況下使用,使用選擇可以實現(xiàn)最終只有一個驅(qū)動被編譯進內(nèi)核或模塊。選擇群還可以接受的另一個選項是“optional”,這樣菜單入口就被設(shè)置為 "N",沒有被選中。

4. 應(yīng)用實例:在內(nèi)核中新增加驅(qū)動代碼目錄和子目錄假設(shè)要在內(nèi)核源代碼 drivers 目錄下為 arm 體系結(jié)構(gòu)新增如下用于 test driver 的樹型目錄:|——test |——cpu |——cpu.c |——test.c |——test_client.c |——test_ioctl.c |——test_proc.c |——test_queue.c在內(nèi)核中增加目錄和子目錄,我們需為相應(yīng)的新增目錄創(chuàng)建 Kconfig 和 Makefile 文件,而新增目錄的父目錄中的 Kconfig 和 Makefile 文件愛也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用。

在新增的 test 目錄下,應(yīng)該包含如下 Kconfig 文件:# #Test driver configuration # menu "TEST Driver" comment " TEST Driver" config CONFIG_TEST bool "TEST support" config CONFIG_TEST_USER tristate "TEST user-space interface" depends on CONFIG_TEST endmenu由于 TEST_driver 對于內(nèi)核來說是新的功能,所以首先需要創(chuàng)建一個菜單 TEST Driver;然后顯示" TEST support",等待用戶選擇;接下來判斷用戶是否選擇了 TEST Driver,如果是(CONFIG_TEST=y),則進一步顯示子功能:用戶接口與CPU 功能:用戶接口與CPU 功能支持;由于用戶接口功能可以被編譯成內(nèi)核模塊,所以這里的詢問語句使用了 tristate.為了使這個 Kconfig 文件能起作用,需要修改 arch/arm/Kconfig 文件,增加以下內(nèi)容:source "driver/test/Kconfig"腳本中的 source 意味著引用新的 Kconfig 文件。[!--empirenews.page--]

在新增的 test 目錄下,應(yīng)該包含如下 Makefile 文件:#drivers/test/Makefile # Makefile for the TEST # 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 obj-¥(CONFIG_TEST_CPU) +=cpu/該腳本根據(jù)配置變量的取值構(gòu)建 obj-* 列表。由于 test 目錄中包含一個子目錄 cpu,當(dāng) CONFIG_TEST_CPU=y 時,需要將 cpu 目錄加入列表。

test 目錄中 cpu 子目錄也需要包含如下的 Makefile 文件:#drivers/test/test/Makefile #Makefile for the TEST CPU obj-$(CONFIG_TEST_CPU) +=cpu.o為了使得整個 test 目錄能夠被編譯命令作用到,test 目錄父目錄中的 Makefile 文件也需要新增如下腳本:obj-$(CONFIG_TEST) +=test/在 drivers/Makefile 中加入 obj-$(CONFIG_TEST) +=test/,使得用戶在進行內(nèi)核編譯時能夠進入 test 目錄。

增加了 Kconfig 和 Makefile 文件之后的新的 test 樹型目錄如下所示:|——test |——cpu |——cpu.c |——test.c |——test_client.c |——test_ioctl.c |——test_proc.c |——test_queue.c |——Makefile |——Kconfig

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉