Linux 中字元裝置的註冊

2021-09-05 03:42:51 字數 2582 閱讀 1117

linux中字元裝置的註冊過程是比較簡單的。我們通常可以呼叫misc_register()函式來註冊乙個字元裝置。misc裝置是一種字元裝置,通過該裝置可以將fops請求**給註冊的misc裝置,從而實現字元裝置的功能。使用者呼叫該介面註冊misc字元裝置時,可以動態分配裝置minor號,當獲取minor號之後呼叫class_******_device_add()或者device_create()函式完成字元裝置的建立。misc字元裝置註冊函式如下所示:

int misc_register(struct miscdevice * misc)  

}  if (misc->

minor == misc_dynamic_minor)   

misc->

minor = i;  

}  if (misc->minor <

dynamic_minors)  

misc_minors[misc->minor >

> 3] |= 1 <

< (misc->minor & 7);  

dev = mkdev(misc_major, misc->minor);  

misc->

this_device = device_create(misc_class, misc->parent, dev,  

"%s", misc->name);        //建立字元裝置(misc裝置)  

if (is_err(misc->this_device))   

/*  

* add it to the front, so that later devices can "override"  

* earlier defaults  

*/  

list_add(&misc->list, &misc_list);  //將裝置儲存至misc裝置鏈中,裝置訪問時需要操作該鍊錶  

out:  

mutex_unlock(&misc_mtx);  

return err;  } 

需要注意的是2.6.12核心中建立系統裝置時需要呼叫******_device的介面class_******_device_add()。在2.6.23中需要呼叫device_create()函式完成裝置註冊。在3.2核心中,******_device的介面已經不存在了,所以必須呼叫device_create函式,另外,3.2核心不支援具有相同minor號的字元裝置,在2.6.x核心中是支援的。

系統是如何完成fops函式呼叫的呢?回答這個問題需要分析misc裝置開啟過程。在開啟misc裝置驅動的時候,misc裝置驅動會根據訪問裝置的minor號重定向fops函式集,該程式說明如下:

static int misc_open(struct inode * inode, struct file * file)  

}  if (!new_fops)   

}  if (!new_fops)  

goto fail;  

}  err = 0;  

old_fops = file->f_op;  

file->

f_op = new_fops;  //重定向fops函式  

if (file->f_op->open)   

}  fops_put(old_fops);  

fail:  

mutex_unlock(&misc_mtx);  

return err;  } 

很多時候我們不想建立misc字元裝置,想要自己建立乙個字元裝置類,然後再建立該裝置類的字元裝置,那麼整個建立過程可以描述如下:

1,呼叫register_chrdev_region函式註冊裝置號區間

2,呼叫cdev_alloc函式分配乙個字元裝置

3,呼叫cdev_add函式新增核心字元裝置

4,呼叫device_create函式通知udev建立裝置節點,並且註冊到sysfs中。

register_chrdev_region函式用來分配裝置號。在linux系統中維護了乙個char_device的hash表,每個major占用乙個hash項。通過register_chrdev_region函式就是向全域性的char_device hash表註冊裝置號。該函式說明如下:

int register_chrdev_region(dev_t from, unsigned count, const char *name)  

return 0;  

fail:  

to = n;  

for (n = from; n <

to; n = next)   

return ptr_err(cd);  } 

當裝置號區間分配完成之後,通過cdev_alloc()函式分配乙個核心字元裝置,然後通過cdev_add函式將該字元裝置註冊到核心cdev_map->probes陣列中,至此,核心的字元裝置建立完畢。但是,此時,應用層還無法看到字元裝置節點,因此,可以呼叫device_create函式通知udev去建立裝置節點,並且將裝置新增到sysfs系統樹中。至此,應用層可以通過裝置節點訪問字元裝置了。

字元裝置是linux中最簡單的一種裝置,其系統註冊過程也相對比較簡單。

Linux字元裝置驅動的註冊

很多學習linux程式設計的新人都會被字元裝置註冊搞糊塗了,我剛開始也一樣糊里糊塗的,看到網上例程有各種版本,就是呼叫module init時傳遞的實參,先記為 init 大家可能還會看到雜項裝置驅動misc register 平台裝置驅動platform device register 但是作為l...

linux註冊字元裝置和解除安裝字元裝置函式

註冊乙個字元裝置的方法是使用 int register chrdev unsigned int major,const char name,struct file operations fops 這裡,major 是感興趣的主編號,name 是驅動的名子 出現在 proc devices fops ...

字元裝置的註冊

核心中每個字元裝置都對應乙個 cdev 結構的變數,下面是它的定義 struct cdev 乙個 cdev 一般它有兩種定義初始化方式 靜態的和動態的。靜態記憶體定義初始化 struct cdev my cdev cdev init my cdev,fops my cdev.owner this m...