Я новичок в программировании драйвера ядра и хотел бы понять несколько аспектов.Описание параметров 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);
}
- 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. Начальник темы должен понимать, в какое время происходит * создание устройства * и * вставка драйвера * и какая разница между ними. 2. Фактический указатель 'struct device * dev' используется как указатель на * хранилище * ресурсов. Лучше посмотреть на код devres API. 3. Наверное, нет, поскольку он более гибкий, если вы меняете структуру (и меньше символов на тип!). Тем не менее оба пути имеют минусы. – 0andriy
1 & 2: Спасибо за конформацию. Для 3. Я просмотрел число других драйверов и пришел к выводу, что sizeof (* i2c) и sizeof (struct ocores_i2c) одинаковы/похожи. Было бы полезно понять, почему sizeof (* i2c) является предпочтительным (помимо меньшего количества символов для типа). Энди, когда вы говорите, что измените свою структуру, вы имеете в виду изменить ее на совершенно другую структуру или просто добавить дополнительных членов в структуру? если его позже мы все равно можем использовать sizeof (struct i2c) правильно? – dee
Я закончил работу с моим драйвером и напечатал значения. 'sizeof (* i2c) = 976 sizeof (i2c) = 8'. Надеюсь, это поможет другим, если они наткнутся на это – dee