ldd3 샘플 코드에서 파일 작업이 두 번 할당되는 이유는 무엇입니까?

ldd3 샘플 코드에서 파일 작업이 두 번 할당되는 이유는 무엇입니까?

https://github.com/martinezjavier/ldd3/blob/master/scull/main.c#L601

static void scull_setup_cdev(struct scull_dev *dev, int index)
{
    int err, devno = MKDEV(scull_major, scull_minor + index);

    cdev_init(&dev->cdev, &scull_fops); 
    dev->cdev.owner = THIS_MODULE;
    dev->cdev.ops = &scull_fops;

합계가 두 번 할당된 것을 볼 수 있습니다 scull_fops. 이유는 무엇입니까?cdev_init()cdev.ops

답변1

scull_fops아니요분산두 번, 즉사용된두 배. 그것은한정된 같은 파일의 다른 곳, 그 주소는 에 전달되고 cdev_init에 할당됩니다 dev->cdev.ops.

당신이 언급한 것처럼 to에 대한 명시적인 할당은 dev->cdev.ops불필요합니다 cdev_init. ~처럼존 마이링 설명하다, 이는 LDD3 예제 코드의 비효율성입니다. 예제 코드는 의 해당 줄보다 최신이므로 cdev_init작성 시 불필요했습니다. (동일한 버그가 다른 곳에서도 재현되는지 확인하고 얼마나 많은 "실제" 드라이버 코드가 LDD3 예제를 기반으로 하는지 확인하는 것은 흥미로울 것입니다!)

이 기능은 다음과 같이 단순화될 수 있습니다.

static void scull_setup_cdev(struct scull_dev *dev, int index)
{
    int err, devno = MKDEV(scull_major, scull_minor + index);

    cdev_init(&dev->cdev, &scull_fops);
    dev->cdev.owner = THIS_MODULE;
    err = cdev_add (&dev->cdev, devno, 1);
    /* Fail gracefully if need be */
    if (err)
        printk(KERN_NOTICE "Error %d adding scull%d", err, index);
}

답변2

두 번 실행되었는지 확인하려면 다음 링크를 참조하세요.

https://github.com/torvalds/linux/blob/6f0d349d922ba44e4348a17a78ea51b7135965b1/fs/char_dev.c#L656

void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
  memset(cdev, 0, sizeof *cdev);
  INIT_LIST_HEAD(&cdev->list);
  kobject_init(&cdev->kobj, &ktype_cdev_default);
  cdev->ops = fops;
}

관련 정보