linux的sysfs與驅動模型體會1

2021-05-25 02:28:46 字數 2713 閱讀 6021

使用的linux版本是2.6.18

1、概念與重要的資料結構

sysfs是乙個虛擬的檔案系統,這個檔案系統的目錄結構實質上就是核心物件模型樹。

kobject:核心物件,是模型樹中的基本組成單位

53struct kobject ;
kset:物件集合

127struct kset ;
ktype:描述kobject的屬性,可通過對屬性的操作來作一些資訊的獲取或更改

96 struct kobj_type ;
subsystem:子系統,實則上是乙個kset,在高層次的概念 

176struct subsystem ;
2、結構圖

《參見ldd3的sysfs部分》關於kset與kobject之間的關係圖。

從該圖可以看出,結構的組成,主要就是kset和kobject來組成各種高層次的結構。

3、bus子系統基本結構

38struct bus_type ;
bus_type內嵌了乙個subsystem subsys,所以bus_type可以看作是乙個類子系統,實則上就是乙個子系統。

通過分析i2c匯流排的註冊過程和對應在sysfs中的目錄結構來看。

bus_type– i2c_bus_type

在/sys/目錄下,看到目錄實際上對應乙個子系統。而我們要在這些子系統下新建一些子系統,對於i2c匯流排,我們要在bus子系統下掛接我們的i2c子系統。通過bus_register(&i2c_bus_type)來完成這一操作。具體的操作實際上就是插入乙個kobject。

(1)對i2c的sub_sys的kobject設定名稱,唯一的名稱,這個名稱會在/sys/bus/下看到。

kobject_set_name(i2c_bus_type.sub_sys.kset.kobject);
(2)然後就是設定這個子系統的父結點,也就是設定這個子系統的父子系統。所有匯流排的父子系統都是

bus_subsys。

i2c_bus_type.sub_sys.kset.kobject.kset= bus_subsys.kset
(3)最後將

i2c_bus_type子系統加入到

bus_subsys集合內的子系統鍊錶中。

i2c_bus_type.sub_sys.kset.kobject.parent= bus_subsys.kset.kobject

add_list_tail(i2c_bus_type.sub_sys.kset.kobject.entry,

bus_subsys.kset.list)

以上的操作,基本上把i2c_bus_type對應的子系統加入到bus_subsys下面了,在/sys/bus/下面可以看到i2c目錄。

在bus_type中可以看到有兩個kset,drivers和devices。這兩個kset屬於i2c子系統下的兩個集合。所以將這兩個kset掛接到i2c子系統下面。

(4)掛接devices到i2c子系統下面,完成後可在/sys/bus/i2c下看到devices目錄

kobject_set_name(devices.kobject,「devices」);

devices.subsys= &i2c_bus_type.sub_sys;

devices.kobject.parent= i2c_bus_type.sub_sys.kset.kobject

add_list_tail(devices.kobject,i2c_bus_type.sub_sys.kset.list);

(5)同理,掛接drivers到i2c子系統下面,完成後可在/sys/bus/i2c下看到drivers目錄

kobject_set_name(devices.kobject,「devices」);

devices.subsys= &i2c_bus_type.sub_sys;

devices.kobject.parent= i2c_bus_type.sub_sys.kset.kobject

add_list_tail(devices.kobject,i2c_bus_type.sub_sys.kset.list);

4、

bus子系統的裝置與驅動

394struct device ;  

120struct device_driver ;

註冊驅動程式:

driver_register(&i2c_adapter_driver);
i2c_adapter_driver內嵌了乙個

kobject,也就是說它將以乙個

kobject的模型掛接在系統的模型樹里,在

sysfs中,作為乙個目錄節點。

kobject_set_name(i2c_adapter_driver.kobject,i2c_adatpter_driver.name)

i2c_adapter_driver.kobject.kset= i2c_adapter_driver.bus->sub_sys.kset

add_list_tail(i2c_adapter_driver.kobject,i2c_adapter_driver.kobject.kset.klist)

Linux裝置驅動模型(sysfs)

匯流排模型概述 隨著技術的發展,系統的拓撲結構也越來越複雜,對熱插拔。跨平台移植性的要求越來越高,從linux2.6核心開始提供全新的裝置模型。將所有的驅動掛載到計算機的匯流排上 比如 usb匯流排 當有裝置連線到匯流排上的時候,匯流排能夠感知到,這時系統就會把掛載到匯流排上是所有驅動和裝置匹配。通...

Linux下的sysfs與udev的關係是什麼?

sysfs sysfs 把連線在系統上的裝置和匯流排組織成為乙個分級的檔案,它們可以被從使用者 的空間訪問到。簡單介紹sysfs檔案系統,您可能想知道 sysfs 是怎麼認出系統中存在的裝置以及應 該使用什麼裝置號。對於已經編入核心的驅動程式,當被核心檢測到的時候,會直接 在 sysfs 中註冊其物...

《驅動學習 sysfs檔案系統的編寫》

1.sysfs檔案系統 sysfs檔案系統可以把核心空間的資料 屬性 鏈結等輸出到使用者空間。反過來,使用者也可以通過sysfs檔案系統,往對應的核心空間傳遞資料。例如 echo 1 sys class gpio gpio64 value,就是改變gpio64的值。cat sys class gpi...