miscdevice 在本质上任然是字符设备,只是被增加了以层封装而已,因此其驱动的主体工作还是file_operations的成员函数。
对于miscdevice 的注册和注销分别通过如下两个API完成:
int misc_register(struct miscdevice *misc)
int misc_deregister(struct miscdevice *misc)
/*misc设备注册的时候发生了什么?*/
------------------------------------------------------------------------
misc_register(&led_misc);
/*1.给我们寻找一个次设备号*/
if (misc->minor == MISC_DYNAMIC_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);
/*2.加入到链表中*/
list_add(&misc->list, &misc_list);
/*misc设备向上注册字符设备驱动的过程*/
-----------------------------------------------------------------------------
static int __init misc_init(void)
misc_class = class_create(THIS_MODULE, "misc");
if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) /*向内核注册字符设备驱动*/
关于misc_fops结构体:
------------------------------------------------------------------------------
static const struct file_operations misc_fops = {
.owner = THIS_MODULE,
.open = misc_open,
};
/*打开misc设备的时候发生了什么事情*/
------------------------------------------------------------------------------
static int misc_open(struct inode * inode, struct file * file)
int minor = iminor(inode); /*获取次设备号*/