想要深入理解linux裝置驅動,你必須明確以下幾個問題:
· 應用程式、庫、核心、驅動程式的關係
· 裝置型別
· 裝置檔案、主裝置號與從裝置號
· 驅動程式與應用程式的區別
· 使用者態與核心態
· linux驅動程式功能
一、應用程式、庫、核心、驅動程式的關係
應用程式呼叫一系列函式庫,通過對檔案的操作完成一系列功能。
應用程式以檔案形式訪問各種硬體裝置(linux特有的抽象方式,把所有的硬體訪問抽象為對檔案的讀寫、設定)
函式庫:
部分函式無需核心的支援,由庫函式內部通過**實現,直接完成功能
部分函式涉及到硬體操作或核心的支援,由核心完成對應功能,我們稱其為系統呼叫
核心處理系統呼叫,根據裝置檔案型別、主裝置號、從裝置號(後面會講解),呼叫裝置驅動程式。
裝置驅動直接與硬體通訊。
二、裝置型別
硬體是千變萬化的,沒有八千也有一萬了,就像世界上有三種人:男人、女人、女博士一樣,linux做了乙個很偉大也很艱難的分類:把所有的硬體裝置分為三大類:字元裝置、塊裝置、網路裝置。
字元裝置:字元(char)裝置是個能夠像位元組流(類似檔案)一樣被訪問的裝置。
對字元裝置發出讀/寫請求時,實際的硬體i/o操作一般緊接著發生;
字元裝置驅動程式通常至少要實現open、close、read和write系統呼叫。
比如我們常見的lcd、觸控螢幕、鍵盤、led、串列埠等等,就像男人是用來幹活的一樣,他們一般對應具體的硬體都是進行出具的採集、處理、傳輸。
塊裝置:乙個塊裝置驅動程式主要通過傳輸固定大小的資料(一般為512或1k)來訪問裝置。
塊裝置通過buffer cache(記憶體緩衝區)訪問,可以隨機訪問,即:任何塊都可以讀寫,不必考慮它在裝置的什麼地方。
塊裝置可以通過它們的裝置特殊檔案訪問,但是更常見的是通過檔案系統進行訪問。
只有乙個塊裝置可以支援乙個安裝的檔案系統。
比如我們常見的電腦硬碟、sd卡、u盤、光碟等,就像女人一樣是用來儲存資訊的。
網路介面:任何網路事務都經過乙個網路介面形成,即乙個能夠和其他主機交換資料的裝置。
訪問網路介面的方法仍然是給它們分配乙個唯一的名字(比如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驅動程式功能
對裝置初始化和釋放資源
把資料從核心傳送到硬體和從硬體讀取資料
讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料
檢測和處理裝置出現的錯誤(底層協議)
用於區分具體裝置的例項
搞Linux裝置驅動,你應該明白這幾個問題
想要深入理解linux裝置驅動,你必須明確以下幾個問題 應用程式 庫 核心 驅動程式的關係 裝置型別 裝置檔案 主裝置號與從裝置號 驅動程式與應用程式的區別 使用者態與核心態 linux驅動程式功能 一 應用程式 庫 核心 驅動程式的關係 1 應用程式呼叫一系列函式庫,通過對檔案的操作完成一系列功能...
程式設計師要搞明白CDN,這篇應該夠了
最近在了解邊緣計算,發現我們經常聽說的cdn也是邊緣計算裡的一部分。那麼說到cdn,好像只知道它中文叫做內容分發網路。那麼具體cdn的原理是什麼?能夠為使用者在瀏覽 時帶來什麼好處呢?解決這兩個問題是本文的目的。cdn全稱叫做content delivery network,中文叫內容分發網路。實際...
程式設計師要搞明白CDN,這篇應該夠了
最近在了解邊緣計算,發現我們經常聽說的cdn也是邊緣計算裡的一部分。那麼說到cdn,好像只知道它中文叫做內容分發網路。那麼具體cdn的原理是什麼?能夠為使用者在瀏覽 時帶來什麼好處呢?解決這兩個問題是本文的目的。cdn全稱叫做 content delivery network 中文叫內容分發網路。實...