詳細介紹 Linux 2.6 設備的驅動模型

火星人 @ 2014-03-26 , reply:0
←手機掃碼閱讀


1.背景

  隨著設備拓撲結構越來越複雜,需要為內核建立一個統一的設備模型,對系統結構做一般性的抽象描述。

  有了該抽象結構,可支持多種不同的任務:

  a) 電源管理 完成電源管理工作需要對系統結構的理解,且有嚴格的順序,如:一個USB宿主適配器,在處理完所有與其相連接的設備面前是不能關閉的;

  b) 與用戶空間通信 由/sysfs虛擬文件系統展示設備的屬性

  c) 熱插拔設備

  d) 對象生命周期

2.sysfs 虛擬文件系統

  sysfs 是一個特殊的文件系統,類似於/proc。sysfs不僅象/proc一樣允許用戶空間訪問內核的數據,而且它以更結構化的方式向用戶提供內核數據信息。

  sysfs的一個目的就是展示設備驅動模型中各組件的層次關係。其頂級目錄包括:
CODE:
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

a) block
b) device
c) bus
d) drivers
e) class
f) power
g) firmware

  每個目錄代表一個kobject對象,每個文件代表kobject的屬性。

3. Kobject、Kset 和 subsystem

  3.1 Kobject

  Kobject 是組成設備模型的基本結構。類似於C++中的基類,它嵌入於更大的對象的對象中--所謂的容器--用來描述設備模型的組件。如bus, devices, drivers 都是典型的容器。

  容器有了kobject之後,允許內核:

  a) 保存對容器的引用計數

  b) 保存容器之間的層次關係

  c) 為每個容器的屬性提供一個用戶視圖
CODE:
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

struct kobject{
char * k_name;
char name[20];
struct k_ref kref;
struct list_head entry;
struct kobject * parent;
struct kset * kset;
struct ktype * ktype;
struct dentry * dentry;
};
struct kobj_type{
void (*release) (struct kobject *);
struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};

  3.2 Kset

  一個kset是嵌入相同類型結構的kobject集合。
CODE:
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

struct kset{
struct subsystem * subsys;
struct kobj_type ktype;
struct list_head list;
struct kobject kobj;
struct kset_hotplug_ops * hotplug_ops;
};

  3.3 Subsystem

  一系列的kset就組成了subsystem. subsystem可以包括不同類型的kset, 它只有兩個成員
CODE:
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

struct subsystem{
struct kset kset;
struct rw_semaphore rwsem;
};

4.設備驅動模型的組件

  4.1 device

  4.2 drive

  4.3 bus

  4.4 class




[火星人 via ] 詳細介紹 Linux 2.6 設備的驅動模型已經有209次圍觀

http://www.coctec.com/docs/linux/show-post-189582.html