解释devm_kzalloc参数和用法

时间:2016-06-18 20:52:14

标签: c linux-device-driver kernel-module kmalloc

我是内核驱动程序编程的新手,想了解几个方面。

来自http://lxr.free-electrons.com/source/drivers/i2c/busses/i2c-ocores.c?v=3.19

的以下代码
static int ocores_i2c_probe(struct platform_device *pdev)
{
   struct ocores_i2c *i2c;
    i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
}
  1. pdev是指向平台设备的指针。当平台设备初始化并且驱动程序核心将该信息传递给此探测函数时,已经创建了pdev指向的结构的内容。 ??这与pci dev结构相同,其中驱动程序核心正在通过在探测期间识别的pci_dev以供驱动程序使用?我的理解是对的吗?
  2. 我不清楚devm_kzalloc的参数。什么“为内存分配设备”是指第763行http://lxr.free-electrons.com/source/drivers/base/devres.c?v=3.19#L774?在一天结束时,我们只需要在大小为struct ocores_i2c的内核中分配内存。第一个参数是否用作跟踪机制以便以后自动释放它(基于阅读devres内核文档)?
  3. devm_kzalloc的返回值是指向内核中新分配的大小为ocores_i2c的内存的指针。如果是这种情况,devm_kzalloc的第二个参数不应该是sizeof(struct ocores_i2c)而不是sizeof(* i2c)?

1 个答案:

答案 0 :(得分:2)

1)是的,内核会为您填写此结构,然后将其传递给您的probe函数以执行初始化。

2)简而言之,所有devm_函数套件都会将返回资源的生命周期与实际设备的生命周期联系起来。因此,当未探测指定的设备时,将自动清除任何返回的资源。

3)可能是的,虽然sizeof运算符会遵循i2c的定义,所以这实际上与sizeof(struct ocores_i2c)基本相同。