*参照元 [#q45d85cf] #backlinks *説明 [#we3e1abe] -パス: [[linux-4.4.1/fs/char_dev.c]] -FIXME: これは何? --説明 **引数 [#ta6e64a9] -unsigned int major -- -unsigned int baseminor -- -unsigned int count -- -const char *name -- -const struct file_operations *fops -- --[[linux-4.4.1/file_operations]] **返り値 [#a307ffb7] -int -- **参考 [#adf5c706] *実装 [#c7f0595f] /** * __register_chrdev() - create and register a cdev occupying a range of minors * @major: major device number or 0 for dynamic allocation * @baseminor: first of the requested range of minor numbers * @count: the number of minor numbers required * @name: name of this range of devices * @fops: file operations associated with this devices * * If @major == 0 this functions will dynamically allocate a major and return * its number. * * If @major > 0 this function will attempt to reserve a device with the given * major number and will return zero on success. * * Returns a -ve errno on failure. * * The name of this device has nothing to do with the name of the device in * /dev. It only helps to keep track of the different owners of devices. If * your module name has only one type of devices it's ok to use e.g. the name * of the module here. */ int __register_chrdev(unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops) { struct char_device_struct *cd; struct cdev *cdev; int err = -ENOMEM; - --[[linux-4.4.1/char_device_struct]] --[[linux-4.4.1/cdev]] cd = __register_chrdev_region(major, baseminor, count, name); if (IS_ERR(cd)) return PTR_ERR(cd); - --[[linux-4.4.1/__register_chrdev_region()]] --[[linux-4.4.1/IS_ERR()]] --[[linux-4.4.1/PTR_ERR()]] cdev = cdev_alloc(); if (!cdev) goto out2; - --[[linux-4.4.1/cdev_alloc()]] cdev->owner = fops->owner; cdev->ops = fops; kobject_set_name(&cdev->kobj, "%s", name); - --[[linux-4.4.1/kobject_set_name()]] err = cdev_add(cdev, MKDEV(cd->major, baseminor), count); if (err) goto out; - --[[linux-4.4.1/cdev_add()]] --[[linux-4.4.1/MKDEV()]] cd->cdev = cdev; return major ? 0 : cd->major; out: kobject_put(&cdev->kobj); - --[[linux-4.4.1/kobject_put()]] out2: kfree(__unregister_chrdev_region(cd->major, baseminor, count)); return err; - --[[linux-4.4.1/kfree()]] --[[linux-4.4.1/__unregister_chrdev_region()]] } *コメント [#a2039537]