如何玩轉linux驅動(dòng)
說(shuō)玩轉驅動(dòng)這話(huà),其實(shí)有點(diǎn)過(guò)頭,玩驅動(dòng)是個(gè)長(cháng)期積累的過(guò)程,寫(xiě)出來(lái)是一回事,調試起來(lái)也是一種磨練。為了讓大家明白玩驅動(dòng)的樂(lè )趣和掌握編寫(xiě)驅動(dòng)的捷徑,我分享一些經(jīng)驗,算是拋磚引玉。不過(guò)正所謂一口吃不了個(gè)胖子,只有寫(xiě)夠了足夠多的代碼,調試了足夠多的模塊,玩轉驅動(dòng)也不再話(huà)下。希望今天的嘮叨對想踏入或者即將踏入驅動(dòng)行業(yè)的你有些幫助。
本文引用地址:http://dyxdggzs.com/article/262706.htmlinux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
我們很明白Linux 設備驅動(dòng)的學(xué)習是一項浩大的工程,正是由于這個(gè)原因,一些人不免望而生畏,其實(shí),只要我們有足夠的積累和全面的知識,玩轉驅動(dòng),也是早晚的事。閑話(huà)少說(shuō),開(kāi)始來(lái)干貨。
對于驅動(dòng)工程師來(lái)說(shuō),首先要明白驅動(dòng)在整個(gè)系統中的作用,
大家從上圖中可以看出,linux驅動(dòng)②在這個(gè)構架中起到承上硬件①啟下應用程序③的作用。在程序的編寫(xiě)中,我們常用高內聚低耦合的標準,因此,驅動(dòng)的引入顯得意義更加重大:一方面,使嵌入式應用工程師不用考慮過(guò)多的硬件差異,另一方面,通過(guò)將設備驅動(dòng)融入內核,面向操作系統內核的接口,這樣的接口由操作系統規定,對一類(lèi)設備而言結構一致,獨立于具體的設備。同時(shí)由于linux操作系統有內存管理和進(jìn)程管理,因此對于多任務(wù)并發(fā)的要求時(shí),操作系統和驅動(dòng)的引入使得任務(wù)變得簡(jiǎn)單。但是對于不需要多任務(wù)調度、文件系統、內存管理等復雜功能時(shí),在一個(gè)大while(1)循環(huán)中既可以完成相關(guān)的任務(wù)。
上面分析了驅動(dòng)的意義,那么,玩轉linux驅動(dòng)需要那方面的知識呢,現在羅列下:
? 第一、Linux 驅動(dòng)工程師要有良好的硬件基礎。
這個(gè)要求不言而喻,linux驅動(dòng)工程師的主要任務(wù)就是隱藏硬件的差異,給應用工程師一個(gè)統一的接口,因此需要能看懂電路圖,理解SRAM、Flash、SDRAM、磁盤(pán)等模塊的讀寫(xiě)方式,知道UART、I2C、USB 等設備的接口以及常規操作,了解輪詢(xún)、中斷、DMA 的原理,PCI 總線(xiàn)的工作方式以及CPU 的內存管理單元(MMU)等。不過(guò)對于這種常見(jiàn)的模塊,linux內核中有相關(guān)的配置,因此需要有閱讀linux內核的能力和修改linux內核的能力。
? 第二 、Linux驅動(dòng)工程師具有良好的C 語(yǔ)言基礎。
作為一個(gè)面向硬件底層和應用層的關(guān)鍵人物,C語(yǔ)言功底是必須要牢固的。在編寫(xiě)linux的字符設備和塊設備驅動(dòng)中常用的fopen()、fwrite()、fread()、fclose()以及內存分配中經(jīng)常使用結構體和指針。因此能靈活地運用C 語(yǔ)言的結構體、指針、函數指針及內存動(dòng)態(tài)申請和釋放顯現的尤為重要。
例如字符設備驅動(dòng)中的讀函數函數的定義
/* 讀設備*/
ssize_t xxx_read(struct file *filp, char _ _user *buf, size_t count,loff_t*f_pos)
{
...
copy_to_user(buf, ..., ...);
...
}
從中看出C語(yǔ)言功底的重要性。
?第三、 Linux 驅動(dòng)工程師具有一定的Linux 內核基礎,雖然并不要求工程師對內核各個(gè)部分有深入的研究,但至少要了解設備驅動(dòng)與內核的接口,尤其是對于塊設備、網(wǎng)絡(luò )設備、Flash設備、串口設備等復雜設備。
現在工作起來(lái),嵌入式驅動(dòng)工程師的工作量相對會(huì )小一點(diǎn),因為一般常見(jiàn)的硬件設備供應商都會(huì )提供相應的linux版本驅動(dòng),驅動(dòng)工程師的任務(wù)就是調試這些驅動(dòng)能正常運行在自己的系統中,同時(shí)保證系統的穩定。
? 第四、 Linux 驅動(dòng)工程師具有良好的操作系統知識。
這個(gè)要求對于沒(méi)有學(xué)習過(guò)操作系統的人來(lái)說(shuō)唯一的痛苦之處就是對于專(zhuān)有名詞不是很理解,例如上半部,下半部,原子操作等。其實(shí)剛開(kāi)始或許是個(gè)痛苦的過(guò)程,但是只要認真的分析了一個(gè)或者幾個(gè)驅動(dòng)程序后,你就會(huì )發(fā)現其中的規律。畢竟linux驅動(dòng)大體分為字符設備驅動(dòng)、塊設備驅動(dòng)和網(wǎng)絡(luò )設備驅動(dòng)三類(lèi),正所謂抓其綱要,舉一反三,便可融會(huì )貫通。因此linux中多任務(wù)并發(fā)控制和同步等基礎很重要,因為在設備驅動(dòng)中會(huì )大量使用自旋鎖、互斥、信號量、等待隊列等并發(fā)與同步機制。
第五、動(dòng)手能力。
紙上得來(lái)終覺(jué)淺,因此,看再多的書(shū)也沒(méi)有真正的調試一個(gè)驅動(dòng)來(lái)的認識深刻。這時(shí)你需要搭建宿主機平臺,購買(mǎi)開(kāi)發(fā)板。不要好大喜功,從簡(jiǎn)單的小驅動(dòng)開(kāi)始一步一步走,以螞蟻啃骨頭的精神進(jìn)行學(xué)習,收獲會(huì )很大。
經(jīng)歷了痛苦的折磨,現在看下嵌入式驅動(dòng)工程師的甜蜜吧,工作個(gè)三五年,你已經(jīng)是大師了,可以去招聘網(wǎng)站瀏覽下,這方面的待遇都是面議獎金都是大大的,紅色票票也隨心所愿了。想到這些,你還不下定決心來(lái)經(jīng)受linux驅動(dòng)的虐待,相信只要以“驅動(dòng)虐我千百遍,我待驅動(dòng)如初戀”的決心,相信你可以玩轉linux驅動(dòng)。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
linux相關(guān)文章:linux教程
評論