導航:首頁 > 源碼編譯 > 驅動編譯

驅動編譯

發布時間:2022-01-19 22:45:31

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

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 加入到內核中。即可達到您的目的。
轉載

❷ 我可以直接用gcc編譯一個驅動程序嗎

驅動程序肯定不能這么編譯啦,驅動程序要用內核來編譯的。Makefile也很復雜,我也看不太懂,但是Makefile裡面要制定內核所在的目錄以及生產的驅動文件名。這個Makefile可以直接去網上找吧,實在不行我傳給你一個。把Makefile和驅動的c文件放在同一個目錄下,make一下就可以產生.ko的驅動文件。移到開發板上insmod就可以測試了。但貌似要想在內核里配置上這個模塊。

❸ 驅動編譯進內核和編譯模塊的區別

第一次把自己編譯的驅動模塊載入進開發板,就出現問題,還好沒花費多長時間,下面列舉出現的問題及解決方案1:出現insmod:errorinserting'hello.ko':-1Invalidmoleformat法一(網上的):是因為內核模塊生成的環境與運行的環境不一致,用linux-2.6.27內核源代碼生成的模塊,可能就不能在linux-2.6.32.2內核的linux環境下載入,需要在linux-2.6.27內核的linux環境下載入。a.執行uname-r//查看內核版本b.一般出錯信息被記錄在文件/var/log/messages中,執行下面命令看錯誤信息#cat/var/log/messages|tail若出現類似下面:Jun422:07:54localhostkernel:hello:versionmagic'2.6.35.6-45.fc14.i686.PAE'shouldbe'2.6.35.13-92.fc14.i686.PAE'則把Makefile里的KDIR:=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1改為KDIR:=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1//改成自己內核源碼路徑(這里的build1是一個文件鏈接,鏈接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)然並卵,我的fedora14/usr/src/kernels下並沒有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,雖然不知道兩者有什麼區別,但改成2.6.35.13-92.fc14.i686還是不行,照樣這個問題,還好後來在看教學視頻的到啟發法二:改的還是那個位置KDIR:=/opt/FriendlyARM/linux-2.6.32.2//把這里改成你編譯生成kernel的那個路徑all:$(MAKE)-C$(KDIR)M=$(PWD)molesARCH=armCROSS_COMPILE=arm-linux-//加這句2.[70685.298483]hello:molelicense'unspecified'taintskernel.[70685.298673]方法:在模塊程序中加入:MODULE_LICENSE("GPL");3.rmmod:chdir(2.6.32.2-FriendlyARM):Nosuchfileordirectory錯誤解決方法:lsmod可查看模塊信息即無法刪除對應的模塊。就是必須在/lib/moles下建立錯誤提示的對應的目錄((2.6.32.2)即可。必須創建/lib/moles/2.6.32.2這樣一個空目錄,否則不能卸載ko模塊.#rmmodnls_cp936rmmod:chdir(/lib/moles):Nosuchfileordirectory但是這樣倒是可以卸載nls_cp936,不過會一直有這樣一個提示:rmmod:mole'nls_cp936'notfound初步發現,原來這是編譯kernel時使用makemoles_install生成的一個目錄,但是經測試得知,rmmod:mole'nls_cp936'notfound來自於busybox,並不是來自kernel1).創建/lib/moles/2.6.32.2空目錄2).使用如下源碼生成rmmod命令,就可以沒有任何提示的卸載ko模塊了[luther.gliethttp]#include#include#include#include#include#includeintmain(intargc,char*argv[]){constchar*modname=argv[1];intret=-1;intmaxtry=10;while(maxtry-->0){ret=delete_mole(modname,O_NONBLOCK|O_EXCL);//系統調用sys_delete_moleif(retread_proc=procfile_read;////Our_Proc_File->owner=THIS_MODULE;Our_Proc_File->mode=S_IFREG|S_IRUGO;Our_Proc_File->uid=0;Our_Proc_File->gid=0;Our_Proc_File->size=37;printk("/proc/%screated\n",procfs_name);return0;}voidproc_exit(){remove_proc_entry(procfs_name,NULL);printk(KERN_INFO"/proc/%sremoved\n",procfs_name);}mole_init(proc_init);mole_exit(proc_exit);[html]viewplainifneq($(KERNELRELEASE),)obj-m:=proc.oelseKDIR:=/opt/FriendlyARM/linux-2.6.32.2#KDIR:=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1PWD:=$(shellpwd)all:$(MAKE)-C$(KDIR)M=$(PWD)molesARCH=armCROSS_COMPILE=arm-linux-clean:rm-f*.ko*.o*.mod.o*.mod.c*.symversendifmake後生成proc.ko,再在開發板上insmodproc.ko即可執行dmesg就可以看到產生的內核信息啦

❹ Linux驅動編譯

這文件目錄下面根本就沒有需要編譯的文件,所以make的時候提示,命令沒有找到(沒有那個文件)
「README_STA_usb」,你看看這個文檔,是安裝說明,裡面應該有講解。

❺ 如何將多個驅動程序,編譯為一個執行文件

你乾脆去打造一個自己有的ghost系統算了,下次裝系統的時候,兩分鍾全部(包括驅動)搞定。

❻ 如何使用ubuntu來編譯驅動

工具/原料

Ubuntu12.04操作系統和測試驅動程序(beep_arv.c)
方法/步驟

在介紹2種方法前,必須知道的知識點:
1.關聯文件Makefile:
Makefile:分布在Linux內核源代碼中的Makefile用於定義Linux內核的編譯規則;
2.管理文件Kconfig:
給用戶提供配置選擇的功能;
配置工具:
1)包括配置命令解析器;
2)配置用戶界面;menuconfig || xconfig;
3)通過腳本語言編寫的;

3.
---tristate 代表三種狀態:1.[ ]不選擇,2.[*]選擇直接編譯進內核,載入驅動到內核里,3.[m]動態載入驅動;
---bool 代表兩種狀態,1.[ ]不選擇,2.[*]選擇;
---"Mini2440 mole sample"這個是在make menuconfig時刷出的提示字元;
---depends on MACH_MINI2440 這個配置選項出現在make menuconfig菜單欄下,在內核配置中必須選中、MACH_MINI2440;
---default m if MACH_MINI2440 這個如果選中了MACH_MINI2440,默認是手
動載入這個驅動;
help:提示幫助信息;
在了解了基本的知識點,便開始進行第一種添加驅動的方法,本次交流是以beep_arv.c蜂鳴驅動程序為基礎的
方法一:
1)進入內核的驅動目錄;
#cp beep_arv.c /XXX/.../linux-XXXl/drivers/char
2)進入Kconfig添加驅動信息;
#cd /XXX/linux-XXX/.../drivers/char
#vim Kconfig
添加基本信息:
config BEEP_MINI2440
tristate "---HAH--- BEEP"
default
help
this is test makefile!

3)進入Makefile添加驅動編譯信息;
#vim Makefile
添加基本信息:
obj-$(CONFIG-BEEP_MINI2440) +=beep_drv.o

方法一結果:
在--Character devices下就能看到配置信息了;

方法二:
1)進入驅動目錄,創建BEED目錄;
#cd /XXX/.../linux-XXX/drivers/char
#mkdir beep
2)將beep_arv.c驅動程序復制到新建目錄下;
#cp beep_arv.c /XXX/.../linux-XXXl/drivers/char/beep
3)創建Makefile和Kconfig文件
#cd char/beep
#mkdir Makefile Kconfig
#chmod 755 Makefile
#chmod 755 Kconfig

4)進入Kconfig添加驅動信息;
#vim Kconfig
添加基本信息:
config BEEP_MINI2440
tristate "---HAH--- BEEP"
default
help
this is test makefile!

5)進入Makefile添加驅動編譯信息;
#vim Makefile
添加基本信息:
obj-$(CONFIG_BEEP_MINI2440) +=beep_drv.o

6)並且要到上一級目錄的Makefile和Kconfig添加驅動信息;
#cd ../
#vim Makefile
#vim Kconfig

❼ linux 驅動程序開發,為什麼要編譯內核源碼樹

您好,這樣的情況建議您下載最新版本的驅動精靈,或是直接在線升級一下驅動精靈。希望可以幫到您。

❽ linux下怎麼編譯安裝驅動

linux 編譯安裝驅動有兩種,動態載入與靜態載入
動態載入
一,編譯,在指點內核樹下編譯,生成.o文件或.ko文件
二,將生成的.o或.ko文件拷到相應目錄,一般是/lib/mole/kernel下面
三,用insmod命令載入,用rmmod命令卸載
靜態載入
靜態載入主要就是編譯內核。就是將編寫好的驅動放進內核相應的目錄下面。然後編譯內核。然後運行編譯好的內核。

❾ 如何編譯驅動程序

驅動的編譯和上層應用程序的編譯完全不同,作為初學者應該先了解一下,即使你還不懂得怎麼寫驅動程序。
首先安裝DDK,然後隨便找一個例子來測試。在菜單中找到BUILD環境菜單執行,不同的系統要使用不同的BUILD環境。會打開一個DOS窗口,這時CD到那個例子程序,輸入 build –cZ回車就可以了。 驅動程序都是用一個由DDK提供的叫build.exe的工具編譯的。此程序以一個名為SOURCES的文件作為輸入,該文件中包含目標可執行文件的名稱、類型和要創建的可執行文件的路徑,注意這個文件沒有後綴名。
SOURCES的文件格式:
TARGETNAME=drivername ,
- 本參數用於指定生成的設備驅動程序名稱(不需後綴名),所產生的文件
- 為drivername.sys.

TARGETPATH=./lib
- 本參數用於指定生成的設備驅動程序所存放的路徑. 一般採用./lib.

TARGETTYPE=DRIVER
- build能夠生成許多不同的目標對象,設備驅動程序一般選用 DRIVER.

INCLUDES=path1;path2;...
- 本參數是可選的, 用於指定其他的#include文件的搜索路徑.

TARGETLIBS=lib1;lib2;...
- 本參數是可選的, 用於指定其他的lib庫文件的搜索路徑.

SOURCES=file1.c file2.c ...
- 本參數用於指定需被編譯的全部源文件名稱, 後綴名不能省略,文件名之間用空格分開.
SOURCES文件是必需的,如果沒有它則表示沒有任何源文件需要編譯。
如果要換行可以用 『/』 符號,表示對上一行的繼續。

也可以創建DIRS文件,DIRS文件用於指定在當前目錄下必須創建的子目錄。
DIRS文件格式:
DIRS文件的內容由一系列用空格分開的目錄名組成
DIRS = /
subdir1 /
subdir2 /
subdir3
DIRS文件是可選的。

有的時候,會提示找不到依賴的文件(.h,.lib 之類),其實設置好 source 文件的
INCLUDES和TARGETLIBS就可以,我第一次編譯時就碰到這個問題,和VC環境區別較大,但習慣就好。

❿ vs2010如何編譯驅動

1、安裝VS2010,安裝WDK 7.0(DDK);

2、新建VC++->Empty Project

3、打開Configuration Manager 並新建一個名稱為「 dirver 」的Solution Configuration 並將「dirver」 設為Active Solution Configuration .

4、打開View-> property Manager。

5、在"dirver" solution configuration 上點擊右鍵,選擇Add new property Sheet。取名為「dirverProperty」. 並對他進下以下設置。

5.1. C\C++ - General - Debug Information Format = Program Database (/Zi)
5.2. C\C++ - Preprocessor - Preprocessor Definitions = _X86_ [add also DBG for Debug config]
【WIN32;_DEBUG;_X86_;i386;STD_CALL;CONDITION_HANDLING;WIN32_LEAN_AND_MEAN;NT_UP;SRVDBG;DBG;_IDWBUILD;_WIN32_WINNT=0x0400;% (PreprocessorDefinitions)】
5.3. C\C++ - Code Generation - Enable C++ Exceptions = No
5.4. C\C++ - Code Generation - Basic Runtime Checks = Default
5.5. C\C++ - Code Generation - Buffer Security Check = No (/GS-)
5.6. C\C++ - Advanced - Calling Convention = __stdcall (/Gz)
5.7. C\C++ - Advanced - Compile As = Compile as C Code (/TC) [if you are going to use plain C]
5.8. Linker - General - Output File = $(OutDir)\$(ProjectName).sys
5.9. Linker - General - Enable Incremental Linking = Default
5.10. Linker - Input - Additional Dependencies = ntoskrnl.lib hal.lib $(NOINHERIT) [add here needed libs here e.g. ntoskrnl.lib hal.lib]
【不知道上面是不是筆誤,應該為:ntoskrnl.lib;hal.lib;%(AdditionalDependencies)】
5.11. Linker - Input - Ignore All Default Libraries = Yes (/NODEFAULTLIB)
5.12. Linker - Manifest File - Generate Manifest = No
5.13. Linker - System - SubSystem = Native (/SUBSYSTEM:NATIVE)
5.14. Linker - System - Driver = Driver (/DRIVER)
5.15. Linker - Advanced - Entry Point = DriverEntry
5.16. Linker - Advanced - Base Address = 0x10000
5.17. Linker - Advanced - Randomized Base Address = Disable (/DYNAMICBASE:NO)
【這個也是錯誤的:應該置空】
5.18. Linker - Advanced - Data Execution Prevention (DEP) = Disable (/NXCOMPAT:NO)
【這個也是錯誤的:應該置空】

6. Config VC++ Directories
6.1 Open Open up property manager by clicking on Menu View->Property Manager.
6.2 Expand the project node and then the Configuration|Platform nodes, you will see "Microsoft.cpp.<Platform>.users" file for each Configuration|Platform. These are the files

for the global settings, similar to the old tools/Options/VC++ Directories.
6.3 Multi-Select "Microsoft.cpp.<Platform>.users", right click and bring up the property page window
6.4 In the property page window, click on "VC++ Directories" (for example) in the left pane, add new paths for the directories such as "Include Directories". separated by

semicolons
(eg:Include Directories config As:
$(ddkroot)\INC
$(ddkroot)\INC\WNET
$(ddkroot)\INC\DDK\WNET
Library Directories config As:
$(ddkroot)\LIB\WNET\I386
)
6.5 Make sure to save the settings before shutting down Visual Studio.
6.6 Re-launch Visual Studio and the new settings will be in effect.
6.7 Note: If you would like to only change the settings for one project, you can right click on the project and bring up the property page. Change the settings for 「VC++

Directories」, these settings will be persisted to the project file.
七. OK. Have done. Now you can test it with simple code, e.g.:

#include "ntddk.h"

NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
return STATUS_UNSUCCESSFUL;
}

特別說明:
1.
Visual Studio 2010 在智能設備開發方面只支持Windows Phone OS 7.0。如果你要為Windows CE 5.0和Windows Mobile 6.5開發應用程序,請安裝Visual Studio 2008。
2.
做驅動開發時,SDK的版本要和WDK的版本一致,即Win7 WDK要配Win7 SDK,否則會出現編譯錯誤。VS2010里集成了Windows SDK 7.0A。
3.
如果出現類似如下編譯錯誤,解決方法是:拷貝C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sal.h,然後覆蓋掉C:\WinDDK\7600.16385.1\inc\api\sal.h。

C:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.h(550): error C2143: syntax error : missing ')' before 'const'
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.h(550): error C2143: syntax error : missing '{' before 'const'
.......

閱讀全文

與驅動編譯相關的資料

熱點內容
天蠍vs程序員 瀏覽:991
單片機下載口叫什麼 瀏覽:186
程序員的道 瀏覽:924
雲伺服器不實名違法嗎 瀏覽:556
怎樣查看文件夾圖片是否重復 瀏覽:993
文件怎麼導成pdf文件 瀏覽:805
打開sql表的命令 瀏覽:101
安卓手機如何面部支付 瀏覽:37
天元數學app為什麼登錄不上去 瀏覽:822
明日之後為什麼有些伺服器是四個字 瀏覽:102
安卓系統l1是什麼意思 瀏覽:24
伺服器一直崩應該用什麼指令 瀏覽:922
cm202貼片機編程 瀏覽:729
php構造函數帶參數 瀏覽:178
解壓電波歌曲大全 瀏覽:345
為啥文件夾移到桌面成word了 瀏覽:859
命令符的安全模式是哪個鍵 瀏覽:760
編程中學 瀏覽:957
單片機求助 瀏覽:995
ug加工側面排銑毛坯怎麼編程 瀏覽:273