linux內核驅動開發
Ⅰ linux 內核和驅動開發工程師的發展前景怎麼樣
目前Linux內核和驅動開發工程師的發展前景主要有以下幾點:
從事嵌入式開發是當下比較熱門的一個領域,做職業規劃的時候,比較清晰的是有三條路可以走:
C1、嵌入式軟體開發工程師
C2、嵌入式硬體開發工程師
C3、嵌入式驅動開發工程師。
其中
C1是計算機相關專業的同學可以選擇的,因為學習的課程相對偏軟,平時在PC上編程比較多,做軟體開發會相對輕松。
C2是學習電子電路的同學可以考慮,對模擬電路比較熟悉,可以設計出質量好的電路板。
C3的難度比較大,需要同時熟悉軟體和硬體,真正的做到軟、硬相結合,搭建軟體和硬體互通的橋梁,當然了在業界的待遇也是相對來說比較高的。
我們可以去一些招聘網站查看相關企業的崗位要求,這樣學習的時候就有了一個比較明確的目標。今天看到一位前輩的博文,談究竟應該如何成為優秀的驅動開發工程師,很受鼓舞,在此與大家分享共勉。
何謂優秀的驅動開發工程師
首先要定義,我所認為的一個優秀的驅動開發工程師,應該具備什麼樣的能力,這里列一下按照從易到難的順序,個人認為應該會有幾個方面的要求吧:
能夠獨立完成驅動的功能開發任務
能夠分析和優化驅動的性能,針對特定硬體揚長避短
能夠充分了解模塊相關軟硬體能力、發展方向,輔助應用工程師最大化利用硬體能力
能夠輔助硬體工程師規劃硬體設計,預防問題,謀求功能模塊的最佳方案
能夠協助定義系統架構,合理規劃軟硬體,謀求產品實現的最佳方案
作為一個驅動工程師,很多時候不是完全從頭開發一個完整的子系統,而是針對特定硬體和平台移植驅動,增加功能,解決Bug等等,如果從這方面外在的表現來看:
解決問題的境界,大概會有這么幾個階段:
不知道哪裡存在BUG
不知道如何解決BUG
知道如何解決BUG
知道如何發現BUG
知道如何規劃BUG
知道如何發現BUG(而不是撞上BUG)其實並不簡單,需要你對系統有足夠的了解,能夠察覺可能出問題的地方。
而規劃Bug更難,需要你能對問題的輕重緩急做出准確的判斷。沒有的完美的世界,只有適當的取捨,規避和預防。
而從解決問題過程的角度來看,我認可以分為幾個階段:
BUG發生 -> 大量跟蹤調試代碼 -> 終於發現並解決BUG
BUG發生 -> 理論推測可能原因 -> 迅速定位並解決BUG
閱讀代碼 -> 預測可能出現的BUG -> 證實並解決BUG
應該具備怎樣的素質
那麼要達到上訴最佳境界,需要具備和發展哪些素質和能力呢?
一、足夠的硬體知識
能看簡單的原理圖,能夠分析硬體異常的可能原因,能夠使用常見的硬體調試工具,我想這是做為優秀的驅動工程師,區別與其它軟體工程師,所不可避免、必須具備的專業素質。當然取決於你具體從事的工作,對這方面的要求不盡相同。
對於驅動開發者來說,不了解所開發驅動外設的硬體原理和相關背景知識,也許很多時候,也能夠完成一些移植,修補的工作任務,但這就好比無源之水,無根之木,我相信是很難走遠的。
二、多多益善的操作系統知識
做驅動開發,特別是純粹的外設的驅動移植工作,剛開始的時候,也許你並不需要了解很多操作系統本身的知識(像內存管理,進程調度,鎖,各種內核子系統的原理框架等等),也能順利完成手頭的一些工作。
但是,如果一但需要優化驅動,需要完善軟體框架,或者是遇上疑難問題需要跟蹤解決,對操作系統,內核本身的了解,就體現出它的價值了。
對於Linux內核驅動開發者,尤其如此,首先,代碼是完全開源的,你有條件去了解背後的運行機制,其次,Linux內核和各個組成子系統總是在迅速的進化發展中,不進則退,你也有必要跟上時代發展的腳步。
三、強烈的好奇心,持續的熱情
如果驅動開發不僅僅是你的愛好,更是你養家糊口的途徑,我想,很多時候,你大概不會有機會專注於一兩個你最有經驗的模塊的開發和維護。隨著能力的成長,勢必會要求你接觸和掌握越來越多的各式各樣的驅動模塊的開發。
對於這件事,包括我自己,有時候大概都會有如下幾種反應:
哇,原來的工作做太久了,太乏味了,很高興能做不同的工作。
啊?又要做別的模塊啊?我手頭的工作已經太多了!
這個模塊沒意思,我不想做。
相信多數有志青年們都是第一種表現了,不過,有些時候,我發覺,很多人的這種熱情其實並不持久,一個新的模塊沒做多久,就再次厭倦了,是已經爐火純青了么,未必,或許只是修改了幾個BUG以後不甚其煩。很多時候,我面試前來求職的工程師時,發現簡歷上這個也做過,那個也做過,但是一旦問到解決了什麼問題,所做過的驅動,框架、流程、原理之類的問題的時候,就一問三不知了。
我覺得如果自己的目標是優秀,那麼最起碼的標准應該是對具體驅動模塊相關的子系統的整體工作流程,框架,具備足夠的好奇心,樂於去了解和學習,而不僅僅是為了完成任務而工作,否則的話,很難積累下扎實的經驗和技術。
四、清晰的邏輯思維能力
這一點,也許是個軟體開發人員都應該具備吧,不過,做為驅動開發工程師來說,有時候,大多數情況下,工作的硬體環境並不是完美的,遇到問題需要分析判斷錯誤的原因是硬體問題還是驅動Bug,這時候,清晰的邏輯思維能力尤其重要。
五、良好的工作習慣
大多數人都不是天才,要成為優秀的開發工程師,其一需要持續努力,其二需要時間積累經驗,而這過程中,很重要的一點,就是要有良好的工作習慣。譬如,注意設計文檔的維護,對工作中遇到的問題的記錄,過往經驗的及時記錄,適當的軟體開發流程等等。文檔工作,可能很多人很不願意去做,它的確很花費時間。不過,唉。。。老啦,好記性不如爛筆頭啊
。當然,其實設計文檔更多的是為你提供思考的機會,而過往經驗的總結,也可以起到和大家交流技術,共同進步的目的。
六、英語
這個也是必須的啦,沒有辦法,郵件列表,技術文檔,社區,精通英語肯定是很大的優勢,做開源項目尤其如此。閱讀各種Spec標准文檔之類的速度還是很重要的。閱讀無障礙是一回事,能和母語一樣一目十行,那才爽呀,唉,人生苦短,效率啊!光讀文檔,就不知道要比老外多花多少時間。
Ⅱ linux驅動開發要有哪些基礎
需要一定的努力才可以學好:
Linux設備驅動是linux內核的一部分,是用來屏蔽硬體細節,為上層提供標准介面的一種技術手段。為了能夠編寫出質量比較高的驅動程序,要求工程師必須具備以下幾個方面的知識:
1、 熟悉處理器的性能
如:處理器的體系結構、匯編語言、工作模式、異常處理等。對於初學者來說,在還不熟悉驅動編寫方法的情況下,可以先不把重心放在這一項上,因為可能因為它的枯燥、抽象而影響到你對設備驅動的興趣。隨著你不斷地熟悉驅動的編寫,你會很自然的意識到此項的重要性。
2、掌握驅動目標的硬體工作原理及通訊協議
如:串口控制器、顯卡控制器、硬體編解碼、存儲卡控制器、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嵌入式開發和Linux內核/驅動開發有什麼區別
前者強調的是產品(linux嵌入式產品),而後者強調的是軟體(內核和驅動)。
一般做linux嵌入式產品時都要涉及linux驅動和內核,當然不僅僅是內核驅動,還有gui系統,和其他軟體等。
而做linux內核驅動則不一定用於嵌入式產品,也可以用於開發pc機(也就是一般的x86架構)軟體。
Ⅳ 驅動開發必須使用開發板廠家提供的Linux源碼嗎
驅動開發環境
要進行linux驅動開發我們首先要有linux內核的源碼樹,並且這個linux內核的源碼樹要和開發板中的內核源碼樹要一直;
比如說我們開發板中用的是linux kernel內核版本為2.6.35.7,在我們ubuntu虛擬機上必須要有同樣版本的源碼樹,
我們再編譯好驅動的的時候,使用modinfo XXX命令會列印出一個版本號,這個版本號是與使用的源碼樹版本有關,如果開發板中源碼樹中版本與
modinfo的版本信息不一致使無法安裝驅動的;
我們開發板必須設置好nfs掛載;這些在根文件系統一章有詳細的介紹;
Ⅳ Linux 內核驅動介面詳解
寫作本文檔的目的,是為了解釋為什麼Linux既沒有二進制內核介面,也沒有穩定 的內核介面。這里所說的內核介面,是指內核里的介面,而不是內核和用戶空間 的介面。內核到用戶空間的介面,是提供給應用程序使用的系統調用,系統調用 在 歷史 上幾乎沒有過變化,將來也不會有變化。我有一些老應用程序是在0.9版本 或者更早版本的內核上編譯的,在使用2.6版本內核的Linux發布上依然用得很好 。用戶和應用程序作者可以將這個介面看成是穩定的。
你也許以為自己想要穩定的內核介面,但是你不清楚你要的實際上不是它。你需 要的其實是穩定的驅動程序,而你只有將驅動程序放到公版內核的源代碼樹里, 才有可能達到這個目的。而且這樣做還有很多其它好處,正是因為這些好處使得 Linux能成為強壯,穩定,成熟的操作系統,這也是你最開始選擇Linux的原因。
只有那些寫驅動程序的「怪人」才會擔心內核介面的改變,對廣大用戶來說,既 看不到內核介面,也不需要去關心它。
既然只談技術問題,我們就有了下面兩個主題:二進制內核介面和穩定的內核源 代碼介面。這兩個問題是互相關聯的,讓我們先解決掉二進制介面的問題。
假如我們有一個穩定的內核源代碼介面,那麼自然而然的,我們就擁有了穩定的 二進制介面,是這樣的嗎?錯。讓我們看看關於Linux內核的幾點事實:
對於一個特定的內核,滿足這些條件並不難,使用同一個C編譯器和同樣的內核配 置選項來編譯驅動程序模塊就可以了。這對於給一個特定Linux發布的特定版本提 供驅動程序,是完全可以滿足需求的。但是如果你要給不同發布的不同版本都發 布一個驅動程序,就需要在每個發布上用不同的內核設置參數都編譯一次內核, 這簡直跟噩夢一樣。而且還要注意到,每個Linux發布還提供不同的Linux內核, 這些內核都針對不同的硬體類型進行了優化(有很多種不同的處理器,還有不同 的內核設置選項)。所以每發布一次驅動程序,都需要提供很多不同版本的內核 模塊。
相信我,如果你真的要採取這種發布方式,一定會慢慢瘋掉,我很久以前就有過 深刻的教訓…
如果有人不將他的內核驅動程序,放入公版內核的源代碼樹,而又想讓驅動程序 一直保持在最新的內核中可用,那麼這個話題將會變得沒完沒了。 內核開發是持續而且快節奏的,從來都不會慢下來。內核開發人員在當前介面中 找到bug,或者找到更好的實現方式。一旦發現這些,他們就很快會去修改當前的 介面。修改介面意味著,函數名可能會改變,結構體可能被擴充或者刪減,函數 的參數也可能發生改變。一旦介面被修改,內核中使用這些介面的地方需要同時 修正,這樣才能保證所有的東西繼續工作。
舉一個例子,內核的USB驅動程序介面在USB子系統的整個生命周期中,至少經歷 了三次重寫。這些重寫解決以下問題:
這和一些封閉源代碼的操作系統形成鮮明的對比,在那些操作系統上,不得不額 外的維護舊的USB介面。這導致了一個可能性,新的開發者依然會不小心使用舊的 介面,以不恰當的方式編寫代碼,進而影響到操作系統的穩定性。 在上面的例子中,所有的開發者都同意這些重要的改動,在這樣的情況下修改代 價很低。如果Linux保持一個穩定的內核源代碼介面,那麼就得創建一個新的介面 ;舊的,有問題的介面必須一直維護,給Linux USB開發者帶來額外的工作。既然 所有的Linux USB驅動的作者都是利用自己的時間工作,那麼要求他們去做毫無意 義的免費額外工作,是不可能的。 安全問題對Linux來說十分重要。一個安全問題被發現,就會在短時間內得到修 正。在很多情況下,這將導致Linux內核中的一些介面被重寫,以從根本上避免安 全問題。一旦介面被重寫,所有使用這些介面的驅動程序,必須同時得到修正, 以確定安全問題已經得到修復並且不可能在未來還有同樣的安全問題。如果內核 內部介面不允許改變,那麼就不可能修復這樣的安全問題,也不可能確認這樣的 安全問題以後不會發生。 開發者一直在清理內核介面。如果一個介面沒有人在使用了,它就會被刪除。這 樣可以確保內核盡可能的小,而且所有潛在的介面都會得到盡可能完整的測試 (沒有人使用的介面是不可能得到良好的測試的)。
如果你寫了一個Linux內核驅動,但是它還不在Linux源代碼樹里,作為一個開發 者,你應該怎麼做?為每個發布的每個版本提供一個二進制驅動,那簡直是一個 噩夢,要跟上永遠處於變化之中的內核介面,也是一件辛苦活。 很簡單,讓你的驅動進入內核源代碼樹(要記得我們在談論的是以GPL許可發行 的驅動,如果你的代碼不符合GPL,那麼祝你好運,你只能自己解決這個問題了, 你這個吸血鬼把Andrew和Linus對吸血鬼的定義鏈接到這里>)。當你的代碼加入 公版內核源代碼樹之後,如果一個內核介面改變,你的驅動會直接被修改介面的 那個人修改。保證你的驅動永遠都可以編譯通過,並且一直工作,你幾乎不需要 做什麼事情。
把驅動放到內核源代碼樹里會有很多的好處:
Ⅵ 求教怎麼學習linux內核驅動
1.首先要了解為什麼要學習內核?下圖已表明,如果要從事驅動開發或系統研究,就要學習內核。
2.內核的知識就像下面的繩結一樣,一環扣一環,我們要解開它們,就必須要先找到線頭也就是內核中的函數介面。初學階段,我們一般不深入的研究內核代碼,會使用內核的介面函數就不錯了。
3.下面提供了如何學習這些內核函數的方法,就像解繩子一樣
4.學習內核的四步法則,思維導圖的設計尤為重要,這也是能否學習好內核的關鍵
5.語言基礎也需要扎實,所以需要把C語言鞏固鞏固
Ⅶ Linux內核開發與Linux驅動開發有什麼關系
驅動裝在系統上,有的會跟內核有交互,但是驅動一般是針對設備
Ⅷ linux軟體開發能轉驅動嗎
linux軟體開發能轉驅動。Linux驅動開發也屬於內核開發中的設備驅動開發。linux也是需要驅動程序的。驅動程序是操作系統操作控制特定硬體的一個中間層,他給和操作系統對接來控制具體的硬體。
Linux的特點
Linux,全稱GNU/Linux,是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。伴隨著互聯網的發展,Linux得到了來自全世界軟體愛好者、組織、公司的支持。
它除了在伺服器方面保持著強勁的發展勢頭以外,在個人電腦、嵌入式系統上都有著長足的進步。使用者不僅可以直觀地獲取該操作系統的實現機制,而且可以根據自身的需要來修改完善Linux,使其最大化地適應用戶的需要。
Linux不僅系統性能穩定,而且是開源軟體。其核心防火牆組件性能高效、配置簡單,保證了系統的安全。在很多企業網路中,為了追求速度和安全,Linux不僅僅是被網路運維人員當作伺服器使用,甚至當作網路防火牆,這是Linux的一大亮點。
Ⅸ 如何系統的學習Linux驅動開發
在學習之前一直對驅動開發非常的陌生,感覺有點神秘。不知道驅動開發和普通的程序開發究竟有什麼不同;它的基本框架又是什麼樣的;他的開發環境有什麼特殊的地方;以及怎麼寫編寫一個簡單的字元設備驅動前編譯載入,下面我就對這些問題一個一個的介紹。
一、驅動的基本框架
1.那麼究竟什麼是驅動程序,它有什麼用呢:
l驅動是硬體設備與應用程序之間的一個中間軟體層
l它使得某個特定硬體能夠響應一個定義良好的內部編程介面,同時完全隱蔽了設備的工作細節
l用戶通過一組與具體設備無關的標准化的調用來完成相應的操作
l驅動程序的任務就是把這些標准化的系統調用映射到具體設備對於實際硬體的特定操作上
l驅動程序是內核的一部分,可以使用中斷、DMA等操作
l驅動程序在用戶態和內核態之間傳遞數據
2.Linux驅動的基本框架
3.Linux下設備驅動程序的一般可以分為以下三類
1)字元設備
a)所有能夠象位元組流一樣訪問的設備都通過字元設備來實現
b)它們被映射為文件系統中的節點,通常在/dev/目錄下面
c)一般要包含open read write close等系統調用的實現
2)塊設備
d)通常是指諸如磁碟、內存、Flash等可以容納文件系統的存儲設備。
e)塊設備也是通過文件系統來訪問,與字元設備的區別是:內核管理數據的方式不同
f)它允許象字元設備一樣以位元組流的方式來訪問,也可一次傳遞任意多的位元組。
3)網路介面設備
g)通常它指的是硬體設備,但有時也可能是一個軟體設備(如回環介面loopback),它們由內核中網路子系統驅動,負責發送和接收數據包。
h)它們的數據傳送往往不是面向流的,因此很難將它們映射到一個文件系統的節點上。
二、怎麼搭建一個驅動的開發環境
因為驅動是要編譯進內核,在啟動內核時就會驅動此硬體設備;或者編譯生成一個.o文件,當應用程序需要時再動態載入進內核空間運行。因此編譯任何一個驅動程序都要鏈接到內核的源碼樹。所以搭建環境的第一步當然是建內核源碼樹
1.怎麼建內核源碼樹
a)首先看你的系統有沒有源碼樹,在你的/lib/ moles目錄下會有內核信息,比如我當前的系統里有兩個版本:
#ls /lib/ moles
2.6.15-rc72.6.21-1.3194.fc7
查看其源碼位置:
## ll /lib/moles/2.6.15-rc7/build
lrwxrwxrwx 1 root root 27 2008-04-28 19:19 /lib/moles/2.6.15-rc7/build -> /root/xkli/linux-2.6.15-rc7
發現build是一個鏈接文件,其所對應的目錄就是源碼樹的目錄。但現在這里目標目錄已經是無效的了。所以得自己重新下載
b)下載並編譯源碼樹
有很多網站上可以下載,但官方網址是:
http://www.kernel.org/pub/linux/kernel/v2.6/
下載完後當然就是解壓編譯了
# tar –xzvf linux-2.6.16.54.tar.gz
#cd linux-2.6.16.54
## make menuconfig (配置內核各選項,如果沒有配置就無法下一步編譯,這里可以不要改任何東西)
#make
…
如果編譯沒有出錯。那麼恭喜你。你的開發環境已經搭建好了
三、了解驅動的基本知識
1.設備號
1)什麼是設備號呢?我們進系統根據現有的設備來講解就清楚了:
#ls -l /dev/
crwxrwxrwx 1 root root1,3 2009-05-11 16:36 null
crw------- 1 root root4,0 2009-05-11 16:35 systty
crw-rw-rw- 1 root tty5,0 2009-05-11 16:36 tty
crw-rw---- 1 root tty4,0 2009-05-11 16:35 tty0
在日期前面的兩個數(如第一列就是1,3)就是表示的設備號,第一個是主設備號,第二個是從設備號
2)設備號有什麼用呢?
l傳統上,主編號標識設備相連的驅動.例如, /dev/null和/dev/zero都由驅動1來管理,而虛擬控制台和串口終端都由驅動4管理
l次編號被內核用來決定引用哪個設備.依據你的驅動是如何編寫的自己區別
3)設備號結構類型以及申請方式
l在內核中, dev_t類型(在中定義)用來持有設備編號,對於2.6.0內核, dev_t是32位的量, 12位用作主編號, 20位用作次編號.
l能獲得一個dev_t的主或者次編號方式:
MAJOR(dev_t dev); //主要
MINOR(dev_t dev);//次要
l但是如果你有主次編號,需要將其轉換為一個dev_t,使用: MKDEV(int major, int minor);
4)怎麼在程序中分配和釋放設備號
在建立一個字元驅動時需要做的第一件事是獲取一個或多個設備編號來使用.可以達到此功能的函數有兩個:
l一個是你自己事先知道設備號的
register_chrdev_region,在中聲明:
int register_chrdev_region(dev_t first, unsigned int count, char *name);
first是你要分配的起始設備編號. first的次編號部分常常是0,count是你請求的連續設備編號的總數. name是應當連接到這個編號范圍的設備的名子;它會出現在/proc/devices和sysfs中.
l第二個是動態動態分配設備編號
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
使用這個函數, dev是一個只輸出的參數,它在函數成功完成時持有你的分配范圍的第一個數. fisetminor應當是請求的第一個要用的次編號;它常常是0. count和name參數如同給request_chrdev_region的一樣.
5)設備編號的釋放使用
不管你是採用哪些方式分配的設備號。使用之後肯定是要釋放的,其方式如下:
void unregister_chrdev_region(dev_t first, unsigned int count);
6)
2.驅動程序的二個最重要數據結構
1)file_operation
倒如字元設備scull的一般定義如下:
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};
file_operation也稱為設備驅動程序介面
定義在,是一個函數指針的集合.每個打開文件(內部用一個file結構來代表)與它自身的函數集合相關連(通過包含一個稱為f_op的成員,它指向一個file_operations結構).這些操作大部分負責實現系統調用,因此,命名為open, read,等等
2)File
定義位於include/fs.h
struct file結構與驅動相關的成員
lmode_t f_mode標識文件的讀寫許可權
lloff_t f_pos當前讀寫位置
lunsigned int_f_flag文件標志,主要進行阻塞/非阻塞型操作時檢查
lstruct file_operation * f_op文件操作的結構指針
lvoid * private_data驅動程序一般將它指向已經分配的數據
lstruct dentry* f_dentry文件對應的目錄項結構
3.字元設備注冊
1)內核在內部使用類型struct cdev的結構來代表字元設備.在內核調用你的設備操作前,必須編寫分配並注冊一個或幾個這些結構.有2種方法來分配和初始化一個這些結構.
l如果你想在運行時獲得一個獨立的cdev結構,可以這樣使用:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
l如果想將cdev結構嵌入一個你自己的設備特定的結構;你應當初始化你已經分配的結構,使用:
void cdev_init(struct cdev *cdev, struct file_operations *fops);
2)一旦cdev結構建立,最後的步驟是把它告訴內核,調用:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
說明:dev是cdev結構, num是這個設備響應的第一個設備號, count是應當關聯到設備的設備號的數目.常常count是1,但是有多個設備號對應於一個特定的設備的情形.
3)為從系統去除一個字元設備,調用:
void cdev_del(struct cdev *dev);
4.open和release
Ⅹ linux內核和驅動開發,有什麼經典的書籍推薦嗎
linux內核最經典的書是《深入理解Linux內核》,這本書內核編程看;如果你是搞UNIX/Linux環境下的應用程序編程,那麼就看《UNIX環境高級編程》;如果做Linux下設備驅動程序開發,就看《Linux設備驅動》(第三版)。這幾本都是老外寫的,都是很經典的書。