Linux編寫內核模塊,實現在/sys目錄下添加文件

sysfs是一種基於內存的虛擬文件系統,該文件系統將內核信息以文件的方式提供給用戶程序使用,可以更方便地對系統設備進行管理。sysfs把連接在系統上的設備和總線組織成爲一個分級的文件,由用戶空間存取,並能向用戶空間導出內核的數據結構以及它們的屬性。其目錄結果如下圖所示。
在這裏插入圖片描述

現編寫一個內核模塊,在/sysfs文件系統中增加一個目錄hello,並在這個目錄中增加一個文件world,文件的內容爲hello world。

實驗環境

Ubuntu 18.04.1,源碼內核版本:Linux-4.2.6

創建目錄

sysfs內核官方文檔中給出了sysfs文件系統的具體描述。

參照文檔可知,sysfs會爲每個註冊在系統中的kobject對象創建一個目錄,該目錄是kobj對象的父對象的子目錄,頂層的目錄是所有其他對象的共同祖先。據此可知,創建一個kobj對象並將其註冊在系統中後,即可在sys目錄下生成一個子目錄。
在這裏插入圖片描述
其中,創建目錄的函數爲kobject_init_and_add,該函數在初始化kobject對象後將其添加至kobjects構成的層級中(即添加至目錄),其原型爲:

int kobject_init_and_add (struct kobject * kobj,struct kobj_type * ktype,struct kobject * parent,const char * fmt,...);

函數的第一個參數爲指向該目錄的kobj指針,第二個參數是該kobj指針的類型,第三個參數是該指針的父指針,由於本實驗是在sys頂層目錄下創建新目錄,因此該值爲NULL,第四個參數爲創建的目錄的名稱。

創建文件

同樣參考上述官方文檔可知,sysfs系統爲Attributes結構體提供I/O接口以將Attributes映射爲文件,因此沒有直接創建文件的函數。該映射通過將kobject的ktype成員設置爲自定義的my_type來完成:
在這裏插入圖片描述
在my_type的結構體中,release成員用於釋放kobj對象,該操作可避免潛在的內存泄漏;default_attrs成員指定了該文件的Attr結構體,其name成員爲“world”,即創建的文件名,並設置其擁有讀寫權限;sysfs_ops成員指定了要創建的文件的操作,由於在本實驗中只需顯示文件內容,因此只定義了show函數,其實現如下:
在這裏插入圖片描述
至此,便完成了該實驗的大體框架。

結果

在這裏插入圖片描述

運行與驗證

使用make命令編譯模塊,再使用sudo insmod sys_hello.ko命令安裝模塊,如下圖所示。
在這裏插入圖片描述
再切換至/sys目錄,即可看到上述結果。
此外,也可通過rmmod命令卸載該模塊,由圖可知,卸載模塊後/sys/目錄下已經沒有hello目錄了,這體現出模塊可以在內核運行時動態插入和刪除的特點。
在這裏插入圖片描述
完整實現代碼已上傳至我的github

參考資料

[1] Robert Love, Robert Love. Linux內核設計與實現(原書第3版)[M].陳莉君,譯.機械工業出版社,2011
[2] Daniel P. Bovet, Marco Cesati. 深入理解LINUX內核(第三版)[M].陳莉君,張瓊聲,張宏偉,譯.中國電力出版社,2007
[3] https://www.jianshu.com/p/a6c33bf39067 編譯安裝 Linux 內核並添加系統調用
[4] https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt
[5] https://www.linuxtv.org/downloads/v4l-dvb-internals/device-drivers/API-kobject-init-and-add.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章