explain devm_kzalloc parameters and usage
我是内核驱动程序编程的新手,并且想了解几个方面。
在以下来自http://lxr.free-electrons.com/source/drivers/i2c/busses/i2c-ocores.c?v=3.19的代码中
1 2 3 4 5
| static int ocores_i2c_probe(struct platform_device *pdev)
{
struct ocores_i2c *i2c;
i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
} |
pdev是指向平台设备的指针。初始化平台设备时,已经创建了pdev指向的结构的内容,驱动程序核心会将这些信息传递给此探测功能。 ??这与pci dev结构相同,在该结构中,驱动程序核心正在传递在探测期间标识的pci_dev以供驱动程序使用?我的理解正确吗?
我不清楚devm_kzalloc的参数。第763行http://lxr.free-electrons.com/source/drivers/base/devres.c?v=3.19#L774是"为其分配内存的设备"是什么意思?最终,我们只需要在大小为struct ocores_i2c的内核中分配内存。是否将第一个参数用作跟踪机制以稍后自动释放它(基于阅读devres内核文档)?
devm_kzalloc的返回值是指向内核中新分配的大小为ocores_i2c的内存的指针。如果是这种情况,devm_kzalloc的第二个参数是否应该是sizeof(struct ocores_i2c)而不是sizeof(* i2c)?
1)是的,内核将为您填充此结构,然后将其传递给您的probe函数以执行初始化。
2)简而言之,所有devm_函数套件都将返回资源的生命周期与实际设备的生命周期联系在一起。 因此,当取消探测指定的设备时,将自动清除所有返回的资源。
3)可能是的,尽管sizeof运算符将遵循i2c的定义,所以实际上与sizeof(struct ocores_i2c)基本上相同。
-
我建议扩大您的答案。 1.主题入门者应该了解何时创建设备和驱动程序附件以及它们之间的区别。 2.实际的struct device *dev指针用作资源存储的指针。最好看看devres API的代码。 3.可能不是,因为这样可以更灵活地更改结构(键入的字符更少!)。但是,两种方法都有缺点。
-
1&2:感谢您的确认。对于3。我查看了其他驱动程序的数量,得出的结论是sizeof(* i2c)和sizeof(struct ocores_i2c)是相同/相似。了解为什么首选sizeof(* i2c)(除了要键入的字符较少)会有所帮助。安迪,当您说更改结构时,是指将其更改为完全不同的结构,还是仅向结构中添加其他成员?如果稍后我们仍然可以使用sizeof(struct i2c)对吗?
-
我最终执行了驱动程序并打印了值。 sizeof(*i2c)=976 sizeof(i2c)=8。希望这对其他人有帮助的人有所帮助
-
@dee-是的,因为sizeof(*i2c)跟随指针并显示struct ocores_i2c的大小,而sizeof(i2c)是指针的大小。