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;
}