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