linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)總結(jié)_第1頁(yè)
linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)總結(jié)_第2頁(yè)
linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)總結(jié)_第3頁(yè)
linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)總結(jié)_第4頁(yè)
linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)總結(jié)_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

不管我們學(xué)習(xí)什么編程語(yǔ)言,和我們見(jiàn)面的第一個(gè)程序就是“helloworld!”相信各位道上的朋友都遇到過(guò)這種個(gè)程序??!學(xué)習(xí)驅(qū)動(dòng)程序也不例外,我學(xué)的第一個(gè)驅(qū)動(dòng)程序就是“helloworld?。 本唧w的程序代碼如下:#include<linux/init.h>

#include<linux/module.h>

MODULE_LICENSE("DualBSD/GPL");

staticinthello_init(void)

{

printk(KERN_ALERT"Hello,world!\n");

return0;

}

staticvoidhello_exit(void)

{

printk(KERN_ALERT"bybyFriendyARMmini2440!\n");

}

module_init(hello_init);

module_exit(hello_exit);將其復(fù)制到工作目錄下,并編寫(xiě)一個(gè)簡(jiǎn)單的Makefile文件:由于每個(gè)人使用的Linux系統(tǒng)不一樣且每個(gè)人內(nèi)核源代碼所存放的位置也不是一樣的。所以編寫(xiě)Makefile文件的時(shí)候,參考別人的進(jìn)行修改是一個(gè)很不錯(cuò)的的學(xué)習(xí)Makefile文件的方法。當(dāng)然你能把Linux內(nèi)核的Makefile文件了解一下,對(duì)你了解Linux內(nèi)核有很大的幫助的。學(xué)習(xí)心得:1、驅(qū)動(dòng)模塊運(yùn)行在內(nèi)核空間,運(yùn)行是不能依賴任何函數(shù)庫(kù)和模塊連接,所以在寫(xiě)驅(qū)動(dòng)程序的時(shí)候所調(diào)用的函數(shù)只能是作為內(nèi)核一部分的函數(shù)。2、驅(qū)動(dòng)模塊和應(yīng)用程序的一個(gè)重要不同是:應(yīng)用程序退出時(shí)可不管資源釋放或者其他的清除工作,但模塊的退出啊哈念書(shū)必須仔細(xì)撤銷初始化函數(shù)所做的一切,否則,在系統(tǒng)想重新引導(dǎo)之前某些東西就會(huì)殘留在系統(tǒng)中。3、處理器的多種工作模式其實(shí)就是為了操作系統(tǒng)的用戶空間和內(nèi)核空間設(shè)計(jì)的,在Unix類的操作系統(tǒng)中只是用到了兩個(gè)級(jí)別:最高級(jí)別和最低級(jí)別。4、要十分注意驅(qū)動(dòng)程序的并發(fā)處理。在Linux驅(qū)動(dòng)程序中必須解決的一個(gè)問(wèn)題就是多個(gè)進(jìn)程對(duì)共享資源的并發(fā)訪問(wèn).Linux對(duì)解決并發(fā)訪問(wèn)可能導(dǎo)致的竟態(tài)問(wèn)題提供了幾種機(jī)制:中斷屏蔽、原子操作、自旋鎖、信號(hào)量等機(jī)制。5、內(nèi)核API中具有下劃線(__)的函數(shù),通常是接口的底層組件,應(yīng)該慎用。6、內(nèi)核代碼不能實(shí)現(xiàn)浮點(diǎn)運(yùn)算。內(nèi)核中沒(méi)有提供一套進(jìn)行浮點(diǎn)運(yùn)算的完整的環(huán)境。7、Makefile文件的分析:obj-m:=hello.o代表了我們要構(gòu)建的模塊名為hello.ko,make會(huì)子啊該目錄下自動(dòng)找到hello.c文件進(jìn)行編譯。如果hello.o文件是有其他的源文件生成(比如file.1和file1.c)的,則在下面加上:hello-objs:=file.ofile1.o......(其中用紅色標(biāo)志的是對(duì)應(yīng)關(guān)系)$(MAKE)-C$(KERNELDIR)M=$(PWD)modules其中-C$(KERNELDIR)指定了內(nèi)核源代碼的位置,其中保存有內(nèi)核的頂層makefile文件。M=$(PWD)指定了模塊源代碼的位置modules目標(biāo)指向obj-m變量中設(shè)定的模塊8、insmod使用公共內(nèi)核符號(hào)表來(lái)解析模塊中未定義的符號(hào),公共內(nèi)核符號(hào)表中包含了的、所有的全局內(nèi)核項(xiàng)(即函數(shù)和變量的地址),這是實(shí)現(xiàn)模塊化驅(qū)動(dòng)程序所必須的。9、Linux使用模塊層疊技術(shù),我們可以將模塊劃分為多個(gè)層次,通過(guò)簡(jiǎn)化每個(gè)層可以縮短開(kāi)發(fā)周期。如果一個(gè)模塊需要向其他模塊導(dǎo)出符號(hào),則使用下面宏:EXPORT_SYMBOL(name);

EXPORT_SYMBOL_GPL(name);符號(hào)必須子啊模塊文件的全局變量部分導(dǎo)出,因?yàn)檫@兩個(gè)宏將被擴(kuò)展為一個(gè)特殊變量的聲明,而該變量必須是全局的。10、所有的模塊代碼都必須包含下面兩個(gè)頭文件:#include<linux/init.h>#include<linux/module.h>11、所有模塊代碼都應(yīng)指定所使用的許可證:MODULE_LICENSE("DualBSD/GPL");12、初始化和關(guān)閉初始化的實(shí)際定義通常是:staticint__initinitialization_function(void)

{

/*初始化代碼*/

}

module_init(initialization_function)清除函數(shù)的實(shí)際定義是:staticint__exitcleanup_function(void)

{

/*清除代碼*/

}

module_exit(cleanup_function)13、還有一些是可選的其他的描述型的定義:MODULE_AUTHOR("");

MODULE_DESCRIPTION("");

MODULE_VERSION("");

MODULE_ALIAS("");

MODULE_DEVICE_TABLE("");這些模塊的聲明習(xí)慣性的放在模塊程序的最后面。14、Linux內(nèi)核模塊的初始化出錯(cuò)處理一般使用“goto”語(yǔ)句,通常情況下很少使用“goto”,但是出錯(cuò)處理是(可能是唯一的情況),它卻非常的有用。在大一學(xué)習(xí)C語(yǔ)言的時(shí)候,老師就建議不要使用“goto”語(yǔ)句,并說(shuō)很少會(huì)用到,在這里遇到第一個(gè)建議使用“goto”語(yǔ)句的。在追求效率的代碼中使用goto語(yǔ)句一直是最好的錯(cuò)誤恢復(fù)機(jī)制。下面是我截下來(lái)的一段關(guān)于使用goto語(yǔ)句實(shí)現(xiàn)錯(cuò)誤處理的程序:structsomething*item1;

structsomethingelse*item2;

intstuff_ok;voidmy_cleanup(void)

{

if(item1)release_thing(item1);

if(item2)

release_thing2(item2);

if(stuff_ok)

unregister_stuff();

return;

}

int__initmy_init(void)

{

interr=-ENOMEM;

item1=allocate_thing(arguments);

item2=allocate_thing2(arguments2);

if(!item2||!item2)

gotofail;

err=register_stuff(item1,item2);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論