搞Linux裝置驅動,你應該明白這幾個問題

2021-09-24 16:27:40 字數 2618 閱讀 3834

想要深入理解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 中文叫內容分發網路。實...