歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux驅動基礎開發

Linux驅動基礎開發

日期:2017/3/1 11:15:38   编辑:Linux編程
目前,Linux軟件工程師大致可分為兩個層次:

 (1)Linux應用軟件工程師(Application Software Engineer):

主要利用C庫函數和Linux API進行應用軟件的編寫;

從事這方面的開發工作,主要需要學習:符合linux posix標准的API函數及系統調用,linux的多任務編程技巧:多進程、多線程、進程間通信、多任務之間的同步互斥等,嵌入式數據庫的學習,UI編程:QT、miniGUI等。

 (2)Linux固件工程師(Firmware Engineer):

主要進行Bootloader、Linux的移植及Linux設備驅動程序的設計工作。


一般而言,固件工程師的要求要高於應用軟件工程師的層次,而其中的Linux設備驅動編程又是Linux程序設計中比較復雜的部分,究其原因,主要包括如下幾個方面: 1)設備驅動屬於Linux內核的部分,編寫Linux設備驅動需要有一定的Linux操作系統內核基礎;需要了解部分linux內核的工作機制與系統組成 2)編寫Linux設備驅動需要對硬件的原理有相當的了解,大多數情況下我們是針對一個特定的嵌入式硬件平台編寫驅動的,例如:針對特定的主機平台:可能是三星的2410、2440,也可能是atmel的,或者飛思卡爾的等等 3)Linux設備驅動中廣泛涉及到多進程並發的同步、互斥等控制,容易出現bug;因為linux本身是一個多任務的工作環境,不可避免的會出現在同一時刻對同一設備發生並發操作 4)由於屬於內核的一部分,Linux設備驅動的調試也相當復雜。linux設備驅動沒有一個很好的IDE環境進行單步、變量查看等調試輔助工具;linux驅動跟linux內核工作在同一層次,一旦發生問題,很容易造成內核的整體崩潰。

本系列文章我們將一步步、深入淺出的介紹linux設備驅動編程中設計的一些問題及學習方法,希望對大家學習linux設備驅動有所幫助。

在任何一個計算機系統中,大至服務器、PC機、小至手機、mp3/mp4播放器,無論是復雜的大型服務器系統還是一個簡單的流水燈單片機系統,都離不開驅動程序的身影,沒有硬件的軟件是空中樓閣,沒有軟件的硬件只是一堆廢鐵,硬件是底層的基礎,是所有軟件得以運行的平台,代碼最終會落實到硬件上的邏輯組合。

但是硬件與軟件之間存在一個駁論:為了快速、優質的完成軟件功能設計,應用程序工程師不想也不願關心硬件,而硬件工程師也很難有功夫去處理軟件開發中的一些應用。例如軟件工程師在調用printf的時候,不許也不用關心信息到底是通過什麼樣的處理,走過哪些通路顯示在該顯示的地方,硬件工程師在寫完了一個4*4鍵盤驅動後,無需也不必管應用程序在獲得鍵值後做哪些處理及操作。

也就是說軟件工程師需要看到一個沒有硬件的純軟件世界,硬件必須透明的提供給他,誰來實現這一任務?答案是驅動程序,驅動程序從字面解釋就是:“驅使硬件設備行動”。驅動程序直接與硬件打交道,按照硬件設備的具體形式,驅動設備的寄存器,完成設備的輪詢、中斷處理、DMA通信,最終讓通信設備可以收發數據,讓顯示設備能夠顯示文字和畫面,讓音頻設備可以完成聲音的存儲和播放。

可見,設備驅動程序充當了硬件和軟件之間的樞紐,因此驅動程序的表現形式可能就是一些標准的、事先協定好的API函數,驅動工程師只需要去完成相應函數的填充,應用工程師只需要調用相應的接口完成相應的功能。無論有沒有操作系統,驅動程序都有其存在價值,只是在裸機情況下,工作環境比較簡單、完成的工作較單一,驅動程序完成的功能也就比較簡單,同時接口只要在小范圍內符合統一的標准即可。但是在有操作系統的情況下,此問題就會被放大:硬件來自不同的公司、千變萬化,全世界每天都會有大量的新芯片被生產,大量的電路板被設計出來,如果沒有一個很好的統一標准去規范這一程序,操作系統就會被設計的非常冗余,效率會非常低。

所以無論任何操作系統都會制定一套標准的架構去管理這些驅動程序:linux作為嵌入式操作系統的典范,其驅動架構具有很高的規范性與聚合性,不但把不同的硬件設備分門別類、綜合管理,並且針對不同硬件的共性進行了統一抽象,將其硬件相關性降到最低,大大簡化了驅動程序的編寫,形成了具有其特色的驅動組織架構。


下圖反映了應用程序、linux內核、驅動程序、硬件的關系。

linux內核分為5大部分:多任務管理、內存管理、文件系統管理、設備管理、網絡管理; 每一部分都有承上下的作用,對上提供API接口,提供給應用開發工程師使用; 對下通過驅動程序屏蔽不同的硬件構成,完成硬件的具體操作。
Copyright © Linux教程網 All Rights Reserved