Linux設備管理(五)_寫自己的sysfs介面

来源:http://www.cnblogs.com/xiaojiang1025/archive/2016/12/27/6227421.html
-Advertisement-
Play Games

我們在 "Linux設備管理(一)_kobject, kset,ktype分析" 一文中介紹了kobject的相關知識,在 "Linux設備管理(二)_從cdev_add說起" 和 "Linux設備管理(三)_匯流排設備的掛接" 舉例介紹了內核中是如何進行設備管理的,併在 "Linux設備管理(四)_ ...


我們在Linux設備管理(一)_kobject, kset,ktype分析一文中介紹了kobject的相關知識,在Linux設備管理(二)_從cdev_add說起Linux設備管理(三)_匯流排設備的掛接舉例介紹了內核中是如何進行設備管理的,併在Linux設備管理(四)_從sysfs回到ktype一文中結合sysfs機制和kobject對內核的設備管理機制進行一定深度的討論,從中可以看出,字元設備的cdev本身的kobject是沒有初始化的,也沒有在sysfs中創建任何目錄,平臺設備是將設備掛接到匯流排上,在掛接的過程中就會在相應的sysfs目錄創建相應的文件。在這裡,本文將搭建一個sysfs模塊介面的框架,此後,就可以為我們自己的驅動在sysfs中添加屬性讀寫介面。

準備屬性和回調介面

我們知道,呈現在sysfs中的文件名其實都是內核中ktype的屬性值,而從用戶空間對這些屬性值進行讀寫其實就是回調了我們在ktype結構中註冊讀寫函數,所以,這裡我們準備了兩個函數,值得註意的是,內核會將用戶空間的buf轉換到內核空間並當作參數傳入回調函數,所以我們就不用再進行這個轉換。這裡由於沒有實際的屬性,我就只是列印一下信息,實際使用的時候這兩個函數要對內核中的真實屬性進行讀寫。

static char kbuf[1024] = {0};
static ssize_t my_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
    char info[]="my_show is called\n";
    return scnprintf(buf,sizeof(info),info);
}

static ssize_t my_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
    printk("%s is called\n",__func__);
    strncpy(kbuf,buf,count);
    printk("user_buf:%s,count:%ld|after copy,kbuf:%s\n",buf,count,kbuf);
    return count;
}

構造kobj_attribute

準備好了原材料,第一道工序就是將屬性和回調介面封裝到一個kobj_attribute結構對象中,當然對這個屬性的讀寫許可權等信息也應該進行封裝,我們來回顧一下這個結構

//linux/kobject.h
139 struct kobj_attribute {  
140         struct attribute attr;
141         ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
142                         char *buf);
143         ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
144                          const char *buf, size_t count);
145 };

//linux/sysfs.h
 29 struct attribute { 
 30         const char              *name;
 31         umode_t                 mode;   //許可權
 32         ...
 37 };

當然,內核也給我們提供了相應的巨集來快速的構造這個結構

//linux/sysfs.h
100 #define __ATTR(_name, _mode, _show, _store) {                           \
101         .attr = {.name = __stringify(_name),                            \
102                  .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },             \
103         .show   = _show,                                                \
104         .store  = _store,                                               \
105 }   

使用了這個巨集,我們就可以快速的構造我們的kobj_attribute結構

//show是name,就是sys中的文件名
static struct kobj_attribute my_sysfs_read =__ATTR(show, S_IRUSR, my_show, NULL);

static struct kobj_attribute my_sysfs_write =__ATTR(write, S_IWUSR, NULL,my_store);

構造attribute數組

一個kobject網完對應多個attribute,此時就需要將這些attribute封裝成一個結構體數組,註意這個數組最後一個元素一定要是NULL

static struct attribute *my_sysfs_attr[] = {
    &my_sysfs_read.attr,
    &my_sysfs_write.attr,
    NULL,
};

如果這些屬性直接放到kobject的目錄中,我們可以直接使用sysfs_create_file(),但通常情況下,我們更多的將上述的struct attribute進行進一步的封裝,並使用sysfs_create_group()來創建一個名為attribute_group.name的、包含struct attribute中的屬性目錄,這種方式更加的靈活,因為如果我們不指定目錄的名字,那麼效果個sysfs_create_file()是一樣的。

static struct attribute_group my_sysfs_attr_group = {
    .name = "sub_my_attr",      //不寫這個成員就不會創建子文件夾
    .attrs = my_sysfs_attr,
};

struct kobject *my_kobj = NULL;
int mysys_init(void)
{
    ...
    my_kobj = kobject_create_and_add("my_sysfs", NULL);
    sysfs_create_group(my_kobj, &my_sysfs_attr_group);
    ...
}

void mysys_exit(void)
{
    ...
    sysfs_remove_group(my_kobj, &my_sysfs_attr_group);
    kobject_put(my_kobj);
}

輸出

將上述的程式編譯成模塊,我們就可以觀察到下麵的輸出結果。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫分為關係型資料庫(關係型資料庫強調的是 表跟表建立在誰跟誰有關係的基礎上進行設計 ;你是他的,他是她的,她是它的;基本最終都能找到一個數據 是誰的。這就是關係型資料庫了) 以前傳統的資料庫都是關係型資料庫 Oracle、SQLServer、Sybase、Informix、access、DB2、 ...
  • 在資料庫操作中, 尤其是碰到一些複雜一些的系統, 不可避免的, 會用到函數/自定義函數, 或者存儲過程. 實際項目中, 自定義函數和存儲過程是越少越好, 因為這個東西多了, 也是一個非常難以維護的地方. 一、自定義函數 1. 例子 mysql提供的函數, 不在這一篇講了, 這裡主要貼一下自定義函數. ...
  • 本文列舉了史上八大MySQL宕機事件原因、影響以及人們從中學到的經驗,文中用地震級數來類比宕機事件的嚴重性和後果,排在最嚴重層級前兩位的是由於亞馬遜AWS宕機故障(相當於地震十級和九級)。一、Percona網站宕機事件震級:3 發生時長:2011年7月11日 持續時長:數日 地點:加州Pleasan ...
  • 最近使用SQL*Plus命令生成html文件,遇到一些有意思的知識點,順便記錄一下,方便以後需要的時候而這些知識點又忘記而捉急。好記性不如爛筆頭嗎! 為什麼要用SQL*Plus生成html文件? 有些人肯定會問,我使用SQL*Plus為什麼要生成html文件呢? SQL*Plus本身就是一個命令工具... ...
  • Redis緩存伺服器是一款key/value資料庫,讀110000次/s,寫81000次/s,因為是記憶體操作所以速度飛快,常見用法是存用戶token、簡訊驗證碼等 官網顯示Redis本身並沒有Windows版本的,微軟官方開發了基於Windows的Redis伺服器:MSOpenTech/redis ...
  • 觸發器在之前的項目中, 應用的著實不多, 沒有辦法的時候, 才會去用這個. 因為這個東西在後期並不怎麼好維護, 也容易造成紊亂. 我最近的項目中, 由於資料庫設計(別人設計的)原因, 導致一些最簡單功能, 查詢起來, 都很麻煩和複雜. 牽涉表非常多, 表與表之間又互有部分關係. 我想說, 這是我見過 ...
  • 比如有一個表,我們需要些一個語句像SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' , 然後就能返回分割成單獨的行。 原表: | SomeID | OtherID | Data + + + | abcdef-..... | cdef1 ...
  • 第六節 Linux系統基礎優化 標簽(空格分隔):Linux實戰教學筆記 陳思齊 第1章 基礎環境 ![QQ20161227 [email protected] 60.5kB][1] 第2章 使用網易163鏡像做yum源 預設國外的yum源速度很慢,所以換成國內的。 第一步:先備份 mkdir backup ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...