自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

同驅(qū)動(dòng)編譯相關(guān)的三類文件:Makefile、Config和Kconfig

原創(chuàng) 精選
開(kāi)發(fā) 開(kāi)發(fā)工具
在本文中,我將主要說(shuō)明該如何修改與驅(qū)動(dòng)編譯相關(guān)的三類文件Makefile、Config和Kconfig,并簡(jiǎn)要闡述這三者的關(guān)系。

作者 |趙青窕

審校 |孫淑娟

在驅(qū)動(dòng)開(kāi)發(fā)時(shí),有時(shí)候讓我們最頭疼的不是驅(qū)動(dòng)代碼的編寫,反而是代碼的編譯。目前有不少同事向我反饋,已經(jīng)修改了對(duì)應(yīng)的Config和Makefile文件,但驅(qū)動(dòng)仍無(wú)法被正常編譯到,這種問(wèn)題經(jīng)排查是因?yàn)闆](méi)有修改對(duì)應(yīng)的Kconfig而導(dǎo)致的。

在本文中,我將主要說(shuō)明該如何修改與驅(qū)動(dòng)編譯相關(guān)的三類文件Makefile,Config和Kconfig,并簡(jiǎn)要闡述這三者的關(guān)系。

1.如何修改這三類文件從而編譯我們的驅(qū)動(dòng)

制作文件

我們可以通過(guò)Makefile文件,來(lái)編寫驅(qū)動(dòng)編譯的規(guī)則。下面是四種常見(jiàn)的較為簡(jiǎn)單的編譯規(guī)則,此處假如我們的驅(qū)動(dòng)文件是test.c,且默認(rèn)已正常包含需要的庫(kù),頭文件等,僅在此處說(shuō)明Makefile與config和Kconfig的關(guān)系,不過(guò)多說(shuō)明Makefile更多細(xì)節(jié):

  • obj –y += test.o
  • obj-n += test.o
  • obj-m += test.o
  • obj-($CONFIG_TEST) += test.o

obj-y表示需要把test.c編譯進(jìn)內(nèi)核,當(dāng)我們不知道如何配置config和Kconfig,或者是配置后但驅(qū)動(dòng)仍無(wú)法編譯到,就可以采用這種配置方式。這種方式的好處就是僅僅在Makefile中編寫規(guī)則,且Makefile能被編譯系統(tǒng)加載到,其對(duì)應(yīng)的驅(qū)動(dòng)不再受config和Kconfig約束,就可以被編譯進(jìn)內(nèi)核。

obj-n表示默認(rèn)不編譯,該配置幾乎用不到,畢竟一般情況下,我們不會(huì)寫一個(gè)不進(jìn)行編譯的代碼。但當(dāng)多項(xiàng)目,或者多平臺(tái)復(fù)用代碼時(shí),可能會(huì)根據(jù)項(xiàng)目或者平臺(tái)來(lái)進(jìn)行選擇項(xiàng)的編譯,此時(shí)不需要編譯的代碼就可以采用obj-n的方式來(lái)進(jìn)行配置。

obj-m表示默認(rèn)編譯為模塊,需要注意當(dāng)執(zhí)行make模塊時(shí)才會(huì)被編譯。當(dāng)發(fā)現(xiàn)驅(qū)動(dòng)沒(méi)有進(jìn)行編譯時(shí),可以查看是否是采用obj-m,且是以執(zhí)行make模塊的方式進(jìn)行編譯的。

obj-($CONFIG_TEST),我把該方式稱之為條件編譯,根據(jù)CONFIG_TEST的配置來(lái)進(jìn)行編譯,我們可以在項(xiàng)目對(duì)應(yīng)的config中配置CONFIG_TEST為m,y或者n,從而obj-($CONFIG_TEST)可變?yōu)閛bj-m,obj-y,obj-n。通常情況下,均采用obj-($CONFIG_TEST) += test.o的方式進(jìn)行配置。

配置

實(shí)際上config文件分為兩大類,此處我以kernel-4.19,arm平臺(tái)為例來(lái)說(shuō)明,其中一類是位于kernel-4.19/arch/arm/configs,另一類是一個(gè)隱藏文件,位于kernel-4.19/.config路徑下,這兩類文件格式相同,如下圖所示:

圖片

從上圖可以看出,該類文件就是定義了一些配置項(xiàng),在Makefile小節(jié)說(shuō)到的CONFIG_TEST就是需要在config文件中進(jìn)行配置,當(dāng)采用文件kernel-4.19/arch/arm/configs進(jìn)行配置時(shí),比較簡(jiǎn)單,直接打開(kāi)對(duì)應(yīng)的config文件,增加CONFIG_TEST=(y/n/m)即可。當(dāng)采用kernel-4.19/.config配置時(shí),建議不要直接修改.config文件,可以采用make menuconfig的方式來(lái)進(jìn)行配置,該命令將在后面的小節(jié)中進(jìn)行描述。

在Linux內(nèi)核編譯時(shí),是根據(jù).config文件,結(jié)合Makefile進(jìn)行驅(qū)動(dòng)編譯的,kernel-4.19/arch/arm/configs會(huì)通過(guò)其相應(yīng)的make命令生成對(duì)應(yīng)的.config。此時(shí)設(shè)想一下,假如我們的kernel-4.19/arch/arm/configs和.config都配置了CONFIG_TEST,那最后CONFIG_TEST是采用哪種配置呢?實(shí)際上kernel-4.19/arch/arm/configs下的配置會(huì)覆蓋.config中的配置,因此我個(gè)人喜歡直接修改kernel-4.19/arch/arm/configs。但當(dāng)kernel-4.19/arch/arm/configs中沒(méi)有配置CONFIG_TEST時(shí),.config中會(huì)采用Kconfig中配置的CONFIG_TEST作為默認(rèn)值。

Kconfig

此處仍以CONFIG_TEST為例來(lái)說(shuō)明,Kconfig共有兩處需要修改,其一是該test.c對(duì)應(yīng)的Kconfig文件,其二是要包含該Kconfig文件。

下面是對(duì)應(yīng)的Kconfig配置方式,其中第一行中的config TEST與config中CONFIG_TEST是對(duì)應(yīng)的,注意在Kconfig中需要去掉CONFIG,僅僅配置為TEST;第二行中的tristate表示該項(xiàng)是否編進(jìn)內(nèi)核或者編成模塊,倘若第二行中的tristate改為bool,則可以配置test.c是否編譯進(jìn)內(nèi)核,但不能以模塊的形式編譯;第三行設(shè)置了默認(rèn)值,此處表示默認(rèn)編譯進(jìn)內(nèi)核;第四行是說(shuō)明信息。

config TEST
tristate "THIS IS TEST DRIVER"
default y
help
this is just for test

當(dāng)我們配置好Kconfig,則需要把Kconfig包含進(jìn)系統(tǒng)中。假如Kconfig位于路徑drivers/input/test/下,則采用語(yǔ)句源 “drivers/input/test/Kconfig”即可包含該Kconfig文件。

2.Makefile、Config和Kconfig三者間的關(guān)系

其中一種內(nèi)核裁剪的辦法就是通過(guò)命令make menuconfig,該命令就會(huì)獲取Kconfig的信息,然后以下圖中的形式從終端中展示出來(lái)。

圖片

上圖看上去同我們?cè)陲埖昕吹降牟藛晤愃?,因此我們可以把Kconfig比喻為菜單,Makefile比喻為菜譜,config比喻為我們點(diǎn)的菜,make menuconfig就是展示菜單的命令。

當(dāng)我們編寫好驅(qū)動(dòng)代碼之后,需要編寫菜譜,并把該驅(qū)動(dòng)添加到菜單中,然后通過(guò)config或者make menuconfig進(jìn)行點(diǎn)菜,這樣驅(qū)動(dòng)才能進(jìn)行正常的編譯。

3.常見(jiàn)錯(cuò)誤

比較常見(jiàn)的錯(cuò)誤有以下兩大類:

  • 只進(jìn)行點(diǎn)菜和菜譜配置,但忘記把菜名添加到菜單中,導(dǎo)致驅(qū)動(dòng)無(wú)法編譯;
  • 點(diǎn)菜時(shí)使用了錯(cuò)誤的語(yǔ)法格式,有些程序員因?yàn)榫帉懘a的習(xí)慣,通常會(huì)在等號(hào)左右量表預(yù)留空格,但在使用config點(diǎn)菜時(shí),其等號(hào)兩邊不能有空格。

4.總結(jié)

本文著重闡述了驅(qū)動(dòng)編譯需要配置的三類文件:Makefile,Kconfig和config,希望驅(qū)動(dòng)開(kāi)發(fā)者掌握這些內(nèi)容后,可以在開(kāi)發(fā)過(guò)程中重點(diǎn)關(guān)注驅(qū)動(dòng)本身,而不會(huì)在編譯部分耗費(fèi)時(shí)間。

作者介紹

趙青窕,51CTO社區(qū)編輯,從事多年驅(qū)動(dòng)開(kāi)發(fā)。研究興趣包含安全OS和網(wǎng)絡(luò)安全領(lǐng)域,發(fā)表過(guò)網(wǎng)絡(luò)相關(guān)專利。

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2010-07-30 16:06:41

2010-07-19 13:49:52

autoTelnet

2010-09-16 16:13:14

2012-05-03 08:34:15

LinuxKconfig

2016-11-29 12:01:39

數(shù)據(jù)驅(qū)動(dòng)大數(shù)據(jù)

2010-09-26 16:10:03

數(shù)據(jù)加密產(chǎn)品

2010-06-12 16:41:59

網(wǎng)絡(luò)核心協(xié)議

2021-09-01 15:48:50

API漏洞應(yīng)用程序安全

2014-12-29 10:25:34

MEFNFVSDN

2017-03-06 16:15:17

Linux文件作用與區(qū)別

2018-04-24 09:00:00

開(kāi)發(fā)自動(dòng)化軟件架構(gòu)

2023-06-07 17:04:48

集群Standalone

2010-09-28 15:33:18

DHCP服務(wù)器應(yīng)用

2010-09-25 15:54:23

SQL存儲(chǔ)過(guò)程

2012-03-26 10:10:56

云計(jì)算

2011-08-16 16:20:33

Linuxkconfigmakefile

2010-07-16 10:58:21

云計(jì)算

2018-07-05 22:43:24

2021-08-17 14:39:00

鴻蒙HarmonyOS應(yīng)用

2010-02-25 15:11:48

Linux Makef
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)