2016-06-18 3 views
2

Я новичок в программировании драйвера ядра и хотел бы понять несколько аспектов.Описание параметров devm_kzalloc и использование

В приведенном ниже коде из 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)?

ответ

2

1) Да, ядро ​​заполнит эту структуру для вас, а затем передаст ее функции probe для выполнения инициализации.

2) Короче говоря, весь набор функций devm_ привяжет жизненный цикл возвращаемого ресурса к жизненному циклу фактического устройства. Поэтому любые возвращенные ресурсы будут автоматически очищены, если указанное устройство не проверено.

3) Возможно, да, хотя оператор sizeof будет следовать определению i2c, так что это фактически в основном то же самое, что и sizeof(struct ocores_i2c).

+0

Я бы порекомендовал расширить ваш ответ. 1. Начальник темы должен понимать, в какое время происходит * создание устройства * и * вставка драйвера * и какая разница между ними. 2. Фактический указатель 'struct device * dev' используется как указатель на * хранилище * ресурсов. Лучше посмотреть на код devres API. 3. Наверное, нет, поскольку он более гибкий, если вы меняете структуру (и меньше символов на тип!). Тем не менее оба пути имеют минусы. – 0andriy

+0

1 & 2: Спасибо за конформацию. Для 3. Я просмотрел число других драйверов и пришел к выводу, что sizeof (* i2c) и sizeof (struct ocores_i2c) одинаковы/похожи. Было бы полезно понять, почему sizeof (* i2c) является предпочтительным (помимо меньшего количества символов для типа). Энди, когда вы говорите, что измените свою структуру, вы имеете в виду изменить ее на совершенно другую структуру или просто добавить дополнительных членов в структуру? если его позже мы все равно можем использовать sizeof (struct i2c) правильно? – dee

+0

Я закончил работу с моим драйвером и напечатал значения. 'sizeof (* i2c) = 976 sizeof (i2c) = 8'. Надеюсь, это поможет другим, если они наткнутся на это – dee