# Reading [The Linux Kernel Module Programming Guide](https://sysprog21.github.io/lkmpg/) (4) ## sysfs: Interacting with your module 要看懂sysfs首先要了解的就是kobject,這邊附上doc連結 ### [kobject 很重要必看,看完功力大增,考試100分](https://lwn.net/Articles/51437/) [(source code)](https://elixir.bootlin.com/linux/v6.14.6/source/include/linux/kobject.h#L64) 按照前面的邏輯,底層的運作sysfs其實也是由類似inode和dentry去管理file的資訊和整個樹的結構,但是這裡要釐清一下sysfs和VFS之間還夾著kernfs,整個關係有點像是OOP裡面的繼承,VFS就是個抽象介面只要符合介面要求就能mount,kernfs定義了目錄的樹狀結構(kernfs_node組成的tree)以及kernfs_ops對應syscall的interface,權限控制,inode和dentry等等的細節,基本上kernfs就是一個符合VFS的平台,而sysfs只是借用這個平台維護kobject的一個特例,其他還有[cgroupfs](https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt)也是在kernfs上實現的。 kobject是階層化的樹狀資料結構,所以會有parent pointer,kobject的內容實際上是存在kernel module裏面的一些attribute,就像之前說/proc file一樣不是真的存在硬碟上的檔案,偽裝成檔案主要目的就是讓user program可以透過VFS(virtual file system)的interface(file_operations,proc_ops)去操作這些attribute,統一管理簡化邏輯,也避免不必要的安全風險。 具體的分析可以從kobject_create_and_add和sysfs_create_file這兩個function開始,kobject_create_and_add會造一個kobject並且連接上parent,並且在sysfs裡面產生一個directory代表這個kobject,當sysfs_create_file之後,那個directory下才看的到那個attribute的file,至於如何操作attribute file則是要定義sysfs_ops也可以用macro `__ATTR(myvariable, 0660, myvariable_show, myvariable_store);`設定,sys_ops可以對應到file_operations。 這樣的方式雖然比較複雜,但是提供一個比/proc更好的介面去動態調整kernel module的變數。如果只是要簡單的操作,使用/proc確實可以達成,但是模型可以調的參數變多就會很不方便。 前幾章有提到cdev,本身也是帶有kobject,在使用cdev_add之後,會在/sys/dev/char底下產生一個kobject對應{major,minor},當device_create之後會產生 /sys/class/YOURCLASS/DEVICENAME對應device file。這樣的好處是可以利用kobject reference count決定裝置的lifetime並且透過kobject的uevent通知user program裝置的狀態等資訊。 最後回憶下前面的章節有提到kernel module的參數,其實也是kobject喔!