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裝置驅動之字元裝置驅動Linux字元
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之塊裝置驅動Linux
- Linux塊裝置驅動Linux
- 蛻變成蝶:Linux裝置驅動之字元裝置驅動Linux字元
- 蛻變成蝶~Linux裝置驅動之字元裝置驅動Linux字元
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 【linux】驅動-7-平臺裝置驅動Linux
- Linux裝置驅動程式 (轉)Linux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 乾坤合一:Linux裝置驅動之USB主機和裝置驅動Linux
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- Linux裝置驅動探究第1天----spi驅動(1)Linux
- Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置DemoLinux筆記Ubuntu
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- linux裝置驅動編寫入門Linux
- linux裝置驅動編寫基礎Linux
- LINUX下的裝置驅動程式 (轉)Linux
- 《Linux裝置驅動開發詳解(第2版)》——第1章Linux裝置驅動概述及開發環境構建1.1裝置驅動的作用Linux開發環境
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- 【linux】驅動-9-裝置樹外掛Linux
- linux驅動之獲取裝置樹資訊Linux
- linux裝置驅動中的併發控制Linux
- LED字元裝置驅動字元
- Linux驅動之I2C匯流排裝置以及驅動Linux
- Linux下的硬體驅動——USB裝置(上)(驅動配置部分)(轉)Linux
- 驅動Driver-MISC雜項驅動裝置
- 蛻變成蝶:Linux裝置驅動之DMALinux
- Linux裝置驅動之中斷與定時器Linux定時器
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- 字元驅動裝置踩坑字元
- platform 裝置驅動實驗Platform
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- Linux的input輸入子系統:裝置驅動之按鍵驅動Linux
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- Windows裝置和驅動的安裝Windows
- Linux驅動之裝置樹的基礎知識Linux
- 【Linux 中斷】紅外接收器裝置驅動Linux