中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Linux內(nèi)核開(kāi)發(fā)之將驅(qū)動(dòng)程序添加到內(nèi)核
驅(qū)動(dòng)程序添加到內(nèi)核

 

.概述:

linux內(nèi)核中增加程序需要完成以下三項(xiàng)工作:

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

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

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

.實(shí)例

1.先把驅(qū)動(dòng)代碼usbtmc(文件夾)賦值到/usr/src/linux-headers-2.6.32-31-generic/drivers/char

首先你要清楚你的模塊應(yīng)在內(nèi)核源代碼樹(shù)中處于何處。

1>設(shè)備驅(qū)動(dòng)程序存放在內(nèi)核源碼樹(shù)根目錄drivers/的子目錄下,在其內(nèi)部,設(shè)備驅(qū)動(dòng)文件進(jìn)一步按照類(lèi)別,類(lèi)型等有序地組織起來(lái)。

a.字符設(shè)備存在于drivers/char/目錄下

b.塊設(shè)備存放在drivers/block/目錄下

c.USB設(shè)備則存放在drivers/usb/目錄下。

注意:

(1)此處的文件組織規(guī)則并非絕對(duì)不變,例如:USB設(shè)備也屬于字符設(shè)備,也可以存放在drivers/usb/目錄下。

(2)例如我們把驅(qū)動(dòng)程序usbtmc存放在drivers/char/目錄下,那么你要注意,在該目錄下同時(shí)會(huì)存在大量的C源代碼文件和許多其他目錄。所有對(duì)于僅僅只有一兩個(gè)源文件的設(shè)備驅(qū)動(dòng)程序,可以直接存放在該目錄下,但如果驅(qū)動(dòng)程序包含許多源文件和其他輔助文件,那么可以創(chuàng)建一個(gè)新子目錄。

此處,我們是把usbtmc目錄放在了drivers/char目錄下面

2.修改char目錄下的KconfigMakefile

(1)修改Kconfig

sudogedit Kconfig

添加下面一句后

source"drivers/char/usbtmc/Kconfig"

它表示將usbtmc目錄下的Kconfig掛載到char目錄下的Kconfig里面(為了使本層的Kconfig文件能起作用,我們需要修改父目錄的Kconfig文件,加入source語(yǔ)句)

1>對(duì)驅(qū)動(dòng)程序而言,Kconfig通常和源代碼處于同一目錄。

2>如果你建立了一個(gè)新字目錄,而且也希望Kconfig文件存在于該目錄中的話,那么就必須在一個(gè)已存在的Kconfig文件中將它引入,需要用上面的

語(yǔ)句將其掛接在drivers/char目錄中的Kconfig中。

(2)修改Makefile

添加一句話:

obj-$(CONFIG_USBTMC)+=usbtmc/

這行編譯指令告訴模塊構(gòu)建系統(tǒng)在編譯模塊時(shí)需要進(jìn)入usbtmc/子目錄中。此時(shí)的驅(qū)動(dòng)程序的編譯取決于一個(gè)特殊配置CONFIG_USBTMC配置選項(xiàng)。

3.現(xiàn)在在我們自己些驅(qū)動(dòng)程序文件夾中添加KconfigMakefile

(1)修改Kconfig

新建一個(gè)Kconfig添加下面的話

menu "USBTMC"

comment"USBTMC Driver"

config USBTMC

tristate "USBTMC"

defaultn

help

Ifyou say Y here,support for the usbtmc with computer interface will becompiled into he kernel and accessible via device node. You can also say M here and the driver will be built as a module named usbtmc.ko.

Ifunsure,say N.

endmenu

endmenu

正確配置好后,我們?cè)谠创a下執(zhí)行sudomake menuconfig后,在出現(xiàn)的LinuxKernel Configuration圖形界面中選擇DeviceDrivers下的characterdevcie,將會(huì)看到新加的USBTCM菜單,

(2)修改Makefile

新建一個(gè)Makefile,添加下面的話

obj-$(CONFIG_USBTMC)+=usbtmc.o

此時(shí),構(gòu)建系統(tǒng)運(yùn)行就將會(huì)進(jìn)入usbtmc/目錄下,并且將usbtmc.c編譯為usbtmc.ko模塊

注:

如果驅(qū)動(dòng)程序源文件可能不只有一個(gè),可以把Makefile做如下修改:

obj-$(CONFIG_USBTMC)+=usbtmc.o

usbtmc-objs:=usbtmc-main.o usbtmc-usb1.o

此時(shí),usbtmc-main.cusbtmc-usb1.c就一起被編譯和連接到了usbtmc.ko某塊中。

4.現(xiàn)在已經(jīng)Ok了,現(xiàn)在我們可以進(jìn)入linux內(nèi)核目錄下通過(guò)menuconfig可以找到我們的USBTMC選項(xiàng)(在Device_Drivers下的characterdevices里可以找到USBTMC)對(duì)其進(jìn)行選定。然后退出,編譯內(nèi)核,就搞定了。

 

5.刪除:

刪除也很簡(jiǎn)單,首先在drivers/char目錄下刪掉自己的驅(qū)動(dòng)文件夾。其次再刪除MakefileKconfig之前添加的東西,就搞定了

.詳解:

Makefile,Kconfig和配置工具組成了Linux2.6內(nèi)核的配置系統(tǒng)。
其中Makefile定義了Linux內(nèi)核的編譯規(guī)則,它是大型項(xiàng)目開(kāi)發(fā)的產(chǎn)物。Linux環(huán)境下的大型項(xiàng)目開(kāi)發(fā)中,系統(tǒng)被分為很多模塊,而這些模塊一般會(huì)經(jīng)歷幾次修改,而在修改后的編譯過(guò)程中,由于某些文件中存在依賴關(guān)系,人工編譯效率低(有些文件不需要重新編譯)且易出錯(cuò),Makefile文件便應(yīng)運(yùn)而生。Makefile文件定義了模塊間的依賴關(guān)系,指定文件的編譯順序,以及編譯所使用的命令。它和make命令使得項(xiàng)目的源程序文件可以自動(dòng)編譯,提高了軟件開(kāi)發(fā)效率。到此,再談一下make,它是用來(lái)維護(hù)程序模塊關(guān)系和生成可執(zhí)行程序的工具,它可以根據(jù)程序模塊的修改情況重新編譯鏈接生成中間代碼或最終的可執(zhí)行程序,省去那些重復(fù)的不必要的編譯工作,提高編譯效率。
Kconfig
給用戶提供配置選擇的功能。通常配置內(nèi)核會(huì)有四種方法,makeconfig(字符界面配置),makemenuconfig(菜單界面配置),makexconfig(依賴QT),makegconfig(依賴GTK+)。makeconfig比較適合專業(yè)人員,像初學(xué)者比較適合makemenuconfig,讓我們重點(diǎn)關(guān)注一下它。當(dāng)我們運(yùn)行makemenuconfig時(shí),配置工具會(huì)首先分析與體系結(jié)構(gòu)相對(duì)應(yīng)的/arch/xxx/Kconfig文件(xxx為傳入的arch參數(shù)),它里面包含了除一些與體系結(jié)構(gòu)相關(guān)的配置項(xiàng)和配置菜單外,還通過(guò)source語(yǔ)句引入了一系列Kconfig,配置工具依據(jù)這些Kconfig包含的菜單和項(xiàng)目就可以描繪出一個(gè)分層結(jié)構(gòu)。
例如當(dāng)我們運(yùn)行makezImagine、makebzImagine等生成映像的命令時(shí),會(huì)先檢索頂層的Makefie(在arch/xxx/目錄下的Makefile為頂層Makefile補(bǔ)充體系結(jié)構(gòu)相關(guān)的信息),頂層Makefile的兩個(gè)主要任務(wù)是:產(chǎn)生內(nèi)核映像文件和內(nèi)核模塊。接著頂層Makefile會(huì)去遞歸地進(jìn)入內(nèi)核的各個(gè)子目錄,然后分別調(diào)用子目錄中的Makefile(這些Makefile記錄編譯目標(biāo)),而進(jìn)入哪些子目錄取決于內(nèi)核的配置。
當(dāng)使用makemenuconfigmakeconfig命令時(shí),生成的.config會(huì)在源碼目錄下記錄哪些部分被編譯入內(nèi)核,哪些部分被編譯為內(nèi)核模塊。簡(jiǎn)而言之,它是保存內(nèi)核配置結(jié)果的文件。當(dāng)我們裝上Linux系統(tǒng)時(shí),第一次查看源碼下的所有文件,會(huì)發(fā)現(xiàn)沒(méi)有.config文件,那是因?yàn)閺膩?lái)沒(méi)配置過(guò)內(nèi)核。當(dāng)你運(yùn)行makemenuconfig保存并退出時(shí),再次查看就有這個(gè)文件了。
配置工具,包括配置命令解釋器(對(duì)配置腳本中使用的命令進(jìn)行解釋)和配置用戶界面(提供字符界面和圖形界面),配置工具都是用腳本語(yǔ)言編寫(xiě)的。

 

1.在進(jìn)入menuconfig配置界面時(shí),會(huì)發(fā)現(xiàn)每個(gè)配置項(xiàng)目為布爾型(要么編譯入內(nèi)核,要么不編譯,選項(xiàng)為“Y”或“N”),菜單上為配置選項(xiàng)的名字例如:“XXXDriver”,help后面的內(nèi)容為幫助信息。

1>除了布爾型的配置項(xiàng)目外,還存在一種三態(tài)型(tristate)配置選項(xiàng),它意味著要么編譯入內(nèi)核,要么編譯為內(nèi)核模塊,要么不編譯,選項(xiàng)為“Y”,“M”或“N”。

eg: obj-$(CONFIG_USBTMC) +=usbtmc.o

上面的腳本含義是:如果USBTMC選項(xiàng)被選擇為“Y”或“M”,即obj-$(CONFIG_USBTMC)就等同于obj-yobj-m時(shí),則編譯usbtmc.c,選Y的情況直接會(huì)將生成的目標(biāo)代碼直接連接到內(nèi)核,為“M”的情況則會(huì)生成模塊usbtmc.ko,如果USBTMC配置選項(xiàng)被選擇為“N”,即obj-$(CONFIG_USBTMC)等同于obj-n時(shí),則不編譯usbtmc.c

2.Makefile

對(duì)內(nèi)核源代碼各級(jí)子目錄中的kbuildMakefile進(jìn)行介紹,

(1)目標(biāo)定義

目標(biāo)定義用來(lái)定義哪些內(nèi)容要作為模塊編譯,哪些要編譯并連接進(jìn)內(nèi)核

(a)obj-y:=foo.o

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

b)我們最常用的的做法是根據(jù).config文件的CONFIG_變量來(lái)決定文件的編譯方式:

eg:

obj-$(CONFIG_ISDN)+=isdn.o

(c)多個(gè)文件模塊的定義

如果一個(gè)模塊由多個(gè)文件組成,這時(shí)候應(yīng)采用模塊名加-objs后綴或者-y后綴的形式來(lái)定義模塊的組成文件。

如:

obj-$(CONFIG_EXT2_FS)+=ext2.o

ext2-y:=balloc.o bitmap.o

模塊的名字是ext2,balloc.obitmap.o兩個(gè)文件最終連接生成ext2.o直至ext2.ko文件。

3.Kconfig

內(nèi)核配置腳本語(yǔ)法:

(1)大多數(shù)的內(nèi)核配置選項(xiàng)都對(duì)應(yīng)一個(gè)Kconfig中的一個(gè)菜單入口。

menu "USBTMC"

comment "USBTMC Driver"

config USBTMC

tristate "USBTMC"

default n

endmenu

(a)“config”關(guān)鍵字定義新的配置選項(xiàng),之后的幾行定義了該配置選項(xiàng)的屬性。配置選項(xiàng)的屬性包括類(lèi)型,數(shù)據(jù),輸入提示,依賴關(guān)系(及反向依賴關(guān)系),幫助信息和默認(rèn)值等。

(b)每個(gè)配置選項(xiàng)都必須指定類(lèi)型,其他類(lèi)型都基于這兩種基本類(lèi)型。類(lèi)型定義后可以緊跟輸入提示,下面兩個(gè)腳本是等價(jià)的

腳本1

bool“Networking support”

腳本2

bool

promt“Networking support”

輸入提示的一般格式如下提示:

prompt <prompt> [if <expr>]

其中可選的if用來(lái)表示該提示的依賴關(guān)系。

默認(rèn)值的格式如下所示:

default<expr> [if <expr>]

一個(gè)配置選項(xiàng)可以存在任意多個(gè)默認(rèn)值,這種情況下,只有第一個(gè)被定義的值是可用的。如果用戶不設(shè)置對(duì)應(yīng)的選項(xiàng),配置選項(xiàng)的值就是默認(rèn)值。

(c)依賴關(guān)系的格式如下所示:

dependson (或者 requires)<expr>

如果定義了多個(gè)依賴關(guān)系,它們之間用”&&”間隔。依賴關(guān)系也可以應(yīng)用到該菜單中所有的其他選項(xiàng)中。

(4)反向依賴關(guān)系的格式如下所示:

select<symbol> [if <expr>]

A.depends能限定一個(gè)symbol的上限,即如果A依賴于B,則在B被配置為“Y”的情況下,A可以為“Y”,“M”和”N”;B被配置為“M”的情況下,A可以被配置為“M”或“N”B在被配置為“N”的情況下,A只能為”N”。

B.select能限定一個(gè)symbol的下限,若A反向依賴于B,則A的配置值會(huì)高于或等于B(正好與depends相反)。如果symbol反向依賴于多個(gè)對(duì)象,則它的下限是這些對(duì)象的對(duì)大值。

(5)幫助信息的格式如下:

help(---help---)

開(kāi)始

。。。

結(jié)束

幫組信息完全靠文本縮進(jìn)識(shí)別結(jié)束?!?/span>---help---”和”help”的初衷在于將文件中的配置邏輯與給開(kāi)發(fā)人員的提示分開(kāi)。

 

3.菜單結(jié)構(gòu)

菜單入口在菜單數(shù)結(jié)構(gòu)中的位置可由兩種方法決定。

(1)第一中方式如下所下:

menu“Network device support”

dependson NET

config NETDEVICES

endmenu

所有處于”menu”和”endmenu”之間的菜單入口都會(huì)成為“Networkdevice support”的子菜單。而且,所有子菜單選項(xiàng)都會(huì)繼承父菜單的依賴關(guān)系,比如:“Networkdevice support”對(duì)“NET”的依賴被加到了配置選項(xiàng)NETDEVICES的依賴列表中。

(2)另一種方式是通過(guò)分析依賴關(guān)系生成菜單結(jié)構(gòu)。如果菜單選項(xiàng)在一定程度上依賴于前面的選項(xiàng),它就能成為該選項(xiàng)的子菜單。如果父選項(xiàng)為“N”,則子選項(xiàng)不可見(jiàn);如果父選項(xiàng)為“Y”或“M”,則子選項(xiàng)可見(jiàn)。

Eg:

config MODULES

bool “Enable loadable module support”

config MODVERSIONS

bool “Set version information on all module symbole”

dependson MODULES

 

comment “module support disabled”

 

depends on !MODULES

 

MODVERSIONS直接依賴MODULES,如果MODULES不為“N”,該選項(xiàng)才可見(jiàn)。

(3)除此之外,Kconfig中還可能使用“choices…...endchoice”,”comment”,”if....endif”這樣的語(yǔ)法結(jié)構(gòu)。

其中

choice

<choiceoptions>

<choiceblock>

enchoice

它定義一個(gè)選擇群,其接受的選項(xiàng)(choiceoptions)可以是前面描述的任何屬性。在一個(gè)硬件有多個(gè)驅(qū)動(dòng)的情況下使用,使用選擇可以實(shí)現(xiàn)最終只有一個(gè)驅(qū)動(dòng)被編譯進(jìn)內(nèi)核或模塊。選擇群還可以接受的另一個(gè)選項(xiàng)是“optional”,

這樣菜單入口就被設(shè)置為“N”,沒(méi)有被選中。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux Kbuild文檔
Linux內(nèi)核中的Kconfig、Makefile、.config
Linux內(nèi)核驅(qū)動(dòng)程序的配置
linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(一):內(nèi)核的相關(guān)基礎(chǔ)概念
Kconfig 和 Makefile
.config、kconfig和Makefile的關(guān)系
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服