導航:首頁 > 操作系統 > 精通linux設備驅動開發

精通linux設備驅動開發

發布時間:2024-04-15 07:37:33

『壹』 到什麼程度才叫精通linux

許多同學觸摸Linux不多,對Linux渠道的開發更是一竅不通。而如今的趨勢越來越標明,作為一個優秀的軟體開發人員,或計算機IT職業從業人員,把握Linux是一種很主要的營生資本與手法。

下來我將會結合自己的幾年的個人開發經驗,及對 Linux,更是類UNIX系統,及開源軟體文化,談談Linux的學習方法與學習中應該注意的一些事。

就如同剛才說的,很多同學以前可能連Linux是什麼都不知道,對UNIX更是一無所知。所以我們從最基礎的講起,對於Linux及UNIX的歷史我們不做多談,直接進入入門的學習。

Linux入門是很簡單的,問題是你是否有耐心,是否愛折騰,是否不排斥重裝一類的大修。沒折騰可以說是學不好Linux的,鳥哥說過,要真正了解Linux的分區機制,對LVM使用相當熟橡滑練,沒有20次以上的Linux裝機經驗是積累不起來的,所以一定不要怕折騰。

由於大家之前都使用Windows,所以我也盡可能照顧這些「菜鳥」。我的推薦,如果你第一次接觸Linux,那麼首先在虛擬機中嘗試它。虛擬機我推薦Virtual Box,我並不主張使用VM,原因是VM是閉源的,並且是收費的,我不希望推動盜版。當然如果你的Money足夠多,可以嘗試VM,但我要說的是即使是VM,不一定就一定好。

付費的軟體不一定好。

首先,Virtual Box很小巧,Windows平台下安裝包在80MB左右,而VM動輒600MB,雖然功能強大,但資源消耗也多,何況你的需求Virtual Box完全能夠滿足。所以,還是自己選。

如何使用虛擬機,是你的事,這個我不教你,因為很簡單,不會的話Google或Bai都可以,英文好的可以直接看官方文檔。現在介紹Linux發行版的知識。

正如你所見,Linux發行版並非Linux,Linux僅是指操作系統的內核,作為科班出生的你不要讓我解釋,我也沒時間。

我推薦的發行版如下:

UBUNTU 適合純菜鳥,追求穩定的官方支持,對系統穩定性要求較弱,喜歡最新應用,相對來說不太喜歡折騰的開發者。

Debian,相對UBUNTU難很多的發行版,突出特點是穩定與容易使用的包管理系統,缺點是企業支持不足,為社區開發驅動。

Arch,追逐時尚的開發者的首選,優點是包更新相當快,無縫升級,一次安裝基本可以一直運作下去,沒有如UBUNTU那樣的版本概念,說的專業點叫滾動升級,保持你的系統一定是最新的。缺點顯然易見,不穩定。同時安裝配置相對Debian再麻煩點。

Gentoo,相對Arch再難點,考驗使用者的綜合水平,從系統安裝到微調,內核編譯都親歷親為,是高手及黑客顯示自己技術手段,按需配置符合自己要求的系統的首選。

Slackware與Gentoo類似。

CentOS,社區維護的RedHat的復刻版本,完全使用RedHat的源碼重新編譯生成,與RedHat的兼容性在理論上來說是最好的。如果你專注於Linux伺服器,如網路管理,架站,那麼CentOS是你的選擇。

LFS,終極黑客顯擺工具,完全從源代碼安裝,編譯系統。安裝前你得到的只有一份文檔,你要做的就是照文檔你的說明,一步步,一條條命令,一個個軟體包的去構建你的Linux,完全由你自己控制,想要什麼就是什麼。如果你做出了LFS,證明你的Linux功底已經相當不錯,如果你能拿LFS文檔活學活用,再將Linux從源代碼開始移植到嵌入式系統,我敢說中國的企業你可以混的很好。

1、Linux基礎

你得宏如尺挑一個適合你的系統,然後在虛擬機安裝它,開始使用它。如果你想快速學會Linux,我有一個建議就是忘記圖形界面,不要想圖形界面能不能提供你問題的答案,而是滿世界的去找,去問,如何用命令行解決你的問題。

在這個過程中,你最好能將Linux的命令掌握的不錯,起碼常用的命令得知道,同時建立了自己的知識庫,裡面是你積累的各項知識。

2、Linux平台的C/C++開發,同時還有Bash腳本編程[java]

再下個階段,你需要學習的是Linux平台的C/C++開發,同時還有Bash腳本編程,如果你對Java興趣很深還有Java。同樣,建議你蔽高拋棄掉圖形界面的IDE,從VIM開始,為什麼是VIM,而不是Emacs,我無意挑起編輯器大戰,但我覺得VIM適合初學者,適合手比較笨,腦袋比較慢的開發者。 Emacs的鍵位太多,太復雜,我很畏懼。然後是GCC,Make,Eclipse(Java,C++或者)。

雖然將C++列在了Eclipse中,但我並不推薦用IDE開發C++,因為這不是Linux的文化,容易讓你忽略一些你應該注意的問題。 IDE讓你變懶,懶得跟豬一樣。如果你對程序調試,測試工作很感興趣,GDB也得學的很好,如果不是GDB也是必修課。這是開發的第一步,注意我並沒有提過一句Linux系統API的內容,這個階段也不要關心這個。你要做的就是積累經驗,在Linux平台的開發經驗。

我推薦的書如下:C語言程序設計。 C語言,白皮書當然更好。 C++推薦 C++ Primer Plus, Java我不喜歡,就不推薦了,附一個別人的書單:java 入門書籍。工具方面推薦VIM的官方手冊,GCC中文文檔,GDB中文文檔,GNU開源軟體開發指導(電子書),匯編語言程序設計(讓你對庫,鏈接,內嵌匯編,編譯器優化選項有初步了解,不必深度)。

如果你這個階段過不了就不必往下做了,這是底線,最基礎的基礎,否則離開,不要霍霍Linux開發。不專業的Linux開發者作出的程序是與Linux文化或UNIX文化相背的,程序是走不遠的,不可能像Bash,VIM這些神品一樣。所以做不好乾脆離開。

3、UNIX環境高級編程

UNIX環境高級編程堪稱神作,經典中的經典。

接下來進入Linux系統編程,不二選擇,APUE,UNIX環境高級編程,一遍一遍的看,看10遍都嫌少,如果你可以在大學將這本書翻爛,裡面的內容都實踐過,有作品,你口頭表達能力夠強,你可以在面試時說服所有的考官。

(可能有點誇張,但APUE絕對是聖經一般的讀物,即使是Windows程序員也從其中汲取養分, Google創始人的案頭書籍,扎爾伯克的床頭讀物。)

這本書看完後你會對Linux系統編程有相當的了解,知道Linux與Windows平台間開發的差異在哪?它們的優缺點在哪?我的總結如下:做Windows平台開發,很苦,微軟的系統API總在擴容,想使用最新潮,最高效的功能,最適合當前流行系統的功能你必須時刻學習。 Linux不是,Linux系統的核心API就100來個,記憶力好完全可以背下來。而且經久不變,為什麼不變,因為要同UNIX兼容,符合POSIX標准。所以Linux平台的開發大多是專注於底層的或伺服器編程。

這是其優點,當然圖形是Linux的軟肋,但我站在一個開發者的角度,我無所謂,因為命令行我也可以適應,如果有更好的圖形界面我就當作恩賜吧。另外,Windows閉源,系統做了什麼你更本不知道,永遠被微軟牽著鼻子跑,想想如果微軟說Win8不支持QQ,那騰訊不得哭死。而Linux完全開源,你不喜歡,可以自己改,只要你技術夠。

另外,Windows雖然使用的人多,但使用場合單一,專注與桌面。而Linux在各個方面都有發展,尤其在雲計算,伺服器軟體,嵌入式領域,企業級應用上有廣大前景,而且兼容性一流,由於支持POSIX可以無縫的運行在UNIX系統之上,不管是蘋果的Mac還是IBM的AS400系列,都是完全支持的。另外,Linux的開發環境支持也絕對是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就連C#也支持。而微軟除Visual Stdio套件以外,都不怎麼友好,不是嗎?

如果你看完APUE的感觸有很多,希望驗證你的某些想法或經驗,推薦UNIX程序設計藝術,世界頂級黑客將同你分享他的看法。

4、選擇方向:網路,圖形,嵌入式,設備驅動

網路方向:伺服器軟體編寫及高性能的並發程序編寫

現在是時候做分流了。大體上我分為四個方向:網路,圖形,嵌入式,設備驅動。

如果選擇網路,再細分,我對其他的不是他熟悉,只說伺服器軟體編寫及高性能的並發程序編寫吧。相對來說這是網路編程中技術含量最高的,也是底層的。需要很多的經驗,看很多的書,做很多的項目。

我的看法是以下面的順序來看書:

APUE再深讀– 尤其是進程,線程,IPC,套接字

多核程序設計- Pthread一定得吃透了,你很NB

UNIX網路編程– 卷一,卷二

TCP/IP網路詳解– 卷一再看上面兩本書時就該看了

5.TCP/IP 網路詳解– 卷二我覺得看到卷二就差不多了,當然卷三看了更好,努力,爭取看了

6.Lighttpd源代碼- 這個伺服器也很有名了

7.Nginx源代碼– 相較於Apache,Nginx的源碼較少,如果能看個大致,很NB。看源代碼主要是要學習裡面的套接字編程及並發控制,想想都激動。如果你有這些本事,可以試著往暴雪投簡歷,為他們寫伺服器後台,想一想全球的魔獸都運行在你的伺服器軟體上。

Linux內核 TCP/IP協議棧– 深入了解TCP/IP的實現

如果你還喜歡驅動程序設計,可以看看更底層的協議,如鏈路層的,寫什麼路由器,網卡,網路設備的驅動及嵌入式系統軟體應該也不成問題了。

當然一般的網路公司,就算網路級別的也該毫不猶豫的僱用你。只是看後面這些書需要時間與經驗,所以35歲以前辦到吧!跳槽到給你未來的地方!

圖形方向,我覺得圖形方向也是很有前途的,以下幾個方面。

Opengl的工業及游戲開發,國外較成熟。

影視動畫特效,如皮克斯,也是國外較成熟。

GPU計算技術,可以應用在瀏覽器網頁渲染上,GPU計算資源利用上,由於開源的原因,有很多的文檔程序可以參考。如果能進火狐開發,或google做瀏覽器開發,應該會很好。

嵌入式方向:嵌入式方向沒說的,Linux很重要。

掌握多個架構,不僅X86的,ARM的,單片機什麼的也必須得懂。硬體不懂我預見你會死在半路上,我也想走嵌入式方向,但我覺得就學校教授嵌入式的方法,我連學電子的那幫學生都競爭不過。奉勸大家,一定得懂硬體再去做,如果走到嵌入式應用開發,只能祝你好運,不要碰上像Nokia,Hp這樣的公司,否則你會很慘的。

驅動程序設計:

軟體開發周期是很長的,硬體不同,很快。每個月誕生那麼多的新硬體,怎麼讓他們在Linux上作業起來,這是你的作業。由於Linux的兼容性極好,假如不是太低層的驅動,根本C言語就能夠搞定,體系架構的影響不大,由於有體系支撐,你可能做少許更改就能夠在ARM上運用PC的硬體了,所以做硬體驅動開發不像嵌入式,對硬體常識的請求很高。

能夠嫻熟的建立常見的效勞,lnmp,ftp,dns,smba,假如呈現毛病,能夠及時的排除去。。。常常運用Linux,必定能夠變成大神。

原文鏈接:http://www.mage.com/71706.html

『貳』 linux椹卞姩宸ョ▼甯堟湁鍓嶉斿悧linux椹卞姩宸ョ▼甯

Linux鍐呮牳鍜岄┍鍔ㄥ紑鍙戝伐紼嬪笀鐨勫彂灞曞墠鏅鎬庝箞鏍鳳紵

鎴戜翰韜浣撻獙錛屾垜涔嬪墠鏄鍋氭暟鎺х郴緇熷紑鍙戠殑錛屽仛浜嗘湁涓冨叓騫達紝鏈墄86鐨勪駭鍝佷篃鏈塧rm鐨勪駭鍝侊紝x86鐨刲inux鐩稿瑰紑鍙戦┍鍔ㄧ殑鍦版柟涓嶅氾紝arm涓婃瘮杈冨氾紝瀛樺偍錛屾樉紺虹殑錛寀sb鐨勶紝鍚勭嶆葷嚎鐨勶紝闊抽戠殑錛岀綉緇滅殑錛屽緢澶氬湴鏂瑰彧瑕佹湁璁㈠埗闇奼傞兘瑕佹敼銆傞┍鍔ㄥ紑闂ㄦ涙瘮杈冮珮錛屼富瑕佷細杞浠惰繕寰椾簡瑙d簺紜浠剁煡璇嗭紝紜浠剁殑鍘熺悊鍥撅紝璁懼囩殑鏁版嵁鎵嬪唽錛屽伐浣滅壒鎬ч兘瑕佷細錛屽叆闂ㄩ毦浣嗘槸涓鏃﹀叆闂ㄤ簡灝辮窡鍏朵粬鐨勪竴鏍峰仛澶氫簡灝辯啛鎮変簡銆備箣鍓嶅叕鍙告槸linux+qt錛屼粖騫寸昏亴浜嗚繘浜嗕竴瀹跺畨鍗撳紑鍙戠殑鍏鍙革紝鐜板湪榪樺湪鍋氬畨鍗撶殑椹卞姩寮鍙戱紝鎰熻夊ぇ鍚屽皬寮傦紝鍙鏄紜浠跺鉤鍙板彉浜嗭紝寮鍙戠殑鍐呭逛粛鏄娌″彉銆傞┍鍔ㄨ繖涓鍧楋紝浜烘瘮杈冨皯錛岀浉瀵瑰緟閬囦篃浼氬ソ涓浜涳紝鐜板湪鎴戜篃涓嶇煡閬撴湭鏉ヤ細涓嶄細闅忕潃騫撮緞瓚婂ぇ錛屼細琚娣樻卑鎺夛紝浣嗘槸linux鏈韜鐨勫簲鐢ㄨ寖鍥存槸鎸哄箍鐨勶紝鑰屼笖浣滀負涓涓鎴愬姛鐨勫紑婧愰」鐩錛屽彧瑕佺ぞ浼氭湁闇奼傦紝鍚庨潰搴旇ヨ繕鏄浼氳騫挎硾搴旂敤錛岃嚦浜庝釜浜哄氨鐪嬭嚜宸辯殑鑳藉姏鍜岀簿鍔涗簡!

宓屽叆寮廘INUX椹卞姩宸ョ▼甯堢殑寰呴亣鎬庝箞鏍鳳紵

涓鑸錛屽伐浣滅粡楠屽湪1-2騫寸殑宓屽叆寮忓伐紼嬪笀鍚姘達紝鍩烘湰浼氬湪5000-8000鍏冪殑鑼冨洿錛岃岄殢鐫宸ヤ綔騫撮檺鐨勫炲姞錛岃柂璧勬按騫充篃浼氭湁杈冩槑鏄劇殑鎻愰珮銆3騫村伐浣滅粡楠岀殑1-2涓囷紝鍩烘湰涓嶆垚闂棰樸傛垜鏈変竴涓澶у﹀悓瀛2013騫村湪鍗庢竻榪滆佸︿範榪囧祵鍏ュ紡寮鍙戱紝鐜板湪宸ヨ祫閮戒笂涓囦簡錛佸氨鐪嬩綘鑷宸辨庝箞鎯

宓屽叆寮忓伐紼嬪笀涓庡悗絝寮鍙戝摢涓闅

宓屽叆寮忓伐紼嬪笀涓庡悗絝寮鍙戠浉姣旇繕鏄宓屽叆寮忓伐紼嬪笀姣旇緝闅俱傚祵鍏ュ紡椹卞姩宸ョ▼甯堬細緙栧啓鍜岀Щ妞嶅悇縐嶈姱鐗囬┍鍔(濡傞煶棰戣姱鐗)錛屼紭鍖栫‖浠惰懼囬┍鍔(濡傛俯婀垮害浼犳劅鍣)錛屽緱綺鵑氬悇縐嶇‖浠舵帴鍙e崗璁(濡侷2C鍗忚)銆佺郴緇熻皟搴︺佷俊鍙烽噺銆侀攣鏈哄埗絳夌瓑錛屽紑鍙戦毦搴︽渶澶с

璇ョ被寮鍙戣呬竴鑸鏄杞紜浠剁患鍚堝瀷浜烘墠錛屼竴鑸鐨勫祵鍏ュ紡椹卞姩宸ョ▼甯堟寚LINUX涓婄殑椹卞姩寮鍙戝伐紼嬪笀錛岄渶瑕佺簿閫歀inux椹卞姩妗嗘灦(platform妗嗘灦銆乮nput瀛愮郴緇熸嗘灦絳)錛岀粨鍚堣姱鐗囨湰韜鍘葷紪鍐欓┍鍔錛岄┍鍔ㄧ殑濂藉潖寰堝ぇ紼嬪害涓婂喅瀹氫竴涓浜у搧鐨勫ソ鍧忋

涓氱晫瀵歸┍鍔ㄤ漢鎵嶇殑瀹氫箟鏄涓夊勾鎵嶇畻鍏ラ棬錛屽彲瑙佹ら棬妲涗箣楂樸

『叄』 請問做嵌入式linux驅動開發的工作需要對驅動熟練到什麼程度才行

你好,樓主:
我可以給出一些見解,我是通過培訓,然後在此行業工作了近一年。針對你的問題,不同的公司有不同的錄取規則,沒有一個定式。當時找第一份工作前,我也有你的這種困擾,我把我的想法說一下,希望能幫到你。
如果你作為初級驅動工程師去面試,你只需要熟悉一些重要的驅動,比如I2C、SPI,而且自己做過此類驅動的小項目,再針對公司供應職業的需求好好做足功課。這個階段是入職後更專業地學習驅動。
如果你作為資深工程師,有多年經驗,自然地對大部分驅動十分了解,比如USB、網卡、存儲設備等等。
對於驅動框架啊,你一定是要了解並十分熟悉框架的,這樣才可以對相應驅動程序進行填充實現其功能。在面試找工作時這個方面會更重要些,但是我認為只要你認真地研究驅動代碼,是很容易掌握的,關鍵是信心與毅力。
「還有對驅動編寫完後的配置和編譯需要到達什麼程度?」這個問題問的好,這是企業和公司都關心的問題,它關心著產品的市場,至於到什麼程度,基本的功能你一定要很好地實現,如果時間充裕,盡量優化你的代碼,使驅動佔用更少的資源、更省電、數據傳輸更好等等。
以上為個人見解,祝成功!

『肆』 如何學習Linux設備驅動

通常,內核的升級對從事linux應用程序開發的人員來說影響較小,因為系統調用基本保持兼容,影響比較大的是驅動開發人員。每次內核的更新都可能導致許多內核函數原型上的變化,其中既有內核本身提供的函數,也有硬體平台代碼提供的函數,後者變化的更加頻繁。這一點從許多經典書籍就可驗證,當你按照手裡的經典著作,如:Alessandro的《linux設備驅動程序》,編寫驅動時,發現並不能夠成功的在你的linux平台上編譯通過、或不能正常執行,原因就在於你用的內核和書里的不一致。
本文從兩個方面去解釋這個問題,一方面是如何寫好linux設備驅動,另一方面是如何應對不斷升級的內核。
如何寫好Linux設備驅動
Linux設備驅動是linux內核的一部分,是用來屏蔽硬體細節,為上層提供標准介面的一種技術手段。為了能夠編寫出質量比較高的驅動程序,要求工程師必須具備以下幾個方面的知識:
● 熟悉處理器的性能
如:處理器的體系結構、匯編語言、工作模式、異常處理等。對於初學者來說,在還不熟悉驅動編寫方法的情況下,可以先不把重心放在這一項上,因為可能因為它的枯燥、抽象而影響到你對設備驅動的興趣。隨著你不斷地熟悉驅動的編寫,你會很自然的意識到此項的重要性。
● 掌握驅動目標的硬體工作原理及通訊協議
如:串口控制器、顯卡控制器、硬體編解碼、存儲卡控制器、I2C通訊、SPI通訊、USB通訊、SDIO通訊、I2S通訊、PCI通訊等。編寫設備驅動的前提就是需要了解設備的操作方法,所以這些內容的重要程度不言而喻。但不是說要把所有設備的操作方法都熟悉了以後才可以寫驅動,你只需要了解你要驅動的硬體就可以了。
● 掌握硬體的控制方法
如:中斷、輪詢、DMA 等,通常一個硬體控制器會有多種控制方法,你需要根據系統性能的需要合理的選擇操作方法。初學階段以實現功能為目的,掌握的順序應該是,輪詢->中斷->DMA。隨著學習的深入,需要綜合考慮系統的性能需求,採取合適的方法。
● 良好的GNU C語言編程基礎
如:C語言的指針、結構體、內存操作、鏈表、隊列、棧、C和匯編混合編程等。這些編程語法是編寫設備驅動的基礎,無論對於初學者還是有經驗者都非常重要。
● 良好的linux操作系統概念
如:多進程、多線程、進程調度、進程搶占、進程上下文、虛擬內存、原子操作、阻塞、睡眠、同步等概念及它們之間的關系。這些概念及方法在設備驅動里的使用是linux設備驅動區別單片機編程的最大特點,只有理解了它們才會編寫出高質量的驅動。
● 掌握linux內核中設備驅動的編寫介面
如:字元設備的cdev、塊設備的gendisk、網路設備的net_device,以及基於這些基本介面的framebuffer設備的fb_info、mtd設備的mtd_info、tty設備的tty_driver、usb設備的usb_driver、mmc設備的mmc_host等。
Linux內核為設備驅動編寫者提供了標準的介面,驅動編寫者無需精通內核的各個部分,只需要明確內核提供給我們的介面,並實現此介面就可以了。內核提供的介面採用的是面向對象的思路,即把目標設備抽象成一個對象,通常利用一個結構體來描述這個對象。驅動工程師的任務就是實現這個對象。這個結構體中會包含設備的屬性(用變數表示)和操作方法(用函數指針表示)。如:字元設備的cdev
struct cdev {
struct kobject kobj;
struct mole *owner;
const struct file_operations *ops; // 操作方法結合,其它項都是屬性
struct list_head list;
dev_t dev;
unsigned int count;
};
開始階段可以以模仿為主,即套用一些固定的模板、參考常式。
如何應對不斷升級的內核
內核升級對驅動的影響主要體現在,(1)驅動介面定義的變化;(2)內核的一些功能函數的名稱、參數、頭文件、宏定義的變化;(3)平台代碼關於硬體操作方面封裝的一些函數的變化;(4)設備模型的影響。
● 驅動介面定義的變化
如:2.4內核中字元設備驅動的注冊介面是:
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
而2.6內核中已經不建議使用這種方法了,改為:
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
這種介面定義及注冊方法帶來的變化,發生的並不頻繁。解決方案是:參考內核中的代碼。這種介面定義及注冊方法在內核中非常容易找到,如:字元設備驅動的注冊方法及介面定義可以參照內核driver/char/目錄下的很多實例。
● 內核的一些功能函數的名稱、參數、頭文件、宏定義的變化
如:中斷注冊函數的格式及參數在2.4內核、2.6內核低版本和高版本之間都存在差別,在2.6.8中,中斷注冊函數的定義為:
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irq_flags, const char * devname, void *dev_id)
irq_flags的取值主要為下面的某一種或組合: SA_INTERRUPT、SA_SAMPLE_RANDOM、SA_SHIRQ
在2.6.26中,中斷注冊函數的定義為:
int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
typedef irqreturn_t (*irq_handler_t)(int, void *); irq_flags的取值主要為下面的某一種或組合:(功能和2.6.8的對應)IRQF_DISABLED、IRQF_SAMPLE_RANDOM、IRQF_SHARED
當出現這些問題時,編譯過程中,編譯器會給我們比較明確的錯誤提示,根據這些提示你可以判斷出是否是缺少頭文件問題、是否是函數參數定義有誤等。解決問題的最好辦法還是到你的目標內核中找信息。此時找問題的方法可以藉助於搜索,如:你可以在新的內核中搜索request_irq,看新內核中的驅動是如何使用它的,這種方法非常有效。
● 平台代碼關於硬體操作方面封裝的一些函數的變化
內核中,硬體平台相關的代碼在內核更新過程中變化比較頻繁,和我們的設備驅動也是息息相關,所以在針對一個新內核編寫設備驅動前,一定要熟悉你的平台代碼的結構。有時平台雖然提供了內核要求的介面函數,但使用起來功能卻並不完善。下面還是先舉個例子說明平台代碼更新對設備驅動的影響。
如:在linux-2.6.8內核中,調用set_irq_type(IRQ_EINT0,IRQT_FALLING);去設置S3C2410的IRQ_EINT0的中斷觸發信號類型,你會發現不會有什麼效果。跟蹤代碼發現內核的set_irq_type函數需要平台提供一個針對硬體平台的實現函數
static struct irqchip s3c_irqext_chip = {
.mask = s3c_irqext_mask,
.unmask = s3c_irqext_unmask,
.ack = s3c_irqext_ack,
.type = s3c_irqext_type
};
s3c_irqext_type就是linux內核需要的實現函數,而s3c_irqext_type在2.6.8中的實現為: static int s3c_irqext_type(unsigned int irq, unsigned int type)
{
irqdbf("s3c_irqext_type: called for irq %d, type %d\n", irq, type);
return 0;
}
原來並沒有實現。而在較高版本的內核,如2.6.26內核中,這個函數是實現了的。所以你一定要小心。當平台函數不好用時,一定要查查原因,或者直接操作硬體寄存器來達到目的。
● 2.6內核設備模型對驅動的影響
在2.6內核中寫設備驅動和在2.4內核中有著很大的不同,主要就是在設備驅動中融入了比設備驅動本身結構還復雜、還難以理解的設備模型。初學驅動時你可以不理會設備模型,但你會發現內核里的驅動代碼基本上都是融入了設備模型的了。所以很多時候你不得不面對現實,還是要弄懂它,並且它也的注冊方法也會隨著內核的升級而發生變化。解決此類問題的最好方法還是參考目標內核驅動代碼。

閱讀全文

與精通linux設備驅動開發相關的資料

熱點內容
2021世界程序員節 瀏覽:478
php翼支付 瀏覽:880
盈通伺服器ip地址 瀏覽:787
3des演算法的c語言實現 瀏覽:871
網上怎樣購買伺服器地址 瀏覽:813
新氧app都在哪個城市 瀏覽:731
十二大加密貨幣圖片 瀏覽:315
資料庫日誌自動壓縮 瀏覽:929
手機表格文檔用哪個app 瀏覽:77
找人開發app的公司怎麼樣 瀏覽:651
android藍牙發送數據 瀏覽:428
範文瀾中國通史pdf 瀏覽:755
php常用的設計模式 瀏覽:889
安卓手機怎麼一個一個的截圖 瀏覽:980
javajsondate 瀏覽:356
matlab圖像處理演算法 瀏覽:670
安卓如何禁止手機自動降頻 瀏覽:697
一份加密不緊急的上行文 瀏覽:417
伺服器c5是什麼意思 瀏覽:444
基礎程序員證 瀏覽:425