[linux device driver] Chapter 03:字符设备注册学习

来源:互联网 发布:unix如何安装ubuntu 编辑:程序博客网 时间:2024/05/06 02:20

从函数scullc_init中学习register_chrdev_region,进而进入到__register_chrdev_region,主要还是研究__register_chrdev_region这个函数。

__register_chrdev_region:

从上面可以看出,__register_chrdev_region完成的工作主要有三个步骤:

1. 分配出一个char_device_struct 结构,使用对应的入参赋值。

2.从chrdevs上找到对应的major号的chrdevs[major],然后从这个散列表中一级一级往下查找对应的minor号,最近将已经分配好的char_device_struct挂载到chrdevs全局变量中。

值得注意的是__register_chrdev_region的这个部分:

for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)if ((*cp)->major > major ||    ((*cp)->major == major && (*cp)->baseminor >= baseminor))break;if (*cp && (*cp)->major == major &&    (*cp)->baseminor < baseminor + minorct) {ret = -EBUSY;goto out;}cd->next = *cp;*cp = cd;

这段代码的主要作用是从chrdevs[i]

chrdevs是一个255个char_device_struct的数组指针:

static struct char_device_struct {struct char_device_struct *next;unsigned int major;unsigned int baseminor;int minorct;const char *name;struct file_operations *fops;struct cdev *cdev;/* will die */} *chrdevs[MAX_PROBE_HASH];
它是一个散列表,取得i项chardevs后,函数不停的判断(*cp)->major是否大于或者是等于且baseminor也大于等于baseminor,这样最后在正常情况下会因为*cp=null而退出,从而cd->next = null,而*cp=cd,将cd挂载到*cd上,其实也就是chrdevs下的某一项。相对来说介绍详细的文章是这个:http://blog.csdn.net/yel617/article/details/5627505

0 0
原创粉丝点击