2024年6月9日发(作者:)

一)驱动注册open函数都干了些什么?

二)register_chrdev -> cdev_add -> kobj_map

三)file: fs/char_dev.c

四)int register_chrdev(unsigned int major, const char *name,

五)const struct file_operations *fops)

六){

七)struct char_device_struct *cd;

八)struct cdev *cdev;

九)char *s;

十)int err = -ENOMEM;

十一)cd = __register_chrdev_region(major, 0, 256, name);

十二)if (IS_ERR(cd))

十三)return PTR_ERR(cd);

十四)cdev = cdev_alloc();

十五)if (!cdev)

十六)goto out2;

十七)cdev->owner = fops->owner;

十八)cdev->ops = fops; // 注意,在后面的 chrdev_open会从cdev再得到

fops

十九)...

二十)}

二十一)file: fs/char_dev.c

二十二)int cdev_add(struct cdev *p, dev_t dev, unsigned count)

二十三){

二十四)p->dev = dev;

二十五)p->count = count;

二十六)return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);

二十七)}

二十八)file: fs/char_dev.c

二十九)static struct kobject *exact_match(dev_t dev, int *part, void *data)