自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

概括介紹Linux統(tǒng)一設(shè)備基本結(jié)構(gòu)

運(yùn)維 系統(tǒng)運(yùn)維
sysfs 是在這個(gè) Linux統(tǒng)一設(shè)備模型的開(kāi)發(fā)過(guò)程中的一項(xiàng)副產(chǎn)品(見(jiàn) 參考資料 中 Greg K. Hartman 寫作的 LinuxJournal 文章)。

經(jīng)過(guò)長(zhǎng)時(shí)間學(xué)習(xí)Linux統(tǒng)一設(shè)備,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。在 Linux 2.5 內(nèi)核的開(kāi)發(fā)過(guò)程中,人們?cè)O(shè)計(jì)了一套新的設(shè)備模型,目的是為了對(duì)計(jì)算機(jī)上的所有Linux統(tǒng)一設(shè)備進(jìn)行統(tǒng)一地表示和操作,包括Linux統(tǒng)一設(shè)備本身和設(shè)備之間的連接關(guān)系。

這個(gè)模型是在分析了 PCI 和 USB 的總線驅(qū)動(dòng)過(guò)程中得到的,這兩個(gè)總線類型能代表當(dāng)前系統(tǒng)中的大多數(shù)設(shè)備類型,它們都有完善的熱挺拔機(jī)制和電源管理的支持,也都有級(jí)連機(jī)制的支持,以橋接的 PCI/USB 總線控制器的方式可以支持更多的 PCI/USB 設(shè)備。為了給所有設(shè)備添加統(tǒng)一的電源管理的支持,而不是讓每個(gè)Linux統(tǒng)一設(shè)備中去獨(dú)立實(shí)現(xiàn)電源管理的支持,人們考慮的是如何盡可能地重用代碼;而且在有層次模型的 PCI/USB 總線中,必須以合理形式展示出這個(gè)層次關(guān)系,這也是電源管理等所要求的必須有層次結(jié)構(gòu)。

如在一個(gè)典型的 PC 系統(tǒng)中,中央處理器(CPU)能直接控制的是 PCI 總線設(shè)備,而 USB 總線設(shè)備是以一個(gè) PCI 設(shè)備(PCI-USB橋)的形式接入在 PCI 總線設(shè)備上,外部 USB 設(shè)備再接入在 USB 總線設(shè)備上;當(dāng)計(jì)算機(jī)執(zhí)行掛起(suspend)操作時(shí), Linux 內(nèi)核應(yīng)該以 “外部USB設(shè)備->USB總線設(shè)備->PCI總線設(shè)備” 的順序通知每一個(gè)設(shè)備將電源掛起;執(zhí)行恢復(fù)(resume)時(shí)則以相反的順序通知;反之如果不按此順序則將有設(shè)備得不到正確的電源狀態(tài)變遷的通知,將無(wú)法正常工作。

sysfs 是在這個(gè) Linux統(tǒng)一設(shè)備模型的開(kāi)發(fā)過(guò)程中的一項(xiàng)副產(chǎn)品(見(jiàn) 參考資料 中 Greg K. Hartman 寫作的 LinuxJournal 文章)。為了將這些有層次結(jié)構(gòu)的設(shè)備以用戶程序可見(jiàn)的方式表達(dá)出來(lái),人們很自然想到了利用文件系統(tǒng)的目錄樹(shù)結(jié)構(gòu)(這是以 UNIX 方式思考問(wèn)題的基礎(chǔ),一切都是文件?。┰谶@個(gè)模型中,有幾種基本類型它們的對(duì)應(yīng)關(guān)系。

Linux統(tǒng)一設(shè)備模型的基本結(jié)構(gòu)

類型 所包含的內(nèi)容 對(duì)應(yīng)內(nèi)核數(shù)據(jù)結(jié)構(gòu) 對(duì)應(yīng)/sys項(xiàng)
設(shè)備(Devices) 設(shè)備是此模型中最基本的類型,以設(shè)備本身的連接按層次組織 struct device /sys/devices/*/*/.../
設(shè)備驅(qū)動(dòng)(Device Drivers) 在一個(gè)系統(tǒng)中安裝多個(gè)相同設(shè)備,只需要一份驅(qū)動(dòng)程序的支持 struct device_driver /sys/bus/pci/drivers/*/
總線類型(Bus Types) 在整個(gè)總線級(jí)別對(duì)此總線上連接的所有設(shè)備進(jìn)行管理 struct bus_type /sys/bus/*/
設(shè)備類別(Device Classes) 這是按照功能進(jìn)行分類組織的設(shè)備層次樹(shù);如 USB 接口和 PS/2 接口的鼠標(biāo)都是輸入設(shè)備,都會(huì)出現(xiàn)在 /sys/class/input/ 下 struct class /sys/class/*/

從內(nèi)核在實(shí)現(xiàn)它們時(shí)所使用的數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō), Linux統(tǒng)一設(shè)備模型又是以兩種基本數(shù)據(jù)結(jié)構(gòu)進(jìn)行樹(shù)型和鏈表型結(jié)構(gòu)組織的:
kobject: 在 Linux統(tǒng)一設(shè)備模型中最基本的對(duì)象,它的功能是提供引用計(jì)數(shù)和維持父子(parent)結(jié)構(gòu)、平級(jí)(sibling)目錄關(guān)系,上面的 device, device_driver 等各對(duì)象都是以 kobject 基礎(chǔ)功能之上實(shí)現(xiàn)的; struct kobject {
const char      *name;
struct list_headentry;
struct kobject  *parent;
struct kset     *kset;
struct kobj_type*ktype;
struct sysfs_dirent     *sd;
struct kref     kref;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;

其中 struct kref 內(nèi)含一個(gè) atomic_t 類型用于引用計(jì)數(shù), parent 是單個(gè)指向父節(jié)點(diǎn)的指針, entry 用于父 kset 以鏈表頭結(jié)構(gòu)將 kobject 結(jié)構(gòu)維護(hù)成雙向鏈表;
kset: 它用來(lái)對(duì)同類型對(duì)象提供一個(gè)包裝集合,在內(nèi)核數(shù)據(jù)結(jié)構(gòu)上它也是由內(nèi)嵌一個(gè) kboject 實(shí)現(xiàn),因而它同時(shí)也是一個(gè) kobject (面向?qū)ο?OOP 概念中的繼承關(guān)系) ,具有 kobject 的全部功能; struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
struct kset_uevent_ops *uevent_ops;
 
其中的 struct list_head list 用于將集合中的 kobject 按 struct list_head entry 維護(hù)成雙向鏈表;
涉及到文件系統(tǒng)實(shí)現(xiàn)來(lái)說(shuō), sysfs 是一種基于 ramfs 實(shí)現(xiàn)的內(nèi)存文件系統(tǒng),與其它同樣以 ramfs 實(shí)現(xiàn)的內(nèi)存文件系統(tǒng)(configfs,debugfs,tmpfs,...)類似, sysfs 也是直接以 VFS 中的 struct inode 和 struct dentry 等 VFS 層次的結(jié)構(gòu)體直接實(shí)現(xiàn)文件系統(tǒng)中的各種對(duì)象;同時(shí)在每個(gè)文件系統(tǒng)的私有數(shù)據(jù) (如 dentry->d_fsdata 等位置) 上,使用了稱為 struct sysfs_dirent 的結(jié)構(gòu)用于表示 /sys 中的每一個(gè)目錄項(xiàng)。
struct sysfs_dirent {
atomic_ts_count;
atomic_ts_active;
struct sysfs_dirent     *s_parent;
struct sysfs_dirent     *s_sibling;
const char      *s_name;
union {
struct sysfs_elem_dir   s_dir;
struct sysfs_elem_symlink       s_symlink;
struct sysfs_elem_attr  s_attr;
struct sysfs_elem_bin_attr      s_bin_attr;
unsigned int    s_flags;
ino_t   s_ino;
umode_t s_mode;
struct iattr    *s_iattr;
 
在上面的 kobject 對(duì)象中可以看到有向 sysfs_dirent 的指針,因此在sysfs中是用同一種 struct sysfs_dirent 來(lái)Linux統(tǒng)一設(shè)備模型中的 kset/kobject/attr/attr_group.

具體在數(shù)據(jù)結(jié)構(gòu)成員上, sysfs_dirent 上有一個(gè) union 共用體包含四種不同的結(jié)構(gòu),分別是目錄、符號(hào)鏈接文件、屬性文件、二進(jìn)制屬性文件;其中目錄類型可以對(duì)應(yīng) kobject,在相應(yīng)的 s_dir 中也有對(duì) kobject 的指針,因此在內(nèi)核數(shù)據(jù)結(jié)構(gòu), kobject 與 sysfs_dirent 是互相引用的;

sysfs 所表達(dá)的 /sys 目錄結(jié)構(gòu)就是非常清晰明了:
在 /sys 根目錄之下的都是 kset,它們組織了 /sys 的頂層目錄視圖;
在部分 kset 下有二級(jí)或更深層次的 kset;
每個(gè) kset 目錄下再包含著一個(gè)或多個(gè) kobject,這表示一個(gè)集合所包含的 kobject 結(jié)構(gòu)體;
在 kobject 下有屬性(attrs)文件和屬性組(attr_group),屬性組就是組織屬性的一個(gè)目錄,它們一起向用戶層提供了表示和操作這個(gè) kobject 的屬性特征的接口;
在 kobject 下還有一些符號(hào)鏈接文件,指向其它的 kobject,這些符號(hào)鏈接文件用于組織上面所說(shuō)的 device, driver, bus_type, class, module 之間的關(guān)系;
不同類型如設(shè)備類型的、設(shè)備驅(qū)動(dòng)類型的 kobject 都有不同的屬性,不同驅(qū)動(dòng)程序支持的 sysfs 接口也有不同的屬性文件;而相同類型的設(shè)備上有很多相同的屬性文件;
注意,此表內(nèi)容是按照***開(kāi)發(fā)中的 2.6.28 內(nèi)核的更新組織的,在附錄資源如 LDD3 等位置中有提到 sysfs 中曾有一種管理對(duì)象稱為 subsys (子系統(tǒng)對(duì)象),在***的內(nèi)核中經(jīng)過(guò)重構(gòu)認(rèn)為它是不需要的,它的功能完全可以由 kset 代替,也就是說(shuō) sysfs 中只需要一種管理結(jié)構(gòu)是 kset,一種代表具體對(duì)象的結(jié)構(gòu)是 kobject,在 kobject 下再用屬性文件表示這個(gè)對(duì)象所具有的屬性。以上是介紹Linux統(tǒng)一設(shè)備。

【編輯推薦】

  1. 十大Linux操作系統(tǒng)要點(diǎn)
  2. Linux操作系統(tǒng)非你不可的理由
  3. 闡述Linux操作系統(tǒng)安裝與認(rèn)識(shí)支援的硬體
  4. Linux操作系統(tǒng)對(duì)于Windows算什么?
  5. 討論測(cè)試Fedora Linux硬件使用效果
責(zé)任編輯:佚名 來(lái)源: CSDN
相關(guān)推薦

2009-12-22 12:14:11

Linux內(nèi)核

2010-04-12 12:52:54

WiMAX無(wú)線技術(shù)

2009-12-17 14:28:20

桌面Linux版本

2009-12-25 11:40:29

Linux root

2010-06-21 14:52:47

Linux APT

2010-03-09 13:36:41

Linux基本概念

2010-03-23 15:52:41

Linux shell

2021-04-12 12:00:13

Linux運(yùn)維Linux系統(tǒng)

2010-04-20 14:10:19

負(fù)載均衡產(chǎn)品

2010-03-16 11:20:53

Linux 優(yōu)化

2009-12-14 17:50:45

ASP.NET 2.0

2009-10-16 12:55:27

結(jié)構(gòu)化布線系統(tǒng)

2010-06-08 12:36:16

UML介紹

2010-06-13 15:41:26

Linux uml工具

2009-12-24 10:10:45

Fedora 12發(fā)行

2020-03-02 13:45:18

Redis數(shù)據(jù)結(jié)構(gòu)Java

2009-12-24 15:34:32

Fedora基金會(huì)

2010-05-11 13:24:33

思科統(tǒng)一通信

2012-07-12 11:28:42

存儲(chǔ)產(chǎn)品華為

2010-03-17 13:30:09

Fedora 顯示
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)