在书Linux Device Drivers (third edition)中,他们说:
分配和初始化其中一种方法有两种方法 结构。如果您希望获得独立的cdev结构 运行时,您可以使用以下代码执行此操作:
struct cdev * my_cdev = cdev_alloc();
my_cdev-> ops =& my_fops;
然而,您可能希望嵌入cdev结构 在您自己的设备特定结构内;这就是scull 确实。在这种情况下,您应该初始化您拥有的结构 已经分配:
void cdev_init(struct cdev * cdev,struct file_operations * fops);
我不明白第二部分。即使我们在特定于设备的结构中有cdev结构,为什么我们不能使用第一种方法进行初始化?
例如,如果我有自己的设备特定结构foo_dev,而my_cdev是其中的一部分,
struct foo_dev my_foo_dev{
cdev* my_cdev;
...
}
为什么我不能只使用
my_foo_dev->my_cdev = cdev_alloc( );
my_foo_dev->my_cdev->ops = &my_fops;
?
具体来说,我们不是只使用赋值来初始化cdev结构的各个成员,而不是使用cdev_init()函数吗?或者cdev_init()执行任何额外的任务?
答案 0 :(得分:3)
cdev_alloc
分配一个新的struct cdev
对象并返回指向它的指针。
cdev_init
初始化由您分配的现有未初始化struct cdev
。
实际上,cdev_alloc
相当于:
struct cdev* p = malloc(sizeof(struct cdev));
cdev_init(p, opts);