色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux--sysfs文件系統

Rice嵌入式開發技術分享 ? 來源:Rice嵌入式 ? 作者:Rice嵌入式 ? 2024-07-08 11:37 ? 次閱讀

sysfs文件系統

sysfs,全稱為System Filesystem,是一個由Linux內核實現的虛擬文件系統。它扮演著一個橋梁的角色,將內核中的設備和驅動程序信息以文件的形式呈現給用戶空間。與/proc文件系統相似,sysfs專注于展示設備和驅動程序的細節,而/proc則主要反映進程信息。

在sysfs中,信息被組織成層次化的文件系統結構。每個設備或內核對象在文件系統中都有其對應的表示,通常是以文件或目錄的形式存在。這些文件不僅存儲了設備的屬性和狀態信息,而且很多文件還允許用戶通過讀寫操作來對設備進行配置或控制。

sysfs默認掛載在文件系統的/sys路徑下。通過這個虛擬文件系統,用戶空間的應用程序能夠以一種直觀和動態的方式訪問和管理系統設備,無需進行復雜的內核空間交互。這種設計提供了一種高效且用戶友好的接口,使得設備管理變得更加簡單和靈活。

kernel Object

在Linux內核架構中,kobject扮演著一個核心角色,它是一個用于抽象化內核對象的框架。kobject不僅構成了內核中各種子系統的基礎構件,而且能夠代表設備、驅動程序、總線等多樣化的內核實體。

kobject架構提供了一種靈活且統一的模型,用以維護和管理內核對象。每個Kobject實例都擁有一個獨一無二的標識符和指向其上層Kobject的鏈接,這樣的設計允許它們形成一個有序的層級網絡。更進一步,Kobject可以附加多種屬性,這些屬性反映了對象的特征或狀態,并且可以通過sysfs這一虛擬文件系統對外公布,使得用戶空間程序能夠訪問和操作這些屬性。

Sysfs作為Kobject信息呈現的媒介,將內核內部的設備和驅動程序等對象的狀態和信息以文件的形式展現給用戶空間。每當內核中新增設備或驅動程序時,相應的Kobject實例也會被動態創建,并通過Sysfs將這些信息映射到用戶空間可訪問的路徑下。

在Linux內核的源碼樹中,struct kobject這一數據結構在"linux/kobject.h"頭文件里定義。它經常作為其他結構體的成員出現,使得這些結構體所代表的內核對象能夠整合進Kobject的管理體系中。通過這種方式,內核開發者可以輕松地為各種內核對象實現統一的管理和訪問接口。

structkobject{
constchar*name;
structlist_headentry;
structkobject*parent;
structkset*kset;
structkobj_type*ktype;
structkernfs_node*sd;/*sysfsdirectoryentry*/
structkrefkref;
...
};

其中:- kref:提供kobject的引用技術。- ktype:kobject關聯的類型。- kset:指向同一類kobject集合的指針。- sd:當前kobject在/sys下的目錄條目。

sysfs使用方式

Linux內核中使用sysfs的步驟比較簡單:(1)在sys路徑下創建目錄;(2)創建sysfs文件。下面將詳細展開這兩步涉及的內核API

在sys下創建目錄

structkobject*kobject_create_and_add(constchar*name,structkobject*parent);

Linux內核預定義了幾個常用的parent參數:- kernel_kobj:在/sys/kernel下創建目錄;- firmware_kobj:在/sys/firmware下創建目錄;- fs_kobj:在/sys/fs下創建目錄。- 如果parent取值為NULL,則在/sys下面創建目錄。

相應地,如果需要刪除對應的sysfs目錄,可以用:

voidkobject_put(structkobject*kobj);

創建sysfs文件

sysfs文件可以通過sysfs屬性來創建,它定義在頭文件"sysfs.h"中:

structkobj_attribute{
structattributeattr;
ssize_t(*show)(structkobject*kobj,structkobj_attribute*attr,char*buf);
ssize_t(*store)(structkobject*kobj,structkobj_attribute*attr,constchar*buf,size_tcount);
};

attr表示將要創建的文件(屬性),而show和store分別表示對應的sysfs文件在讀和寫操作時的回調函數。

struct kobj_attribute可以通過__ATTR宏來創建:

__ATTR(name,permission,show_ptr,store_ptr);

準備好attr之后,可以通過sysfs_create_file來創建出sysfs文件:

intsysfs_create_file(structkobject*kobj,conststructattribute*attr);

如果需要刪除對應的sysfs文件,可以用:

voidsysfs_remove_file(structkobject*kobj,conststructattribute*attr);

sysfs創建設備節點

前面描述了如何創建一個基本的sysfs,接下載描述的是如何創建設備節點的sysfs。

實際創建設備節點的sysf跟基本的sysfs是一樣的,只是結構體換了一個名字。它使用DEVICE_ATTR宏,可以定義一個struct device_attribute設備屬性,使用sysfs_create_file便可以在設備目錄下創建具有show和store方法的節點。

DEVICE_ATTR宏定義

DEVICE_ATTR宏定義如下:

#defineDEVICE_ATTR(_name,_mode,_show,_store)
structdevice_attributedev_attr_##_name=__ATTR(_name,_mode,_show,_store)

__ATTR宏定義,宏定義在include/linux/sysfs.h文件中,如下:

#define__ATTR(_name,_mode,_show,_store){
.attr={.name=__stringify(_name),
.mode=VERIFY_OCTAL_PERMISSIONS(_mode)},
.show=_show,
.store=_store,
}

struct device_attribute結構體,該結構體的定義在include /linux/device.h,其定義如下:

structdevice_attribute{
structattributeattr;
ssize_t(*show)(structdevice*dev,structdevice_attribute*attr,
char*buf);
ssize_t(*store)(structdevice*dev,structdevice_attribute*attr,
constchar*buf,size_tcount);
};

struct attribute結構體, 該結構體的定義在include /linux/device.h,其定義如下:

structattribute{
constchar*name;
umode_tmode;
#ifdefCONFIG_DEBUG_LOCK_ALLOC
boolignore_lockdep:1;
structlock_class_key*key;
structlock_class_keyskey;
#endif
};

DEVICE_ATTR宏定義等價說明

我們頂一個文件的范式如下

DEVICE_ATTR(_name,_mode,_show,_store)

等價于:

structdevice_attributedev_attr_##_name={
.attr={.name=__stringify(_name),
.mode=VERIFY_OCTAL_PERMISSIONS(_mode)},
.show=_show,
.store=_store,
}

show函數的詳細描述:

ssize_t(*show)(structdevice*dev,structdevice_attribute*attr,char*buf);

參數說明:

入參buf是需要我們填充的string即我們cat屬性節點時要顯示的內容;-函數的返回值是我們填充buf的長度,且長度應當小于一個頁面的大小(4096字節);

其他參數一般不用關心。

實例說明,當我們使用cat命令的時候,將調用該函數

staticssize_tshow_youyeetoo_device(structdevice*dev,
structdevice_attribute*attr,char*buf)
{
returnsprintf(buf,"%sn",mybuf);
}

store函數的詳細描述:

ssize_t(*store)(structdevice*dev,structdevice_attribute*attr,constchar*buf,size_tcount);

參數說明:

入參buf是用戶傳入的字符串,即echo到屬性節點的內容;

入參count是buf中字符串的長度。

函數的返回值通常返回count即可。

其他參數一般不用關心。

實例說明,當我們使用echo命令的時候,將調用該函數:

staticssize_tstore_youyeetoo_device(structdevice*dev,
structdevice_attribute*attr,
constchar*buf,size_tcount)
{
sprintf(mybuf,"%s",buf);
returncount;
}

mode的權限定義,在kernel/include/uapi/linux/stat.h中:

#defineS_IRWXU00700//用戶可讀寫和執行
#defineS_IRUSR00400//用戶可讀
#defineS_IWUSR00200//用戶可寫
#defineS_IXUSR00100//用戶可執行

#defineS_IRWXG00070//用戶組可讀寫和執行
#defineS_IRGRP00040//用戶組可讀
#defineS_IWGRP00020//用戶組可寫
#defineS_IXGRP00010//用戶組可執行

#defineS_IRWXO00007//其他可讀寫和執行
#defineS_IROTH00004//其他可讀
#defineS_IWOTH00002//其他可寫
#defineS_IXOTH00001//其他可執行

至此,我們已經定義好了.show和.store函數,那么就可以使用DEVICE_ATTR了。

staticDEVICE_ATTR(youyeetoo_device,S_IWUSR|S_IRUSR,show_youyeetoo_device,store_youyeetoo_device);

device attribute添加到sysfs

上面描述的是sysfs的讀寫接口的定義方式,他還需要注冊到sysfs中。才會在對應驅動中顯示我們的文件,其中:

注冊函數:sysfs_create_file();

注銷函數:sysfs_remove_file();

樣例代碼代碼:

注冊樣例:

sysfs_create_file(&(youyeetoo_dev->kobj),&dev_attr_youyeetoo.attr);

注銷樣例:

sysfs_remove_file(&(youyeetoo_dev->kobj),&dev_attr_youyeetoo.attr);

sysfs樣例測試

完整的測試代碼,在sysfs的驅動節點里面生成一個youyeetoo文件,文件支持讀寫功能。

#include
#include
#include
#include
#include

staticintmajor;
staticstructclass*youyeetoo_class;
structdevice*youyeetoo_dev;
staticcharyouyeetoo_buff[100]="youyeetoo";

staticssize_tshow_youyeetoo_device(structdevice*dev,
structdevice_attribute*attr,char*buf)
{
returnsprintf(buf,"%sn",youyeetoo_buff);
}

staticssize_tstore_youyeetoo_device(structdevice*dev,
structdevice_attribute*attr,
constchar*buf,size_tcount)
{
sprintf(youyeetoo_buff,"%s",buf);
returncount;
}
staticDEVICE_ATTR(youyeetoo,S_IWUSR|S_IRUSR,show_youyeetoo_device,store_youyeetoo_device);

structfile_operationsyouyeetoo_ops={
.owner=THIS_MODULE,
};

staticintyouyeetoo_init(void)
{
major=register_chrdev(0,"youyeetoo",&youyeetoo_ops);
youyeetoo_class=class_create(THIS_MODULE,"youyeetoo");
youyeetoo_dev=device_create(youyeetoo_class,0,MKDEV(major,0),NULL,"youyeetoo");
if(sysfs_create_file(&(youyeetoo_dev->kobj),&dev_attr_youyeetoo.attr))
{//在mytest_device設備目錄下創建一個sys_device_file屬性文件
return-1;
}

return0;
}

staticvoidyouyeetoo_exit(void)
{
device_destroy(youyeetoo_class,MKDEV(major,0));
class_destroy(youyeetoo_class);
unregister_chrdev(major,"youyeetoo");
sysfs_remove_file(&(youyeetoo_dev->kobj),&dev_attr_youyeetoo.attr);
}

module_init(youyeetoo_init);
module_exit(youyeetoo_exit);
MODULE_AUTHOR("youyeetoo");
MODULE_LICENSE("GPL");

將上面驅動編譯燒錄之后,就可以sysfs下看到我們創建的文件:

4ccf9d98-3bf9-11ef-82a0-92fbcf53809c.png

測試我們創建的sysfs

4cdd524e-3bf9-11ef-82a0-92fbcf53809c.png

4ce0f1ec-3bf9-11ef-82a0-92fbcf53809c.png

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
  • Sysfs
    +關注

    關注

    0

    文章

    15

    瀏覽量

    6236
收藏 人收藏

    評論

    相關推薦

    飛凌嵌入式ElfBoard ELF 1板卡-應用編程示例控制LED燈之sysfs文件系統

    sysfs文件系統概念 sysfsLinux2.6以上的內核在發展迭代過程中衍生出來的一個功能,它的作用是通過一個內存文件系統將信息導出
    發表于 10-18 09:31

    【AWorks試用體驗】使用sysfs文件系統 控制IED(1) Shell 點亮LED

    在嵌入式設備中控制GPIO 一般做法是通過寫一個單獨的驅動程序。而大多數資料顯示都是使用這一種方法。 但其實Linux下有一個通用的 GPIO 控制接口, 就是 sysfs文件系統什么是sys
    發表于 08-16 19:17

    Linux文件系統課程

    本章學習目標理解什么是文件系統了解文件系統工作原理理解Fedora Core Linux文件系統的結構掌握Fedora Core Linux
    發表于 04-10 17:07 ?0次下載

    Linux文件系統簡介

    Linux文件系統簡介 什么是根文件   根文件系統首先是一種文件系統,但是相對于普通的文件系統
    發表于 04-21 17:01 ?5111次閱讀

    玩轉Linux,先把文件系統搞懂

    Linux 支持多種文件系統,包括 ext2 、 ext3 、 vfat 、 ntfs 、 iso9660 、 jffs 、 romfs 和 nfs 等,為了對各類文件系統進行統一管理, Li
    發表于 08-16 10:50 ?2073次閱讀
    玩轉<b class='flag-5'>Linux</b>,先把<b class='flag-5'>文件系統</b>搞懂

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統
    發表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b>設備驅動開發詳解》第5章、<b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>與設備<b class='flag-5'>文件系統</b>

    Linux 內核/sys 文件系統介紹

    linux2.6內核引入sysfs文件系統sysfs可以看成與proc,devfs和devpty同類別的文件系統,該
    發表于 04-25 16:20 ?4291次閱讀
    <b class='flag-5'>Linux</b> 內核/sys <b class='flag-5'>文件系統</b>介紹

    可以了解的Linux 文件系統結構

    Linux中的文件是什么?它的文件系統又是什么?那些配置文件又在哪里?我下載好的程序保存在哪里了?在 Linux
    發表于 04-27 14:06 ?716次閱讀
    可以了解的<b class='flag-5'>Linux</b> <b class='flag-5'>文件系統</b>結構

    Linux最新UBI文件系統介紹

    嵌入式linux中文站關注嵌入式linux文件系統的發展。在linux-2.6.27以前,談到Flash文件系統,大家很多時候多會想到cra
    發表于 04-27 19:37 ?6385次閱讀

    linux文件系統中的虛擬文件系統設計詳解

    Linux 中允許眾多不同的文件系統共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統 調用即可對 Linux
    發表于 04-02 14:37 ?1815次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>文件系統</b>中的虛擬<b class='flag-5'>文件系統</b>設計詳解

    Linux設備模型:sysfs

    sysfs是一個基于RAM的文件系統,它和Kobject一起,可以將Kernel的數據結構導出到用戶空間,以文件目錄結構的形式,提供對這些數據結構(以及數據結構的屬性)的訪問支持。
    發表于 05-12 09:50 ?1380次閱讀

    Linux文件系統解析

    Linux 中,最直觀、最可見的部分就是 文件系統(file system)。下面我們就來一起探討一下關于 Linux 中國的文件系統系統
    的頭像 發表于 09-16 11:29 ?2456次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>解析

    適用于Linux的最佳通用文件系統 Linux文件系統的安裝

    為您的計算機選擇正確的文件系統可能是一個困難的過程。您可能會想知道:為什么文件系統很重要?有沒有適用于安裝 Linux 的特定文件系統? 事實證明,有兩種
    發表于 08-03 10:22 ?337次閱讀
    適用于<b class='flag-5'>Linux</b>的最佳通用<b class='flag-5'>文件系統</b> <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>的安裝

    Linux文件系統特點

    Linux文件系統特點 文件系統要有嚴格的組織形式,使得文件能夠以塊為單位進行存儲。 文件系統中也要有索引區,用來方便查找一個
    的頭像 發表于 11-09 14:48 ?1170次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>文件系統</b>特點

    Linux文件系統的掛載過程

    Linux文件系統(rootfs)是Linux系統中所有其他文件系統和目錄的起點,它是內核啟動時掛載的第一個
    的頭像 發表于 10-05 16:50 ?403次閱讀
    主站蜘蛛池模板: 日日碰狠狠躁久久躁综合网| 久久国产欧美| 国产一区二区免费在线观看| 国产午夜一区二区三区免费视频| 国产午夜伦鲁鲁| 精品日韩视频| 阿力gv资源| FREE另类老女人| 国产AV亚洲精品久久久久软件 | 午夜国产羞羞视频免费网站| 亚洲.日韩.欧美另类| 一本久道久久综合狠狠躁AV| 0855午夜福利伦理电影| 成人在线观看国产| 国产无遮挡色视频免费观看性色| 久久精品视在线观看85| 女性露出奶头流出精子| 偷窥欧美wc经典tv| 伊人网站在线| 耽美肉文 高h失禁| 红尘影院在线观看| 欧美成人无码视频午夜福利| 视频一区国产第一页| 伊人国产在线观看| 苍井空a 集在线观看网站| 国产午夜精品久久久久九九| 美女胸禁止18以下看| 我们中文在线观看免费完整版| 杨幂视频在线观看1分30秒| yin荡体育课羞耻play双性| 国产午夜精品理论片在线| 美女伊人网| 午夜伦午夜伦锂电影| 91国在线产| 国产久青青青青在线观看| 妹妹好色网| 小SAO货边洗澡边CAO你动漫| 98久久人妻少妇激情啪啪| 国产深夜福利视频在线| 免费视频久久只有精品| 亚洲AV无码国产精品色午夜情 |