歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux 中字符設備的注冊

Linux 中字符設備的注冊

日期:2017/3/1 10:02:42   编辑:Linux編程

Linux中字符設備的注冊過程是比較簡單的。我們通常可以調用misc_register()函數來注冊一個字符設備。Misc設備是一種字符設備,通過該設備可以將fops請求轉發給注冊的misc設備,從而實現字符設備的功能。用戶調用該接口注冊Misc字符設備時,可以動態分配設備Minor號,當獲取Minor號之後調用class_simple_device_add()或者device_create()函數完成字符設備的創建。Misc字符設備注冊函數如下所示:

int misc_register(struct miscdevice * misc)
{
struct miscdevice *c;
dev_t dev;
int err = 0;

INIT_LIST_HEAD(&misc->list);

mutex_lock(&misc_mtx); //獲取misc設備信號量
list_for_each_entry(c, &misc_list, list) { //檢查設備是否已經存在
if (c->minor == misc->minor) {
mutex_unlock(&misc_mtx);
return -EBUSY; //如果設備存在,直接返回
}
}

if (misc->minor == MISC_DYNAMIC_MINOR) { //動態分配分配minor號
int i = DYNAMIC_MINORS;
while (--i >= 0)
if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
break;
if (i<0) {
mutex_unlock(&misc_mtx);
return -EBUSY;
}
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)) {
err = PTR_ERR(misc->this_device);
goto out;
}

/*
* 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;
}

Copyright © Linux教程網 All Rights Reserved