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
系統
中有一個約定俗成的說法:“一切皆檔案”,
應用程式使用裝置檔案節點訪問對應裝置,
主裝置號、從裝置號
在裝置管理中,除了裝置型別外,核心還需要一對被稱為主從裝置號的引數,才能唯一標識一個裝置,類似人的身份證號
主裝置號:
用於標識驅動程式,相同的主裝置號使用相同的驅動程式,例如:S3C2440 有串列埠、LCD、觸控式螢幕三種裝置,他們的主裝置號各不相同;
從裝置號:
用於標識同一驅動程式的不同硬體
例:PC的IDE裝置,主裝置號用於標識該硬碟,從裝置號用於標識每個分割槽,2440有三個串列埠,每個串列埠的主裝置號相同,從裝置號用於區分具體屬於那一個串列埠。
應用程式以main開始
驅動程式沒有main,它以一個模組初始化函式作為入口
應用程式從頭到尾執行一個任務
驅動程式完成初始化之後不再執行,等待系統呼叫
應用程式可以使用glibc等標準C函式庫
驅動程式不能使用標準C庫
五、使用者態與核心態的區分
驅動程式是核心的一部分,工作在核心態
應用程式工作在使用者態
資料空間訪問問題
無法通過指標直接將二者的資料地址進行傳遞
系統提供一系列函式幫助完成資料空間轉換
get_user
put_user
copy_from_user
copy_to_user
對裝置初始化和釋放資源
把資料從核心傳送到硬體和從硬體讀取資料
讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料
檢測和處理裝置出現的錯誤(底層協議)
用於區分具體裝置的例項
相關文章
- 【linux】驅動-7-平臺裝置驅動Linux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- linux裝置驅動編寫入門Linux
- Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置DemoLinux筆記Ubuntu
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- 【Linux SPI】RFID RC522 裝置驅動Linux
- 【linux】驅動-9-裝置樹外掛Linux
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- linux驅動之獲取裝置樹資訊Linux
- Linux驅動之I2C匯流排裝置以及驅動Linux
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- LED字元裝置驅動字元
- Linux驅動之裝置樹的基礎知識Linux
- 【Linux 中斷】紅外接收器裝置驅動Linux
- 驅動Driver-MISC雜項驅動裝置
- Linux裝置驅動開發詳解:基於Linux4.0核心Linux
- 【linux】驅動-8-一文解決裝置樹Linux
- platform 裝置驅動實驗Platform
- 字元驅動裝置踩坑字元
- Linux驅動實踐:你知道【字元裝置驅動程式】的兩種寫法嗎?Linux字元
- ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字元裝置驅動Linux字元
- 【Linux裝置驅動】–0x00簡單的模組Linux
- 嵌入式Linux中的LED驅動控制(裝置樹方式)Linux
- 05_雜項裝置驅動
- mtd裝置驅動(待學習)
- win10驅動未知裝置怎麼辦_win10裝置管理器驅動未知裝置處理方法Win10
- 嵌入式Linux中的LED驅動控制(裝置樹方式)(續)Linux
- pci匯流排驅動及pci裝置驅動註冊
- 裝置驅動程式包可以刪除嗎 win10裝置驅動程式包能刪嗎Win10
- 非同步通知和MISC裝置驅動非同步
- iOS 裝置驅動 for windows 32&64iOSWindows
- 無作業系統時的裝置驅動和有作業系統時的裝置驅動作業系統
- platform_driver驅動及裝置驅動匹配識別符號Platform符號
- 裝置樹下的 LED 驅動實驗
- 字元裝置驅動——申請、建立、應用.字元