Linux裝置模型

2021-10-06 08:13:07 字數 2036 閱讀 9640

linux裝置驅動模型

我們在寫最簡單的裝置驅動程式的時候,我們將所有的硬體資訊都儲存在了驅動**中,這樣有乙個非常明顯的不足:會導致驅動程式的通用性極差,一旦硬體平台或硬體連線有鎖改變,就一定要修改驅動**。為了解決這個問題,linux在2.6版本之後,新增了「匯流排—裝置—驅動」的linux裝置模型,有效地實現了裝置和驅動的分離。

該裝置模型通過幾個資料結構來反映當前系統中匯流排、裝置以及驅動的工作狀況,提出了以下幾個重要概念:

1、匯流排

在實際的應用中,大部分的外設都是連線在匯流排上,它們之間的物理連線,如下圖所示:

在驅動設計中,匯流排驅動的主要工作是負責管理兩個鍊錶。分別是新增到該匯流排的裝置鍊錶以及註冊到該匯流排的驅動鏈表。當你向匯流排新增(移除)乙個裝置(驅動)時,便會在對應的列表上新增新的節點,同時對掛載在該匯流排的驅動以及裝置進行匹配,在匹配過程中會忽略掉那些已經有驅動匹配的裝置。

前面我們說過,核心是以資料結構的方式來管理匯流排、裝置和驅動的,那麼在核心中匯流排的資料結構是怎樣的呢?核心中使用結構體bus_type來表示匯流排,具體內容如下:

struct bus_type 

;

我們可以通過下面兩個函式向核心註冊或登出乙個匯流排。

//註冊匯流排

intbus_register

(struct bus_type *bus)

;//登出匯流排

void

bus_unregister

(struct bus_type *bus)

;

但是,linux核心已經為我們寫好了大部分匯流排驅動,我們一般不用自行去註冊乙個新的匯流排。

/sys/bus/目錄中包含了當前系統中已經註冊了的所有匯流排,例如i2c,spi,platform等。每個匯流排目錄都擁有兩個子目錄devices和drivers,分別記錄著掛載在該匯流排的所有裝置以及驅動。

2、裝置

在核心使用device結構體來描述我們的物理裝置,如下所示:

struct device 

;

我們可以通過下面兩個核心api函式向核心註冊或登出乙個裝置:

//註冊裝置

intdevice_register

(struct device *dev)

;//登出裝置

void

device_unregister

(struct device *dev)

;

當成功註冊匯流排時,會在/sys/bus目錄下建立對應匯流排的目錄,該目錄下有兩個子目錄,分別是drivers和devices,我們使用device_register註冊的裝置從屬於某個匯流排時,該匯流排的devices目錄下便會存在該裝置檔案。

3、驅動

裝置能否正常工作,取決於驅動。驅動需要告訴核心,自己可以驅動哪些裝置,如何初始化裝置。在核心中,使用device_driver結構體來描述我們的驅動。

struct device_driver 

;

核心提供了driver_register函式以及driver_unregister函式來註冊/登出驅動,成功註冊的驅動會記錄在/sys/bus/< bus >/drivers目錄,函式原型如下所示:

int

driver_register

(struct device_driver *drv)

;void

driver_unregister

(struct device_driver *drv)

;

linux裝置模型

linux核心的整體架構 linux裝置模型 linux裝置模型 1 基本概念 linux裝置模型 2 kobject linux裝置模型 3 uevent linux裝置模型 4 sysfs linux裝置模型 5 device和device driver linux裝置模型 6 bus linu...

Linux裝置驅動模型

核心版本 2.6.29 裝置驅動模型框架是linux驅動程式設計的基礎。它通過kobject,kset,ktype等底層資料結構將bus type,device,device driver 等高層資料結構組織起來,形成乙個層次 分類清晰的驅動模型。優點如下 1.重用。將物件抽象為匯流排 驅動 裝置三...

linux字元裝置模型

字元裝置的結構體 struct dev t dev 字元裝置模組的載入和解除安裝函式 static int init init void else ret cdev add dev.cdev,dev no,1 裝置驅動模組的解除安裝函式 static void exit exit void 字元裝置...