一、共用記憶體是什麼 在Linux系統中,共用記憶體是一種IPC(進程間通信)方式,它可以讓多個進程在物理記憶體中共用一段記憶體區域。 這種共用記憶體區域被映射到多個進程的虛擬地址空間中,使得多個進程可以直接訪問同一段物理記憶體區域中的數據,從而實現進程間的高速數據交換和通信。 二、共用記憶體的原理 共用記憶體基於 ...
概述
創建sys目錄下的屬性節點有三種方式
device_create_file
class_create_file
driver_create_file
我們常用的是第一個和第二個,這三者的主要區別在第一個參數上,device依賴於device節點,class依賴於class節點(class_create)
device_create_file 創建的屬性節點在device設備節點對應的路徑下,同理device也是
具體使用
class
我們一般是先創建class再創建device,所以以class創建設備節點為例
首先先創建類
class_create(owner, name)
- owner:一般填寫THIS_MODULE
- name:class的名字,在sys/class/下的文件夾名稱
再調用創建文件命令
class_create_file(struct class *class,
const struct class_attribute *attr)
- class:我們創建返回的class結構體
- attr: class_attribute結構體,也是我們下一步要填寫的參數
class_attribute結構體如下:
struct class_attribute {
struct attribute attr;
ssize_t (*show)(struct class *class, struct class_attribute *attr,
char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr,
const char *buf, size_t count);
};
- show也就是我們通過cat讀取時所執行的函數
- store是通過echo命令所執行的函數
- attr:attribute結構體,裡面有兩個參數name也就是文件的名稱,mode,對介面文件許可權的設置
上面store、show函數的具體實現是需要我們按上面的格式自己編寫函數
我們一般不會通過完成上面結構體的方式進行初始化,我們一般通過一下方式
static struct class_attribute k60168_Tran_With[] = {
__ATTR(trans_with, 0664, NULL, k60168_trans_with),
__ATTR_NULL,
};
__ATTR填入的就是我們上面所說的class_attribute的所有變數。
__ATTR_NULL也是必須的,具體是啥原因我也忘了
device
device節點依賴於class,所以device的創建也需要填寫一些class的參數。
首先也是先創建device
device_create(struct class *cls, struct device *parent,
dev_t devt, void *drvdata,
const char *fmt, ...);
- parent:父節點,一般為NULL
- devt:設備號
- drvdata:設備可能會使用到的數據,一般為NULL,正點是這麼說的
- fmt:在dev目錄下創建的子目錄的名稱
然後再調用創建函數
int device_create_file(struct device *device,
const struct device_attribute *entry);
其結構和上面的class類似就不多說了
device_attribute的結構體如下:
struct device_attribute {
struct attributeattr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
};
也是通過如下的方式進行填充
static struct device_attribute k60168_Tran_With[] = {
__ATTR(trans_with, 0664, NULL, k60168_trans_with),
__ATTR_NULL,
};
註意是device_attribute
不是class_attribute
!!!!!!,我自己踩過的坑