導航:首頁 > 源碼編譯 > 編譯內核必要驅動

編譯內核必要驅動

發布時間:2024-10-17 11:17:15

❶ 如何把自己的驅動編譯進內核或模塊

我們知道若要給linux內核添加模塊(驅動)有如下兩種方式:
(1)動態方式:採用insmod命令來給運行中的linux載入模塊。
(2)靜態方式:修改linux的配置菜單,添加模塊相關文件到源碼對應目錄,然後把模塊直接編譯進內核。
對於動態方式,比較簡單,下面我們介紹如何採用靜態的方式把模塊添加到內核。
最終到達的效果是:在內核的配置菜單中可以配置我們添加的模塊,並可以對我們添加的模塊進行編譯。
一. 內核的配置系統組成
首先我們要了解Linux 2.6內核的配置系統的原理,比如我們在源碼下運行「make menuconfig 」為神馬會出現一個圖形配置菜單,配置了這個菜單後又是如何改變了內核的編譯策略滴。
內核的配置系統一般由以下幾部分組成:
(1)Makefile:分布在Linux內核源代碼中的Makefile,定義Linux內核的編譯規則。
(2)配置文件(Kconfig):給用戶提供配置選項,修改該文件來改變配置菜單選項。
(3)配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋),配置用戶界面(提供字元界面和圖形界面)。這些配置工具都是使用腳本語言編寫的,如Tcl/TK、Perl等。
其原理可以簡述如下:這里有兩條主線,一條為配置線索,一條為編譯線索。配置工具根據kconfig配置腳本產生配置菜單,然後根據配置菜單的配置情況生成頂層目錄下的.config,在.config里定義了配置選擇的配置宏定義,如下所示:

如上所示,這里定義的這些配置宏變數會在Makefile里出現,如下所示:

然後make 工具根據Makefile里這些宏的賦值情況來指導編譯。所以理論上,我們可以直接修改.config和Makefile來添加模塊,但這樣很麻煩,也容易出錯,下面我們將會看到,實際上我們有兩種方法來很容易的實現。

二. 如何添加模塊到內核
實際上,我們需要做的工作可簡述如下:
(1)將編寫的模塊或驅動源代碼(比如是XXOO)復制到Linux內核源代碼的相應目錄。
(2)在該目錄下的Kconfig文件中依葫蘆畫瓢的添加XXOO配置選項。
(3)在該目錄的Makefile文件中依葫蘆畫瓢的添加XXOO編譯選項。
可以看到,我們奉行的原則是「依葫蘆畫瓢」,主要是添加。
一般的按照上面方式又可出現兩種情況,一種為給XXOO驅動添加我們自己的目錄,一種是不添加目錄。兩種情況的處理方式有點兒不一樣哦。

三. 不加自己目錄的情況
(1)把我們的驅動源文件(xxoo.c)放到對應目錄下,具體放到哪裡需要根據驅動的類型和特點。這里假設我們放到./driver/char下。
(2)然後我們修改./driver/char下的Kconfig文件,依葫蘆添加即可,如下所示:

注意這里的LT_XXOO這個名字可以隨便寫,但需要保持這個格式,他並不需要跟驅動源文件保持一致,但最好保持一致,等下我們在修改Makefile時會用到這個名字,他將會變成CONFIG_LT_XXOO,那個名字必須與這個名字對應。如上所示,tristate定義了這個配置選項的可選項有幾個,help定義了這個配置選項的幫助信息,具體更多的規則這里不講了。

(3)然後我們修改./driver/char下的Makefile文件,如下所示:

這里我們可以看到,前面Kconfig里出現的LT_XXOO,在這里我們就需要使用到CONFIG_XXOO,實際上邏輯是醬汁滴:在Kconfig里定義了LT_XXOO,然後配置完成後,在頂層的.config里會產生CONFIG_XXOO,然後這里我們使用這個變數。
到這里第一種情況下的添加方式就完成了。
四. 添加自己目錄的情況
(1)在源碼的對應目錄下建立自己的目錄(xxoo),這里假設為/drivers/char/xxoo 。
(2) 把驅動源碼放到新建的xxoo目錄下,並在此目錄下新建Kconfig和Makefile文件。然後給新建的Kconfig和Makefile添加內容。
Kconfig下添加的內容如下:

這個格式跟之前在Kconfig里添加選項類似。
Makefile里寫入的內容就更少了:

添加這一句就可以了。
(3)第三也不復雜,還是依葫蘆畫瓢就可以了。
我們在/drivers/char目錄下添加了xxoo目錄,我們總得在這個配置系統里進行登記吧,哈哈,不然配置系統怎麼找到們呢。由於整個配置系統是遞歸調用滴,所以我們需要在xxoo的父目錄也即char目錄的Kconfig和Makefile文件里進行登記。具體如下:
a). 在drivers/char/Kconfig中加入:source 「drivers/char/xxoo/Kconfig」
b). 在drivers/char/Makefile中加入:obj-$(CONFIG_LT_XXOO) += xxoo/
添加過程依葫蘆畫瓢就可以了,灰常滴簡單。

❷ 如何編譯載入linux驅動和內核模塊

linux下編譯運行驅動
嵌入式linux下設備驅動的運行和linux x86 pc下運行設備驅動是類似的,由於手頭沒有嵌入式linux設備,先在vmware上的linux上學習驅動開發。
按照如下方法就可以成功編譯出hello world模塊驅動。
1、首先確定本機linux版本
怎麼查看Linux的內核kernel版本?
'uname'是Linux/unix系統中用來查看系統信息的命令,適用於所有Linux發行版。配合使用'uname'參數可以查看當前伺服器內核運行的各個狀態。
#uname -a
Linux whh 3.5.0-19-generic #30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux

只列印內核版本,以及主要和次要版本:
#uname -r
3.5.0-19-generic

要列印系統的體系架構類型,即的機器是32位還是64位,使用:
#uname -p
i686

/proc/version 文件也包含系統內核信息:
# cat /proc/version
Linux version 3.5.0-19-generic(buildd@aatxe) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012

發現自己的機器linux版本是:3.5.0-19-generic
2、下載機器內核對應linux源碼

❸ 怎麼用Visual Studio編譯內核驅動

在Win8以前開發內核驅動,准備編譯環境是個較繁瑣的事情。程序員需要手動下載WDK並安裝(注1),開發環境就在安裝好的WDK中。WDK是Windows Driver Kit縮寫,即Windows驅搏陵告動開發包。它提供的開發環境簡陋得很,它不是一個便於開發的IDE環境,而僅僅是一些散裝的編譯工具包。

安裝好WDK後,WDK的編譯環境鏈接就顯示在開始菜單中了,要小心不能將它們刪掉,否則會麻煩,因為手動生成鏈接是麻煩事,後文會講。
編譯環境是分類的。首先根據目標系統分類,也就是要編譯生成運行在什麼OS上的目標文件。微軟大部分的產品都保持了向後兼容的習慣,這條規律也適用於此處:使用Win7子系統環境編譯出來的驅動文件,一般都能運行在Vista和XP系統上,反之就不會成立(注2)。
其次根據硬體平台分類,現在Windows系統能夠運行的平台有四個:X86,X64,IA64和ARM。其中ARM是Win8才開始的故事,這里還輪不到它出場,這樣就只有前面三個硬體平台(注3)。
最後又要根據編譯版本來分,即Checked(也可認做Debug)和Free(也可認作Release)這兩種。這樣來看,每個OS組別下面,就一汪滾定有6個編譯環境鏈接。
在這本書裡面,如果用舊版本WDK編譯驅動,就默認使用Win7目標系統的編譯環境,生成Checked版本,目標平台是X86或X64。所以就只會選兩種:X86 Checked Build Environment和X64 Checked Build Environment.
編譯環境打開來其實就是個控制台。它當然不同於直接從cmd.exe運行起來的控制台環境,區別在哪裡呢?我們已經知道,上圖的這些黑色的編譯環境圖標,其實都是快捷方式。不妨就看看它的快捷方式的Target內容,或許就知道端倪了。以X64 Checked Build Environment這個環境為例,打開來看到如下內容:
C:\Windows\System32\cmd.exe /k C:\WinDDK\7600.16385.1\bin\setenv.bat C:\WinDDK\7600.16385.1\ chk x64 WIN7
這一行內容仔細一看就很簡單了。原來所謂的編譯環境,就是一個運行cmd.exe的控制台進程,只不過它執行了用於初始化的/k參數。在Cmd.exe命令的幫助中,/k參數是這樣描述的:Carries out the command specified by string but remains(執行一個命令,執行完之後不退出程序)。也就是說,啟動控制台進程並執行命令,執行完後,控制台程序留給用戶繼續使用。
那麼/k之後的所有內容,都是一條初始化的命令:
C:\WinDDK\7600.16385.1\bin\setenv.bat C:\WinDDK\7600.16385.1\ chk x64 WIN7
它卻又可拆成幾個部分來分析。第一個setenv.bat是初始化編譯環境的批文件。後面的是它的參數:第一個參數,是WDK的路徑,通過它可以找到編譯器程序;第二個參數是指明要編譯生成checked版本目標文件;第三個指明硬體平台是x64;第三個指明目標系統是Win7。
位於WDK中的Setenv.bat文件是負責編譯環境配置的總廚,你把什麼參數遞給它,它就給你配出什麼類型的編譯環境來(菜也)。
怎麼在這個控制台裡面編譯驅動呢?我們統一用使用以下步驟:

通過CD命令,定位到含有source文件的那個驅動目錄;
輸入build或bld(build –cz的簡寫)命令進行編譯;
如果編譯成功,將生成驅動文件,否則會有錯誤或警告信息顯示出來;也可通過查看目錄文件夾下面的相關log文件查看詳細的錯誤或警告信息。

走到這里,基明編譯的事情算弄明白了。可能還會有朋友問我,我用什麼東西寫代碼呢?不好意思,關於這個問題,此時還沒有康莊大道供大家駟馬高車,不過千萬條小路卻是現成的。您可以用notepad記事本或者任何文本編輯器來編輯代碼,如果不嫌麻煩,用Visual Studio寫代碼也可以,只不過僅作代碼編輯而已。

❹ 如何把自己的驅動編譯進內核或模塊

2.6內核的源碼樹目錄下一般都會有兩個文文:Kconfig和Makefile。分布在各目錄下的Kconfig構成了一個分布式的內核配置資料庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出配置菜單,用戶配置完後保存到.config(在頂層目錄下生成)中。在內核編譯時,主Makefile調用這個.config,就知道了用戶對內核的配置情況。

上面的內容說明:Kconfig就是對應著內核的配置菜單。假如要想添加新的驅動到內核的源碼中,可以通過修改Kconfig來增加對我們驅動的配置菜單,這樣就有途徑選擇我們的驅動,假如想使這個驅動被編譯,還要修改該驅動所在目錄下的Makefile。

因此,一般添加新的驅動時需要修改的文件有兩種(注意不只是兩個)

*Kconfig
*Makefile

要想知道怎麼修改這兩種文件,就要知道兩種文檔的語法結構。

First: Kconfig


每個菜單項都有一個關鍵字標識,最常見的就是config。

語法:
config symbol

options
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

symbol就是新的菜單項,options是在這個新的菜單項下的屬性和選項

其中options部分有:

1、類型定義:
每個config菜單項都要有類型定義,bool:布爾類型, tristate三態:內建、模塊、移除, string:字元串, hex:十六進制, integer:整型

例如config HELLO_MODULE
bool "hello test mole"

bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成內核模塊的選項,假如選擇編譯成內核模塊,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置,假如選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置.

2、依賴型定義depends on或requires
指此菜單的出現是否依賴於另一個定義

config HELLO_MODULE
bool "hello test mole"
depends on ARCH_PXA
這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效,即只有在選擇了ARCH_PXA, 該菜單才可見(可配置)。

3、幫助性定義
只是增加幫助用關鍵字help或---help---
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

更多詳細的Kconfigconfig語法可參考:

Second: 內核的Makefile

內核的Makefile分為5個組成部分:
Makefile 最頂層的Makefile
.config 內核的當前配置文檔,編譯時成為頂層Makefile的一部分
arch/$(ARCH)/Makefile 和體系結構相關的Makefile
s/ Makefile.* 一些Makefile的通用規則
kbuild Makefile 各級目錄下的大概約500個文檔,編譯時根據上層Makefile傳下來的宏定義和其他編譯規則,將源代碼編譯成模塊或編入內核。

頂層的Makefile文檔讀取 .config文檔的內容,並總體上負責build內核和模塊。Arch Makefile則提供補充體系結構相關的信息。 s目錄下的Makefile文檔包含了任何用來根據kbuild Makefile 構建內核所需的定義和規則。

(其中.config的內容是在make menuconfig的時候,通過Kconfig文檔配置的結果)

在linux2.6.x/Documentation/kbuild目錄下有詳細的介紹有關kernel makefile的知識。

最後舉個例子:
假設想把自己寫的一個flash的驅動程式載入到工程中,而且能夠通過menuconfig配置內核時選擇該驅動該怎麼辦呢?能夠分三步:

第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/ 目錄下。

第二:修改/driver/mtd/maps目錄下的kconfig文檔:
config MTD_flashtest
tristate 「ap71 flash"

這樣當make menuconfig時 ,將會出現 ap71 flash選項。

第三:修改該目錄下makefile文檔。
添加如下內容:obj-$(CONFIG_MTD_flashtest) += flashtest.o

這樣,當您運行make menucofnig時,您將發現ap71 flash選項,假如您選擇了此項。該選擇就會保存在.config文檔中。當您編譯內核時,將會讀取.config文檔,當發現ap71 flash 選項為yes 時,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到內核中。即可達到您的目的。
轉載

❺ 為什麼自己編譯的linux內核和驅動比系統自帶的要大的多

1、配置中有很多調試選項(不一定帶「debug」字樣),而且位置也很分散;
2、發行版自帶內核往往經過長期、仔細的配置,會比個人十幾分鍾的配置更全面。
這兩個原因對內核及模塊的大小有影響,但不大。

編譯出的內核模塊中包含多個運行時用不到的段(編譯連接時可能要用,不是錯誤),發行版中一般會刪掉,這很有可能是原因所在。

可以考慮用 [strip -S mod_name.ko] 來處理一下內核模塊(注意:這里選項要用大寫S,小寫s或不寫會連符號表一起刪掉,導致模塊無法載入),看看文件有沒有變小(別對內核本身這么干)。
如果以上命令明顯減小了文件,可以考慮在編譯內核前定義環境變數INSTALL_MOD_STRIP為1(數字),這樣make moles_install後的內核模塊都是經 strip 處理過的了。

閱讀全文

與編譯內核必要驅動相關的資料

熱點內容
加密狗被人偷了怎麼辦 瀏覽:671
java判斷一個對象是否為空 瀏覽:401
如何來緩解壓力呢英語 瀏覽:631
折彎最簡單演算法方法 瀏覽:491
編譯安卓軟體買固態可以用多久 瀏覽:623
c會被重新編譯 瀏覽:849
優盤插上電腦加密狗不好使 瀏覽:469
pythonunichr函數 瀏覽:98
深圳黑馬程序員地址 瀏覽:401
編譯內核必要驅動 瀏覽:743
androidstudio仿qq 瀏覽:215
mc解壓畫質 瀏覽:217
哪個app能看到自己短發的樣子 瀏覽:812
phputf8正則 瀏覽:53
php開發工具下載 瀏覽:194
java轉編碼格式 瀏覽:381
壓縮機氣缸滑片槽 瀏覽:534
java邏輯思維 瀏覽:650
在哪裡看app的內存 瀏覽:898
視頻加密什麼意思 瀏覽:863