天天看點

《Linux裝置驅動開發詳解 A》一一1.4 Linux裝置驅動

本節書摘來華章計算機出版社《linux裝置驅動開發詳解 a》一書中的第1章,第1.4節,作者:宋寶華 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。1

1.4.1 裝置的分類及特點

計算機系統的硬體主要由cpu、存儲器和外設組成。随着ic制作工藝的發展,目前,晶片的內建度越來越高,往往在cpu内部就內建了存儲器和外設擴充卡。譬如,相當多的arm、powerpc、mips等處理器都內建了uart、i2c控制器、spi控制器、usb控制器、sdram控制器等,有的處理器還內建了gpu(圖形處理器)、視訊編解碼器等。

驅動針對的對象是存儲器和外設(包括cpu内部內建的存儲器和外設),而不是針對cpu核心。linux将存儲器和外設分為3個基礎大類。

字元裝置。

塊裝置。

網絡裝置。

字元裝置指那些必須以串行順序依次進行通路的裝置,如觸摸屏、錄音帶驅動器、滑鼠等。塊裝置可以按任意順序進行通路,以塊為機關進行操作,如硬碟、emmc等。字元裝置和塊裝置的驅動設計有出很大的差異,但是對于使用者而言,它們都要使用檔案系統的操作接口open()、close()、read()、write()等進行通路。

在linux系統中,網絡裝置面向資料包的接收和發送而設計,它并不傾向于對應于檔案系統的節點。核心與網絡裝置的通信與核心和字元裝置、網絡裝置的通信方式完全不同,前者主要還是使用套接字接口。

1.4.2 linux裝置驅動與整個軟硬體系統的關系

如圖1.5所示,除網絡裝置外,字元裝置與塊裝置都被映射到linux檔案系統的檔案和目錄,通過檔案系統的系統調用接口open()、write()、read()、close()等即可通路字元裝置和塊裝置。所有字元裝置和塊裝置都統一呈現給使用者。linux的塊裝置有兩種通路方法:一種是類似dd指令對應的原始塊裝置,如“/dev/sdb1”等;另外一種方法是在塊裝置上建立fat、ext4、btrfs等檔案系統,然後以檔案路徑如“/home/barry/hello.txt”的形式進行通路。在linux中,針對nor、nand等提供了獨立的記憶體技術裝置(memory technology device,mtd)子系統,其上運作yaffs2、jffs2、ubifs等具備擦除和負載均衡能力的檔案系統。針對磁盤或者flash裝置的fat、ext4、yaffs2、jffs2、ubifs等檔案系統定義了檔案和目錄在存儲媒體上的組織。而linux的虛拟檔案系統則統一對它們進行了抽象。

《Linux裝置驅動開發詳解 A》一一1.4 Linux裝置驅動

圖1.5 linux裝置驅動與整個軟硬體系統的關系

應用程式可以使用linux的系統調用接口程式設計,但也可使用c庫函數,出于代碼可移植性的目的,後者更值得推薦。c庫函數本身也通過系統調用接口而實作,如c庫函數fopen()、fwrite()、fread()、fclose()分别會調用作業系統的api open()、write()、read()、close()。

1.4.3 linux裝置驅動的重點、難點

linux裝置驅動的學習是一項浩繁的工程,包含如下重點、難點。

編寫linux裝置驅動要求工程師有非常好的硬體基礎,懂得sram、flash、sdram、磁盤的讀寫方式,uart、i2c、usb等裝置的接口以及輪詢、中斷、dma的原理,pci總線的工作方式以及cpu的記憶體管理單元(mmu)等。

編寫linux裝置驅動要求工程師有非常好的c語言基礎,能靈活地運用c語言的結構體、指針、函數指針及記憶體動态申請和釋放等。

編寫linux裝置驅動要求工程師有一定的linux核心基礎,雖然并不要求工程師對核心各個部分有深入的研究,但至少要明白驅動與核心的接口。尤其是對于塊裝置、網絡裝置、flash裝置、序列槽裝置等複雜裝置,核心定義的驅動體系結構本身就非常複雜。

編寫linux裝置驅動要求工程師有非常好的多任務并發控制和同步的基礎,因為在驅動中會大量使用自旋鎖、互斥、信号量、等待隊列等并發與同步機制。

上述經驗值的擷取并非朝夕之事,是以要求我們有足夠的學習恒心和毅力。對這些重點、難點,本書都會在相應章節進行講解。

動手實踐永遠是學習任何軟體開發的最好方法,學習linux裝置驅動也不例外。是以,本書使用的是通過qemu模拟的arm vexpress電路闆,本書中的所有執行個體均可在該“電路闆”上直接執行。

閱讀經典書籍和參與linux社群的讨論也是非常好的學習方法。linux核心源代碼中包含了一個documentation目錄,其中包含了一批核心設計文檔,全部是文本檔案。很遺憾,這些文檔的組織不太好,内容也不夠細緻。

學習linux裝置驅動的一個注意事項是要避免管中窺豹、隻見樹木不見森林,因為各類linux裝置驅動都從屬于一個linux裝置驅動的架構,單純而片面地學習幾個函數、幾個資料結構是不可能理清驅動中各組成部分之間的關系的。是以,linux驅動的分析方法是點面結合,将對函數和資料結構的了解放在整體架構的背景之中。這是本書各章節講解驅動的方法。

繼續閱讀