linux 裝置驅動基本概念

weixin_A13253323604發表於2020-12-17
學習linux裝置驅動首先我們必須明確以下幾個概念,為我們接下來學習linux驅動打下堅實的基礎:

  • 應用程式、庫、核心、驅動程式的關係
  • 裝置型別
  • 裝置檔案、主裝置號與從裝置號
  • 驅動程式與應用程式的區別
  • 使用者態與核心態
  • Linux驅動程式功能

一、應用程式、庫、核心、驅動程式的關係

    1)應用程式呼叫一系列函式庫,通過對檔案的操作完成一系列功能:

       應用程式以檔案形式訪問各種硬體裝置(linux特有的抽象方式,把所有的硬體訪問抽象為對檔案的讀寫、設定)

       函式庫:

         部分函式無需核心的支援,由庫函式內部通過程式碼實現,直接完成功能

         部分函式涉及到硬體操作或核心的支援,由核心完成對應功能,我們稱其為系統呼叫

    2)核心處理系統呼叫,根據裝置檔案型別、主裝置號、從裝置號(後面會講解),呼叫裝置驅動程式;

    3)裝置驅動直接與硬體通訊;



二、裝置型別

    硬體是千變萬化的,沒有八千也有一萬了,就像世界上有三種人:男人、女人、女博士一樣,linux做了一個很偉大也很艱難的分類:把所有的硬體裝置分為三大類:字元裝置、塊裝置、網路裝置。

1)字元裝置:字元(char)裝置是個能夠像位元組流(類似檔案)一樣被訪問的裝置。

    對字元裝置發出讀/寫請求時,實際的硬體I/O操作一般緊接著發生;

        字元裝置驅動程式通常至少要實現open、close、read和write系統呼叫。

    比如我們常見的lcd、觸控式螢幕、鍵盤、led、串列埠等等,就像男人是用來幹活的一樣,他們一般對應具體的硬體都是進行出具的採集、處理、傳輸。

2)塊裝置:一個塊裝置驅動程式主要通過傳輸固定大小的資料(一般為512或1k)來訪問裝置。

   塊裝置通過buffer cache(記憶體緩衝區)訪問,可以隨機存取,即:任何塊都可以讀寫,不必考慮它在裝置的什麼地方。

    塊裝置可以通過它們的裝置特殊檔案訪問,但是更常見的是通過檔案系統進行訪問。

    只有一個塊裝置可以支援一個安裝的檔案系統。 

    比如我們常見的電腦硬碟、SD卡、U盤、光碟等,就像女人一樣是用來儲存資訊的。

3)網路介面:任何網路事務都經過一個網路介面形成,即一個能夠和其他主機交換資料的裝置。

    訪問網路介面的方法仍然是給它們分配一個唯一的名字(比如eth0),但這個名字在檔案系統中不存在對應的節點。

    核心和網路裝置驅動程式間的通訊,完全不同於核心和字元以及塊驅動程式之間的通訊,核心呼叫一套和資料包傳輸相關的函式(socket函式)而不是read、write等。

    比如我們常見的網路卡裝置、藍芽裝置,就像女博士一樣,數量稀少但又不可或缺。

    linux中所有的驅動程式最終都能歸到這三種裝置中,當然他們之間也沒有非常嚴格的界限,這些都是程式中對他們的劃分而已,比如一個sd卡,我們也可以把它封裝成字元裝置去操作也是沒有問題的。就像。。。


三、裝置檔案、主裝置號、從裝置號

有了裝置型別的劃分,那麼應用程式應該怎樣訪問具體的硬體裝置呢?

或者說已經確定他是一個男人了,那麼怎麼從萬千世界中區分他與他的不同呢?

答案是:姓名,在linux驅動中也就是裝置檔名。

那麼重名怎麼辦?

答案是:身份證號,在linux驅動中也就是裝置號(主、從)。

裝置檔案:

在linux

系統

中有一個約定俗成的說法:“一切皆檔案”,

應用程式使用裝置檔案節點訪問對應裝置,

Linux下的各種硬體裝置以檔案的形式存放於/dev目錄下,可以使用ls /dev 檢視

Linux把對硬體的操作全部抽象成對檔案的操作
(open,read,write,close,…)


每個裝置檔案都有其檔案屬性(c或者b),使用ls /dev -l 的命令檢視,
表明其是字元裝置或者塊裝置,網路裝置沒有在這個資料夾下,用來明其性別(男人、女人)


主裝置號、從裝置號

在裝置管理中,除了裝置型別外,核心還需要一對被稱為主從裝置號的引數,才能唯一標識一個裝置,類似人的身份證號

主裝置號:

    用於標識驅動程式,相同的主裝置號使用相同的驅動程式,例如:S3C2440 有串列埠、LCD、觸控式螢幕三種裝置,他們的主裝置號各不相同;

從裝置號:

    用於標識同一驅動程式的不同硬體

    例:PC的IDE裝置,主裝置號用於標識該硬碟,從裝置號用於標識每個分割槽,2440有三個串列埠,每個串列埠的主裝置號相同,從裝置號用於區分具體屬於那一個串列埠。


四、驅動程式與應用程式的區別

應用程式以main開始

驅動程式沒有main,它以一個模組初始化函式作為入口

應用程式從頭到尾執行一個任務

驅動程式完成初始化之後不再執行,等待系統呼叫

應用程式可以使用glibc等標準C函式庫

驅動程式不能使用標準C庫

五、使用者態與核心態的區分

驅動程式是核心的一部分,工作在核心態

應用程式工作在使用者態

資料空間訪問問題

無法通過指標直接將二者的資料地址進行傳遞

系統提供一系列函式幫助完成資料空間轉換
get_user
put_user
copy_from_user
copy_to_user


六、Linux驅動程式功能

對裝置初始化和釋放資源

把資料從核心傳送到硬體和從硬體讀取資料

讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料

檢測和處理裝置出現的錯誤(底層協議)

用於區分具體裝置的例項


相關文章