1.核心結構體定義:
struct cdev ;
2.兩種定義初始化方式:靜態的(在stack中生成物件)和動態的(在heap中生成物件)。
靜態記憶體定義初始化:
struct cdev my_cdev;//變數在stack中
cdev_init(&my_cdev, &fops);
my_cdev.owner = this_module;
動態記憶體定義初始化:
struct cdev *ptr_my_cdev = cdev_alloc();//變數在heap中
ptr_my_cdev ->ops = &fops;
ptr_my_cdev ->owner = this_module;
錯誤的定義初始化方式:
struct cdev *ptr_my_cdev = cdev_alloc();//變數在heap中
cdev_init(ptr_my_cdev
, &fops);
ptr_my_cdev
->owner = this_module;
錯誤原因分析:
相關函式原始碼如下:
struct cdev *cdev_alloc(void)
return p;
}void cdev_init(struct cdev *cdev, const struct file_operations *fops)
static void cdev_default_release(struct kobject *kobj)
static void cdev_dynamic_release(struct kobject *kobj)
static struct kobj_type ktype_cdev_default = ;
static struct kobj_type ktype_cdev_dynamic = ;
4.另類的定義初始化方式:
struct cdev my_cdev;//變數在stack中
struct cdev *ptr_my_cdev = &my_cdev;
cdev_init(ptr_my_cdev , &fops);
ptr_my_cdev ->owner = this_module;
和 區別和聯絡, 和 區別和聯絡
和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...
rpx和樣式和class和flex
5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...
if和switch和for語句
if和switch很像。具體什麼場景下,應用那個語句呢?如果判斷的具體數值不多,而是符合byte,short,int,char,字串。這五種型別。雖然兩個語句都可以使用,建議使用switch語句,因為效率稍高。其他情況,對區間判斷,對結果為boolean型別判斷,使用if,if的使用範圍更廣。whi...