Linux驅動-(一)驅動綜述

Linux驅動-(一)驅動綜述

一、Linux驅動

  • Linux是一個成功的優秀的開源項目,隨着應用的日益廣泛,Linux已受到越來越多的軟件開發者的追捧。但是從官網上面下載下來Linux源碼後,我們會發現Linux的世界是如此巨大,代碼量是如此巨大。要想學習,Linux到底該從哪裏入手呢?

    之前在一本很有名氣講述Linux的書中,看到作者有提到兩個不錯的突破口,可以幫助我們更好的進入Linux的世界—網絡和驅動。

    那麼從本篇博文開始我將本着學習和交流的態度在這裏分享一些關於Linux驅動相關的一些知識,一些是我從書上或是其他博文看到的,一些是我自己的編程體會,我將這些都融入到一起記錄在這裏。讓我們一起開始Linux驅動開發之旅吧!

  • Linux的驅動開發的是內核級別的開發,所以他對編程的要求會更加的高。因爲,我們很小的一個紕漏都很有可能導致系統的崩潰。特別注意的是在內核開發過程中指針的使用,每一步必須清楚的知道自己的指針是指向何處的,以及它訪問的地址是否是合法的。

  • 同裸機開發一樣,驅動開發同樣也需要進行中斷的處理。在內核驅動中中斷又分爲中斷上下文,即一部分先去響應中斷,一部分去處理中斷。(這部分後續會詳細講述,這裏只是提出一個概念)

  • 驅動程序是要被上層應用程序調用的,所以我們應該給上層應用程序提供好API,以供上層程序去調用。當然啦,這也就是驅動程序的核心所在啦,誰讓我們是系統層的編程呢?當然要爲運行在我們是上面的程序提供一個合適的環境以及硬件驅動的接口啦。

  • 每一類驅動都有一個特定的驅動模板,以後統一稱之爲驅動框架吧。所有的驅動都有一種類似的實現模式,就是構造核心的數據結構,然後註冊到內核。編寫驅動,實際上就是去學習這些核心的數據結構和與之相關的一套API(注意這句話,後面基本是圍繞這句話來是實現相關驅動的講解)。同樣我們在編寫內核驅動的時候,應該儘量利用內核中已有的實現而不是自己重新去構建,因爲很多已有的實現能夠經歷長時間的挑選能夠被留在內核,足以說明其經典性以及穩定性,當然瞭如果你技術足夠好而且想要做一些特定功能,當然可以自己去構建了,誰讓Linux是一個開放的操作系統呢。

二、Linux驅動分類

  • 當然啦,上面有講過,不同設備類型不同與之對應的驅動框架也是不同的,那麼Linux中的驅動框架主要分爲哪些呢?其實,Linux的驅動主要分爲以下三種:
  1. 字符設備這類設備的訪問是按照字節流(類似文件)一樣被訪問的設備,由字符設備驅動程序來實現這種特性。字符驅動程序至少要實現open(),close(),read()以及write()等的系統調用。例如:字符終端(/dev/console)和串口(/dev/ttySo以及類似設備)就是兩個字符設備,他們可以很好的說明"流"的概念。字符設備可以通過設備節點來訪問,比如:/dev/tty1和/dev/lp0等等。這些設備文件和普通文件之間的唯一差別在於對普通文件的訪問可以先後移動訪問位置,而大多數字符設備是一個只能順序訪問的數據通道。然而,也存在具有數據特性的字符設備,訪問他們可前後移動位置。例如framebuffer就是這樣一個設備,APP可以通過map或lseek訪問抓取整個圖像。

  2. 塊設備:所謂塊設備就是每次讀寫時只能傳輸一個完整的或多個完整的塊,而每塊包含512個字節(或2的更高字節的數據)。和字符設備類似,塊設備也是通過/dev目錄下的文件系統節點來訪問。塊設備,例如磁盤上能夠容納filesystem。塊設備和字符設備的去唄在於內核內部管理數據的方式,也就是內核及驅動程序之間的接口,在內核中,塊設備的驅動程序的接口和字符設備完全不同。

  3. 網絡設備:網絡設備呢,和上面兩個都不一樣。當然啦,它要更加複雜一些。我們知道任何網絡事物都需要經過一個網絡接口形成,網絡接口是一個能夠和其他主機交換數據的設備。接口通常是一個硬件設備,但是通常也可能是一個純軟件設備,比如迴環(loopback)接口。網絡接口是由內核中的網絡子系統驅動的,負責發送和接收數據包。由於不是面向流的設備,因此將網絡設備接口映射到filesystem中的節點(比如/dev/tty1)比較困難。Unix訪問網絡接口的方法仍然是給他們分配一個唯一的名字(比如:rth0),但這個名字在filesystem中不存在對應的節點。內核和網絡驅動程序的通信,完全不同於內核和字符設備以及塊設備之間的通信,內核調用一套和數據包相關的函數而不是上面提到的read和write等。

  • 好啦,通過上面的分析我們已經在心裏對Linux設備驅動有了一個清晰的分類。
  • Linux驅動是基於GNU C的一些標準開發的,其中包含了一些C語言語法的擴展和GNU C的一些標準。(GNU呢,是當前世界上最大的一個軟件開源組織,Linux就是其開源項目之一。想要具體瞭解的小夥伴可以去網上搜搜看看)

  • 當然啦,想要對Linux內核有一個基礎瞭解的小夥伴可以去看下我的另一篇博文,裏面有對Linux內核的一些基礎介紹:
    內核基礎知識介紹

  • 最後,是文中提到的一些網站的地址,我把他們貼到這裏,供查閱使用

    GNU C標準相關文檔:
    https://www.kernel.org/doc/Documentation/CodingStytle

    Linux 原碼下載網址:
    https://www.kernel.org/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章