多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > sysfs文件系統

sysfs文件系統

來源:程序員人生   發布時間:2014-12-19 08:04:14 閱讀次數:3900次

        sysfs文件系統是內核2.6的1個特性,通過in-memory文件系統的方式把內核對象(object)信息暴露給用戶程序。參考:https://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols⑵005/mochel.pdf

note:本文是對sysfs的1些簡單介紹,有很多不足的地方----對代碼的結構都介紹的不夠詳細,相干代碼在內核fs/sysfs目錄下

介紹

        sysfs是1種代表內核對象的機制,內核對象的屬性和內核對象相互之間的關系。從sysfs的目的來看,是把本來在procfs中的,關于裝備的部份獨立出來,以“裝備層次結構”的情勢顯現。它提供了兩個組件,1個內核編程接口來把這些item通過sysfs暴露出來;另外1個組件是用戶接口,來view和操作這些item(對應著相應的內核對象)。從內核的角度來看,sysfs是作為1個基礎架構的核心組件,所以接口很簡單,要履行的任務也很簡單。

        sysfs是內核和用戶空間的1個通道。用戶空間的程序可以通過很多方式來利用這個信息。比如說現有的利用就有io調度器(決定操作系統把io要求傳遞給存儲volume)的參數和udev程序。由于sysfs是最簡單也是最抽象的接口,它和每一個子系統的交互其實很多。特別是對kobject和裝備驅動,他們都是2.6的內核的新的特性,他們都和sysfs相互糾纏著使用。這方面的知識我還要自己去腦補,比以下面這些。

歷史

        sysfs源自ramfs(大概是linux內核2.4版的時候出現的),ramfs的誕生也許只是為了驗證當時剛剛出現的VFS文件系統。這為后來寫memory-based的文件系統打下了基礎。sysfs原來叫做ddfs(device driver fs),本來是用于作為新誕生的裝備模型(device model)的調試工具(debug tool)的。而在這之前,調試的代碼是使用procfs的,通過輸出1個裝備tree來進行相干的調試。不過大概是由于裝備模型的出現,加上Linus Torvarlds不停的催促,因而就有了這個文件系統。

        在2.5.1的時候,它把名字改成了driverfs,又隔了1年,由于這個裝備模型和driverfs證明了對其他的子系統也有作用,kobject這個數據結構被用來提供1種中心化的控制機制,最后從driverfs改名字為sysfs,來表明它對所有的子系統是沒有偏見的。


相干內核知識

note:很多都可以參考《linux裝備驅動程序》的第104章裝備模型http://oss.org.cn/kernel-book/ldd3/ch14.html。

Kobject

        對每一個在sysfs中發現的目錄,有1個kobject潛伏在內核某處,每一個kobject輸出1個或多個屬性,它出現在kobject的sysfs目錄,作為包括內核產生的信息的文件。sysfs文件系統所讀寫的信息是寄存在kobject中的;

        那末怎樣理解kobject所在的位置呢?Kobject是基礎的結構,它保持裝備模型在1起,初始的它作為1個簡單的援用計數,但是他的責任隨著時間增長,并且有了它自己的戰場;1個kobject,很少對它自己感興趣,它存在僅僅是為了結合1個高級對象到裝備模型。Kobject被嵌入到其他結構(比如bus和device,相當于cpp的容器)中,kobject結構的作用相當于C++中的基類。由于C語言沒有直接表達繼承的功能,因此將1個結構嵌入到另外一個結構的事情必須使用(如device,bus和drivers都是典型的容器。這些容器就是通過kobject連接起來了,組成1個樹狀結構)。

      但是c語言這類結構嵌入的設計方式,常常會出現1些問題,比如在這里,對1個struct kobject指針,甚么是包括這個結構的指針呢?這也許可使用內核中經常使用的宏container_of。


裝備驅動和裝備模型

         機器上有各種各樣的裝備,裝備需要裝備驅動來使得利用程序可使用它。在2.5內核開發循環中,是為內核創建1個統1的裝備模型。這需要1個通用的描寫系統結構的抽象。linux裝備模型是1個復雜的數據結構,裝備模型代碼負責這些方面,而不強加于驅動作者之上。和裝備模型的直接交互通常由其他各種內核子系統處理。通過sysfs和用戶空間交互也是1個裝備模型的功能。

 

Kset和subsystem

        雖然說kobject可以類比是對象的基類,那末kset則像是kobject的基類,頂層容器類。當我們讀或寫1個屬性的時候,sysfs會訪問1個特殊的結構,通過kobject來訪問的ksets結構。這個結構包括1些基本的讀寫特殊類型的kobject屬性的操作。這些函數把kobject和它的屬性翻譯成更高級別的對象,然后傳遞給show和store函數。1個kset包括1個子系統指針(稱為subsys),那末甚么是子系統呢?

1個子系統是作為1個整體對內核1個高級部份的代表. 子系統常常(但是否是1直)出現在 sysfs 層次的頂級. 1些內核中的例子子系統包括block_subsys(/sys/block, 給塊裝備), devices_subsys(/sys/devices, 核心裝備層次),1個子系統由1個簡單結構代表:

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

1個子系統, 因此, 其實只是1個對 kset 的包裝, 有1個旗標丟在里面.



裝備驅動 and 字符裝備驅動

        計算機本科的操作系統課程應當要求寫過裝備驅動程序。用mknode命令創建裝備文件。然后通過內核提供的接口來注冊字符裝備,主要是完成幾個參數的提供(主裝備號,名字和文件操作的數據結構的填充)。隨著內核功能的增加,這個結構的定義也愈來愈復雜,不過我們寫驅動的時候也只要寫1些最基本的。

 

加載sysfs:mount和fstab

加載mount -tsysfs sysfs /sys

/etc/fstab;fstab包括了文件系統和存儲裝備的信息。同時fsck,mount等命令都利用該文件。

 

Sysfs文件系統導航

# ll /sys

total 0

drwxr-xr-x  2 root root 0 Nov 21 17:09 block

drwxr-xr-x 19 root root 0 Nov 21 17:09 bus

drwxr-xr-x 56 root root 0 Nov 21 17:09 class

drwxr-xr-x  4 root root 0 Nov 21 17:09 dev

drwxr-xr-x 14 root root 0 Nov 21 17:09 devices

drwxr-xr-x  5 root root 0 Nov 21 17:09 firmware

drwxr-xr-x  5 root root 0 Nov 21 17:09 fs

drwxr-xr-x  5 root root 0 Nov 21 17:09 hypervisor

drwxr-xr-x  7 root root 0 Nov 21 17:09 kernel

drwxr-xr-x 117 root root 0 Nov 21 17:09module

drwxr-xr-x  2 root root 0 Nov 21 17:10 power

        最高層次的目錄表示了代表了注冊了sysfs的主要的幾個子系統。這些目錄在系統開啟的時候,當這些子系統把他們自己注冊到kobject core的時候就創建了。當這些子系統初始化后,他們開始去發現對象(注冊到他們分別的目錄)。下面將分別介紹。

        Block:塊裝備子系統,包括了系統發現的每一個塊裝備的信息,然后在每一個塊裝備的子目錄中包括了描寫這個塊裝備的屬性的文件,包括塊裝備的大小和dev_t號碼。也有指向實際的物理裝備的符號鏈接。并且,還有1個目錄是關于IO調度器的接口的,主要是1些統計信息和1些可以用于優化系統性能的特點。

然后是1個塊裝備的分區。主要是關于這個分區的1些只讀的屬性。

 

        Bus:總線子系統包括了內核支持注冊的每種物理總線類型。每種總線類型包括了兩個子目錄,分別是devices和drivers。Devices目錄包括了全部系統的那種總線的發現的每一個裝備。驅動目錄包括了注冊了這類總線的所有的裝備驅動,每種裝備的驅動有1個目錄,使得可以查看和操作驅動的1些參數。

 

        Class:代表了每一個裝備注冊內核的每一個裝備class。1個裝備class描寫了1個裝備的功能類型。1個裝備可能有不止1個邏輯功能。每個class和class對象可能包括1些屬性(暴露的參數)用來描寫和控制class object。

 

        Devices:包括了1個全局的裝備層次結構。由于裝備都是依照上級和下級的關系出現的。有兩種特殊類型的裝備,1個是平臺裝備,另外1個是系統裝備。

 

        Firmware:包括處理固件的對象和屬性。

         Module:每一個加載到內核的模塊。

         Power:power子系統

 

通用內核信息


初始化

        利用的是fs/sysfs/mount.c的內容,通過sysfs_init這個函數來初始化的。這個函數被VFS的初始化函數直接調用(很早就被調用了,由于很多的subsystems都依托于sysfs來注冊他們的對象)

這個函數主要做了3件事情:

1.      creat a kmem_cahe:這個cache用來sysfs_dirent對象的分配。(我們知道kmalloc和kfree用來實現數據結構的使用和釋放,而更加高效的方式就是使用這類slab高速緩存管理器)。

sysfs_dir_cachep= kmem_cache_create("sysfs_dir_cache",sizeof(struct sysfs_dirent), 0, 0, NULL);


當需要分配1個你需要的結構體空間的時候,只需要調用kmen_cache_alloc函數。

2.      在VFS中注冊。

register_filesystem(&sysfs_fs_type);

3.      內部的掛載。做這個是為了保證其他的內核代碼總是可使用sysfs,即便是在啟動階段。

sysfs_mnt= kern_mount(&sysfs_fs_type);

 

內核配置

Sysfs在默許情況下是被編譯進了內核的。他依托于CONFIG_SYSFS這個內核選項。(只是在CONFIG_EMBEDDED這個選項設置了的時候。這個菜可以進行自定義的配置。)

 

內核接口overview

        對內核代碼可見的函數大概分為3類;除這些還有1些特殊類型的,那就是2進制屬性和屬性組。

1.內核對象(目錄)

2.對象屬性(常規文件)

3.對象之間的關系(符號鏈接)



對象的屬性

        對象的屬性在外表現為sysfs中的常規文件,使用struct attribute數據結構來表示。它的函數主要有sysfs_create(remove,update)_file,文件的創建固然是名字,和mode,然后就是module的owner(這個待會再仔細說),然后就是創建在哪一個目錄下(由kobject的位置表示)。


關于屬性和模塊的關系?

        owener是由create_file的調用者設定的,來指向這個屬性代碼所處的模塊.比如說,網絡裝備有很多統計信息,通過sysfs表達為屬性信息。這類統計屬性應當放在外部模塊中,這樣就不需要加載了,能夠使得網絡裝備更好的發揮作用。當這個外部模塊加載后,里面包括的屬于每個注冊的網絡裝備的屬性都創建起來。這個模塊也能夠在任什么時候候卸載,將每一個網絡裝備的屬性從sysfs中移除掉。

        當這個屬性文件被訪問的時候,owner這個字段是用來做援用計數的(通過update函數).VFS調用的屬性文件操作通過sysfs內部函數設置。


包裝的對象屬性

        struct attribute(數據結構和相應的函數)并沒有包括讀和寫的屬性。sysfs沒有指定這些函數的格式和參數,這是1個顯示的設計。

        使用sysfs屬性的子系統創建了1種新的數據類型用來包裝struct attribute。通過定義1個包裝紙數據結構struct device_attribute,這類數據我也沒能力在這里描寫了。這個可讓我們保護下層的代碼,免受sysfs細節的影響。

         當1個屬性被讀寫的時候,sysfs通過kobject使用1個特殊的數據結構,叫做kset。這個結構包括基本的讀寫屬性(特殊類型的kobjects)的操作,這些函數將kobject和屬性轉化為更高級別的對象,然后再把這些對象傳送給show和store函數指針。再次說明,這幫助你確保了類型的安全,由于它保證了下層接受函數接收的參數是更高級別的對象。

         1般來講,程序員都不喜歡對象之間的類型轉換,由于如果數據結構中的字段的位置改變的話,這很容易致使很難發現的bugs。通過內核中幫助函數,履行遷移指針的減法操作來進行對象間類型轉換,從而保證了對象類型安全(即便字段位置可能改變)。


讀寫屬性

        sysfs1定會盡可能使得讀寫屬性越簡單越好,當1個屬性文件打開后,1個頁大小的page被分配用來在用戶空間和內核空間來傳遞數據,當1個屬性讀的時候,這個buffer會被傳送給下游的函數,比如show(是負責用來填充數據的,并且適合的格式化的)。這個數據然后被傳遞到用戶空間。

         而當寫1個sysfs屬性文件的時候,數據首先被復制到內核buffer,然后傳給下游的函數(along with buffer的大小)。這個函數負責解析數據。1般認為寫入buffer的數據是ascii字符,也認為寫入的數據的大小不到1頁的大小。如果依照傳統,1個文件的大小應當不超過1個頁。

         然后就是屬性的更新啦,如果1個屬性的值改變了,內核代碼可以通過update函數通知用戶空間程序。

 

內核對象之間的關系

         sysfs文件系統有通常的樹結構,它代表的kobjects的層次組織。但是內核中對象間的關系常常比那個復雜。(符號鏈接)符號鏈接是為了避免冗余信息的出現。例子,斟酌1個pci網絡裝備和驅動,當系統啟動時,這個pci裝備被發現,然后給他創建了1個sysfs目錄,即便它還沒有綁定到1個驅動。過了1些時間后,這個網絡驅動才加載,這個驅動也可能不和任何裝備產生綁定。這是1個和物理pci裝備不1樣的對象類型,所以也會給它創建1個新的目錄。在driver的目錄下面就會有1個符號鏈接,指向他綁定的真實的裝備。


?屬性組

      為何要有屬性組呢?為了在1次調用的時候就能夠輕松的添加或刪除1組屬性。這個attribute_group數據結構和相應的函數也是有定義的,也多是1個子目錄。比如說網絡裝備的統計信息就是1個很好的例子。

2進制屬性

     這是1種特殊類型的常規文件。和procfs的接口有點像,由于有的需要已知的特殊的格式,比如說PCI配置空間。

現有的sysfs的用戶

        比如udev,使用了libsysfs的c語言中的庫;另外pciutils也使用了sysfs來訪問pci配置信息。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲日韩色图 | 91福利在线看 | 一区二区三区高清 | 成片免费观看视频在线网 | 国产一国产一区秋霞在线观看 | 国产狂喷白浆在线观看视频 | 久久三级影视 | 国产成人av在线 | 春色激情站 | 黄色avav| 99爱精品 | 亚洲高清中文字幕 | 99久久精品费精品国产一区二 | 国产精品久久久久激情影院 | free性欧美xxx| 亚洲精品免费在线视频 | 国产麻豆免费观看 | 日本动漫免费在线观看 | 国产永久高清免费动作片www | 日韩一区国产二区欧美三 | 亚洲免费闲人蜜桃 | 日韩欧美毛片免费观看视频 | 欧美图片另类小说综合 | 亚洲剧情在线 | 亚洲视频中文字幕在线 | 最近中文字幕无免费 | 欧美另类xxxx| 国产女人视频免费观看 | 亚洲精品福利一区二区 | 欧美日韩免费一区二区三区 | 欧美日本综合一区二区三区 | 一区二区三区 | 三人性free欧美高清 | 叼嘿视频在线免费观看 | 欧美一区二区三区高清不卡tv | 日本欧美强乱视频在线 | 欧美性受xxxx黑人xyx | 亚洲欧洲在线视频 | 亚洲欧美专区精品久久 | 亚洲国产成人久久综合一 | 亚洲欧美日韩中文字幕网址 |